mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
backward compatibility with Python 2.7
This commit is contained in:
parent
6296ed0a4e
commit
7926a5fa7b
@ -329,6 +329,7 @@ bool InterfaceMakerPythonNative::
|
|||||||
get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) {
|
get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) {
|
||||||
def._answer_location = string();
|
def._answer_location = string();
|
||||||
def._wrapper_type = WT_none;
|
def._wrapper_type = WT_none;
|
||||||
|
def._min_version = 0;
|
||||||
|
|
||||||
string method_name = func->_ifunc.get_name();
|
string method_name = func->_ifunc.get_name();
|
||||||
bool is_unary_op = func->_ifunc.is_unary_op();
|
bool is_unary_op = func->_ifunc.is_unary_op();
|
||||||
@ -408,54 +409,63 @@ get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) {
|
|||||||
if (method_name == "operator +=") {
|
if (method_name == "operator +=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_add";
|
def._answer_location = "tp_as_number->nb_inplace_add";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator -=") {
|
if (method_name == "operator -=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_subtract";
|
def._answer_location = "tp_as_number->nb_inplace_subtract";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator *=") {
|
if (method_name == "operator *=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_multiply";
|
def._answer_location = "tp_as_number->nb_inplace_multiply";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator /=") {
|
if (method_name == "operator /=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_divide";
|
def._answer_location = "tp_as_number->nb_inplace_divide";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator %=") {
|
if (method_name == "operator %=") {
|
||||||
def._answer_location = ".tp_as_number->nb_inplace_remainder";
|
def._answer_location = ".tp_as_number->nb_inplace_remainder";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator <<=") {
|
if (method_name == "operator <<=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_lshift";
|
def._answer_location = "tp_as_number->nb_inplace_lshift";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator >>=") {
|
if (method_name == "operator >>=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_rshift";
|
def._answer_location = "tp_as_number->nb_inplace_rshift";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator &=") {
|
if (method_name == "operator &=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_and";
|
def._answer_location = "tp_as_number->nb_inplace_and";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "operator ^=") {
|
if (method_name == "operator ^=") {
|
||||||
def._answer_location = "tp_as_number->nb_inplace_xor";
|
def._answer_location = "tp_as_number->nb_inplace_xor";
|
||||||
def._wrapper_type = WT_one_param;
|
def._wrapper_type = WT_one_param;
|
||||||
|
def._min_version = 0x02000000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,12 +549,14 @@ get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def) {
|
|||||||
if (method_name == "__getbuffer__") {
|
if (method_name == "__getbuffer__") {
|
||||||
def._answer_location = "tp_as_buffer->bf_getbuffer";
|
def._answer_location = "tp_as_buffer->bf_getbuffer";
|
||||||
def._wrapper_type = WT_getbuffer;
|
def._wrapper_type = WT_getbuffer;
|
||||||
|
def._min_version = 0x02060000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_name == "__releasebuffer__") {
|
if (method_name == "__releasebuffer__") {
|
||||||
def._answer_location = "tp_as_buffer->bf_releasebuffer";
|
def._answer_location = "tp_as_buffer->bf_releasebuffer";
|
||||||
def._wrapper_type = WT_releasebuffer;
|
def._wrapper_type = WT_releasebuffer;
|
||||||
|
def._min_version = 0x02060000;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1211,8 +1223,7 @@ write_module_class(ostream &out, Object *obj) {
|
|||||||
out << "PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n";
|
out << "PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n";
|
||||||
|
|
||||||
std::map<int, Function *> static_functions;
|
std::map<int, Function *> static_functions;
|
||||||
std::map<Function *, std::string> normal_Operator_functions;
|
std::map<Function *, SlottedFunctionDef> slotted_functions;
|
||||||
std::map<Function *, SlottedFunctionDef> wraped_Operator_functions;
|
|
||||||
// function Table
|
// function Table
|
||||||
bool got_copy = false;
|
bool got_copy = false;
|
||||||
bool got_deepcopy = false;
|
bool got_deepcopy = false;
|
||||||
@ -1244,13 +1255,8 @@ write_module_class(ostream &out, Object *obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SlottedFunctionDef slotted_def;
|
SlottedFunctionDef slotted_def;
|
||||||
if (!get_slotted_function_def(obj, func, slotted_def)) {
|
if (get_slotted_function_def(obj, func, slotted_def)) {
|
||||||
|
slotted_functions[func] = slotted_def;
|
||||||
} else if (slotted_def._wrapper_type != WT_none) {
|
|
||||||
wraped_Operator_functions[func] = slotted_def;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
normal_Operator_functions[func] = slotted_def._answer_location;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1321,8 +1327,8 @@ write_module_class(ostream &out, Object *obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::map<Function *, SlottedFunctionDef>::iterator rfi; // wraped_Operator_functions;
|
std::map<Function *, SlottedFunctionDef>::iterator rfi; // slotted_functions;
|
||||||
for (rfi = wraped_Operator_functions.begin(); rfi != wraped_Operator_functions.end(); rfi++) {
|
for (rfi = slotted_functions.begin(); rfi != slotted_functions.end(); rfi++) {
|
||||||
switch (rfi->second._wrapper_type) {
|
switch (rfi->second._wrapper_type) {
|
||||||
case WT_no_params:
|
case WT_no_params:
|
||||||
// PyObject *func(PyObject *self)
|
// PyObject *func(PyObject *self)
|
||||||
@ -1878,7 +1884,9 @@ write_module_class(ostream &out, Object *obj) {
|
|||||||
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_ITER;\n";
|
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_ITER;\n";
|
||||||
}
|
}
|
||||||
if (has_local_getbuffer) {
|
if (has_local_getbuffer) {
|
||||||
|
out << "#if PY_VERSION_HEX >= 0x02060000\n";
|
||||||
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;\n";
|
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;\n";
|
||||||
|
out << "#endif";
|
||||||
}
|
}
|
||||||
|
|
||||||
// add bases///
|
// add bases///
|
||||||
@ -1899,23 +1907,37 @@ write_module_class(ostream &out, Object *obj) {
|
|||||||
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_dict = PyDict_New();\n";
|
out << " Dtool_" << ClassName << ".As_PyTypeObject().tp_dict = PyDict_New();\n";
|
||||||
out << " PyDict_SetItemString(Dtool_" <<ClassName << ".As_PyTypeObject().tp_dict, \"DtoolClassDict\", Dtool_" <<ClassName << ".As_PyTypeObject().tp_dict);\n";
|
out << " PyDict_SetItemString(Dtool_" <<ClassName << ".As_PyTypeObject().tp_dict, \"DtoolClassDict\", Dtool_" <<ClassName << ".As_PyTypeObject().tp_dict);\n";
|
||||||
|
|
||||||
// the standard call functions
|
// Now assign the slotted function definitions.
|
||||||
std::map<Function *, std::string >::iterator ofi;
|
std::map<Function *, SlottedFunctionDef>::const_iterator rfi;
|
||||||
for (ofi = normal_Operator_functions.begin(); ofi != normal_Operator_functions.end(); ofi++) {
|
int prev_min_version = 0;
|
||||||
Function *func = ofi->first;
|
|
||||||
out << " // " << ofi->second << " = " << methodNameFromCppName(func, export_class_name, false) << "\n";
|
|
||||||
out << " Dtool_" << ClassName << ".As_PyTypeObject()." << ofi->second << " = &" << func->_name << ";\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for (rfi = slotted_functions.begin(); rfi != slotted_functions.end(); rfi++) {
|
||||||
|
Function *func = rfi->first;
|
||||||
|
const SlottedFunctionDef &def = rfi->second;
|
||||||
|
|
||||||
// wrapped functions...
|
// Add an #ifdef if there is a specific version requirement on this function.
|
||||||
{
|
if (def._min_version != prev_min_version) {
|
||||||
std::map<Function *, SlottedFunctionDef>::iterator rfi; // wraped_Operator_functions;
|
if (prev_min_version > 0) {
|
||||||
for (rfi = wraped_Operator_functions.begin(); rfi != wraped_Operator_functions.end(); rfi++) {
|
out << "#endif\n";
|
||||||
Function *func = rfi->first;
|
}
|
||||||
out << " // " << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n";
|
prev_min_version = def._min_version;
|
||||||
out << " Dtool_" << ClassName << ".As_PyTypeObject()." << rfi->second._answer_location << " = &" << func->_name << methodNameFromCppName(func, export_class_name, false) << ";\n";
|
if (def._min_version > 0) {
|
||||||
|
out << "#if PY_VERSION_HEX >= 0x" << hex << def._min_version << dec << "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out << " // " << rfi->second._answer_location << " = " << methodNameFromCppName(func, export_class_name, false) << "\n";
|
||||||
|
|
||||||
|
if (def._wrapper_type == WT_none) {
|
||||||
|
// Bound directly, without wrapper.
|
||||||
|
out << " Dtool_" << ClassName << ".As_PyTypeObject()." << def._answer_location << " = &" << func->_name << ";\n";
|
||||||
|
} else {
|
||||||
|
// Assign to the wrapper method that was generated earlier.
|
||||||
|
out << " Dtool_" << ClassName << ".As_PyTypeObject()." << def._answer_location << " = &" << func->_name << methodNameFromCppName(func, export_class_name, false) << ";\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (prev_min_version > 0) {
|
||||||
|
out << "#endif\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// compare and hash work together in PY inherit behavior hmm grrr
|
// compare and hash work together in PY inherit behavior hmm grrr
|
||||||
|
@ -82,6 +82,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
string _answer_location;
|
string _answer_location;
|
||||||
WrapperType _wrapper_type;
|
WrapperType _wrapper_type;
|
||||||
|
int _min_version;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def);
|
static bool get_slotted_function_def(Object *obj, Function *func, SlottedFunctionDef &def);
|
||||||
|
@ -252,144 +252,13 @@ struct Dtool_PyTypedObject {
|
|||||||
Dtool_InitNoCoerce_##CLASS_NAME \
|
Dtool_InitNoCoerce_##CLASS_NAME \
|
||||||
};
|
};
|
||||||
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
#define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \
|
#define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \
|
||||||
static PyNumberMethods Dtool_PyNumberMethods_##CLASS_NAME = \
|
static PyNumberMethods Dtool_PyNumberMethods_##CLASS_NAME = {0}; \
|
||||||
{ \
|
static PySequenceMethods Dtool_PySequenceMethods_##CLASS_NAME = {0}; \
|
||||||
0,/*binaryfunc nb_add*/ \
|
static PyMappingMethods Dtool_PyMappingMethods_##CLASS_NAME = {0}; \
|
||||||
0,/*binaryfunc nb_subtract*/ \
|
static PyBufferProcs Dtool_PyBufferProcs_##CLASS_NAME = {0}; \
|
||||||
0,/*binaryfunc nb_multiply*/ \
|
|
||||||
0,/*binaryfunc nb_remainder*/ \
|
|
||||||
0,/*binaryfunc nb_divmod*/ \
|
|
||||||
0,/*ternaryfunc nb_power*/ \
|
|
||||||
0,/*unaryfunc nb_negative*/ \
|
|
||||||
0,/*unaryfunc nb_positive*/ \
|
|
||||||
0,/*unaryfunc nb_absolute*/ \
|
|
||||||
0,/*inquiry nb_bool*/ \
|
|
||||||
0,/*unaryfunc nb_invert*/ \
|
|
||||||
0,/*binaryfunc nb_lshift*/ \
|
|
||||||
0,/*binaryfunc nb_rshift*/ \
|
|
||||||
0,/*binaryfunc nb_and*/ \
|
|
||||||
0,/*binaryfunc nb_xor*/ \
|
|
||||||
0,/*binaryfunc nb_or*/ \
|
|
||||||
0,/*unaryfunc nb_int*/ \
|
|
||||||
0,/*void *nb_reserved*/ \
|
|
||||||
0,/*unaryfunc nb_float*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_add*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_subtract*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_multiply*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_remainder*/ \
|
|
||||||
0,/*ternaryfunc nb_inplace_power*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_lshift*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_rshift*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_and*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_xor*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_or*/ \
|
|
||||||
0,/*binaryfunc nb_floor_divide*/ \
|
|
||||||
0,/*binaryfunc nb_true_divide*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_floor_divide*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_true_divide*/ \
|
|
||||||
0,/*unaryfunc nb_index*/ \
|
|
||||||
}; \
|
|
||||||
static PySequenceMethods Dtool_PySequenceMethods_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*lenfunc sq_length */ \
|
|
||||||
0,/*binaryfunc sq_concat */ \
|
|
||||||
0,/*ssizeargfunc sq_repeat */ \
|
|
||||||
0,/*ssizeargfunc sq_item */ \
|
|
||||||
0,/*void *was_sq_slice */ \
|
|
||||||
0,/*ssizeargfunc sq_ass_item */ \
|
|
||||||
0,/*void *was_sq_ass_slice */ \
|
|
||||||
0,/*objobjproc sq_contains */ \
|
|
||||||
0,/*binaryfunc sq_inplace_concat */ \
|
|
||||||
0,/*ssizeargfunc sq_inplace_repeat */ \
|
|
||||||
}; \
|
|
||||||
static PyMappingMethods Dtool_PyMappingMethods_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*inquiry mp_length */ \
|
|
||||||
0,/*binaryfunc mp_subscript */ \
|
|
||||||
0,/*objobjargproc mp_ass_subscript */ \
|
|
||||||
}; \
|
|
||||||
static PyMappingMethods Dtool_PyBufferProcs_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*getbufferproc bf_getbuffer */ \
|
|
||||||
0,/*releasebufferproc bf_releasebuffer */ \
|
|
||||||
}; \
|
|
||||||
Define_Dtool_PyTypedObject(MODULE_NAME, CLASS_NAME, PUBLIC_NAME)
|
Define_Dtool_PyTypedObject(MODULE_NAME, CLASS_NAME, PUBLIC_NAME)
|
||||||
|
|
||||||
#else // Python 2:
|
|
||||||
|
|
||||||
#define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \
|
|
||||||
static PyNumberMethods Dtool_PyNumberMethods_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*binaryfunc nb_add*/ \
|
|
||||||
0,/*binaryfunc nb_subtract*/ \
|
|
||||||
0,/*binaryfunc nb_multiply*/ \
|
|
||||||
0,/*binaryfunc nb_divide*/ \
|
|
||||||
0,/*binaryfunc nb_remainder*/ \
|
|
||||||
0,/*binaryfunc nb_divmod*/ \
|
|
||||||
0,/*ternaryfunc nb_power*/ \
|
|
||||||
0,/*unaryfunc nb_negative*/ \
|
|
||||||
0,/*unaryfunc nb_positive*/ \
|
|
||||||
0,/*unaryfunc nb_absolute*/ \
|
|
||||||
0,/*inquiry nb_nonzero*/ \
|
|
||||||
0,/*unaryfunc nb_invert*/ \
|
|
||||||
0,/*binaryfunc nb_lshift*/ \
|
|
||||||
0,/*binaryfunc nb_rshift*/ \
|
|
||||||
0,/*binaryfunc nb_and*/ \
|
|
||||||
0,/*binaryfunc nb_xor*/ \
|
|
||||||
0,/*binaryfunc nb_or*/ \
|
|
||||||
0,/*coercion nb_coerce*/ \
|
|
||||||
0,/*unaryfunc nb_int*/ \
|
|
||||||
0,/*unaryfunc nb_long*/ \
|
|
||||||
0,/*unaryfunc nb_float*/ \
|
|
||||||
0,/*unaryfunc nb_oct*/ \
|
|
||||||
0,/*unaryfunc nb_hex*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_add*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_subtract*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_multiply*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_divide*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_remainder*/ \
|
|
||||||
0,/*ternaryfunc nb_inplace_power*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_lshift*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_rshift*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_and*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_xor*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_or*/ \
|
|
||||||
0,/*binaryfunc nb_floor_divide*/ \
|
|
||||||
0,/*binaryfunc nb_true_divide*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_floor_divide*/ \
|
|
||||||
0,/*binaryfunc nb_inplace_true_divide*/ \
|
|
||||||
}; \
|
|
||||||
static PySequenceMethods Dtool_PySequenceMethods_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*lenfunc sq_length */ \
|
|
||||||
0,/*binaryfunc sq_concat */ \
|
|
||||||
0,/*ssizeargfunc sq_repeat */ \
|
|
||||||
0,/*ssizeargfunc sq_item */ \
|
|
||||||
0,/*ssizeargfunc sq_ass_item */ \
|
|
||||||
0,/*objobjproc sq_contains */ \
|
|
||||||
0,/*binaryfunc sq_inplace_concat */ \
|
|
||||||
0,/*ssizeargfunc sq_inplace_repeat */ \
|
|
||||||
}; \
|
|
||||||
static PyMappingMethods Dtool_PyMappingMethods_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*inquiry mp_length */ \
|
|
||||||
0,/*binaryfunc mp_subscript */ \
|
|
||||||
0,/*objobjargproc mp_ass_subscript */ \
|
|
||||||
}; \
|
|
||||||
static PyBufferProcs Dtool_PyBufferProcs_##CLASS_NAME = \
|
|
||||||
{ \
|
|
||||||
0,/*readbufferproc bf_getreadbuffer */ \
|
|
||||||
0,/*writebufferproc bf_getwritebuffer */ \
|
|
||||||
0,/*segcountproc bf_getsegcount */ \
|
|
||||||
0,/*charbufferproc bf_getcharbuffer */ \
|
|
||||||
0,/*getbufferproc bf_getbuffer */ \
|
|
||||||
0,/*releasebufferproc bf_releasebuffer */ \
|
|
||||||
}; \
|
|
||||||
Define_Dtool_PyTypedObject(MODULE_NAME, CLASS_NAME, PUBLIC_NAME)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// The Fast Deallocator.. for Our instances..
|
// The Fast Deallocator.. for Our instances..
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user