31 #ifdef USE_DEBUG_PYTHON 35 #ifndef NO_RUNTIME_TYPES 37 #include "dtoolbase.h" 38 #include "typedObject.h" 39 #include "typeRegistry.h" 45 #if defined(HAVE_PYTHON) && !defined(CPPPARSER) 47 #ifdef _POSIX_C_SOURCE 48 #undef _POSIX_C_SOURCE 51 #define PY_SSIZE_T_CLEAN 1 54 #include "structmember.h" 56 #ifndef HAVE_LONG_LONG 57 #define PyLong_FromLongLong(x) PyLong_FromLong((long) (x)) 58 #define PyLong_FromUnsignedLongLong(x) PyLong_FromUnsignedLong((unsigned long) (x)) 59 #define PyLong_AsLongLong(x) PyLong_AsLong(x) 60 #define PyLong_AsUnsignedLongLong(x) PyLong_AsUnsignedLong(x) 61 #define PyLong_AsUnsignedLongLongMask(x) PyLong_AsUnsignedLongMask(x) 62 #define PyLong_AsLongLongAndOverflow(x) PyLong_AsLongAndOverflow(x) 65 #if PY_VERSION_HEX < 0x02050000 68 typedef int Py_ssize_t;
69 #define PyInt_FromSsize_t PyInt_FromLong 70 #define PyInt_AsSsize_t PyInt_AsLong 72 #endif // PY_VERSION_HEX 75 #ifndef Py_RETURN_NONE 76 inline PyObject* doPy_RETURN_NONE()
77 { Py_INCREF(Py_None);
return Py_None; }
78 #define Py_RETURN_NONE return doPy_RETURN_NONE() 81 #ifndef Py_RETURN_TRUE 82 inline PyObject* doPy_RETURN_TRUE()
83 {Py_INCREF(Py_True);
return Py_True;}
84 #define Py_RETURN_TRUE return doPy_RETURN_TRUE() 87 #ifndef Py_RETURN_FALSE 88 inline PyObject* doPy_RETURN_FALSE()
89 {Py_INCREF(Py_False);
return Py_False;}
90 #define Py_RETURN_FALSE return doPy_RETURN_FALSE() 93 #ifndef PyVarObject_HEAD_INIT 94 #define PyVarObject_HEAD_INIT(type, size) \ 95 PyObject_HEAD_INIT(type) size, 99 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) 102 #ifndef Py_TPFLAGS_CHECKTYPES 104 #define Py_TPFLAGS_CHECKTYPES 0 107 #if PY_MAJOR_VERSION >= 3 109 #define nb_nonzero nb_bool 110 #define nb_divide nb_true_divide 111 #define nb_inplace_divide nb_inplace_true_divide 113 #define PyLongOrInt_Check(x) PyLong_Check(x) 114 #define PyLongOrInt_FromSize_t PyLong_FromSize_t 115 #define PyLongOrInt_FromSsize_t PyLong_FromSsize_t 116 #define PyLongOrInt_FromLong PyLong_FromLong 117 #define PyLongOrInt_FromUnsignedLong PyLong_FromUnsignedLong 118 #define PyLongOrInt_AS_LONG PyLong_AS_LONG 119 #define PyInt_Check PyLong_Check 120 #define PyInt_AsLong PyLong_AsLong 121 #define PyInt_AS_LONG PyLong_AS_LONG 123 #define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x)) 125 #define PyLongOrInt_FromSize_t PyInt_FromSize_t 126 #define PyLongOrInt_FromSsize_t PyInt_FromSsize_t 127 #define PyLongOrInt_FromLong PyInt_FromLong 128 #define PyLongOrInt_AS_LONG PyInt_AsLong 131 typedef long Py_hash_t;
134 #if PY_MAJOR_VERSION >= 3 136 #undef _PyErr_OCCURRED 137 #define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) 140 #if PY_VERSION_HEX < 0x03030000 141 #define PyUnicode_AsUTF8 _PyUnicode_AsString 142 #define PyUnicode_AsUTF8AndSize _PyUnicode_AsStringAndSize 152 #if defined(_WIN32) && !defined(LINK_ALL_STATIC) 153 #define EXPORT_THIS __declspec(dllexport) 154 #define IMPORT_THIS extern __declspec(dllimport) 157 #define IMPORT_THIS extern 161 struct Dtool_PyTypedObject;
162 typedef std::map<int, Dtool_PyTypedObject *> RunTimeTypeDictionary;
163 typedef std::set<int> RunTimeTypeList;
165 EXPCL_DTOOLCONFIG RunTimeTypeDictionary &GetRunTimeDictionary();
166 EXPCL_DTOOLCONFIG RunTimeTypeList &GetRunTimeTypeList();
170 #define PY_PANDA_SIGNATURE 0xbeaf 171 typedef void *(*UpcastFunction)(PyObject *,Dtool_PyTypedObject *);
172 typedef void *(*DowncastFunction)(
void *, Dtool_PyTypedObject *);
181 struct Dtool_PyInstDef {
187 struct Dtool_PyTypedObject *_My_Type;
190 void *_ptr_to_object;
194 unsigned short _signature;
206 extern EXPCL_DTOOLCONFIG PyMemberDef standard_type_members[];
211 struct Dtool_PyTypedObject {
213 PyTypeObject _PyType;
216 UpcastFunction _Dtool_UpcastInterface;
217 DowncastFunction _Dtool_DowncastInterface;
223 inline PyTypeObject &As_PyTypeObject() {
return _PyType; };
224 inline PyObject &As_PyObject() {
return (PyObject &)_PyType; };
229 #define Define_Dtool_Class(MODULE_NAME, CLASS_NAME, PUBLIC_NAME) \ 230 extern Dtool_PyTypedObject Dtool_##CLASS_NAME; 235 #define Define_Dtool_new(CLASS_NAME,CNAME)\ 236 PyObject *Dtool_new_##CLASS_NAME(PyTypeObject *type, PyObject *args, PyObject *kwds) {\ 237 (void) args; (void) kwds;\ 238 PyObject *self = type->tp_alloc(type, 0);\ 239 ((Dtool_PyInstDef *)self)->_signature = PY_PANDA_SIGNATURE;\ 240 ((Dtool_PyInstDef *)self)->_My_Type = &Dtool_##CLASS_NAME;\ 254 #define Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ 255 static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ 256 Py_TYPE(self)->tp_free(self);\ 259 #define Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ 260 static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ 261 if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ 262 if (((Dtool_PyInstDef *)self)->_memory_rules) {\ 263 cerr << "Detected leak for " << #CLASS_NAME \ 264 << " which interrogate cannot delete.\n"; \ 267 Py_TYPE(self)->tp_free(self);\ 271 #define Define_Dtool_FreeInstance(CLASS_NAME,CNAME)\ 272 static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ 273 if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ 274 if (((Dtool_PyInstDef *)self)->_memory_rules) {\ 275 delete ((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ 278 Py_TYPE(self)->tp_free(self);\ 281 #define Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\ 282 static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ 283 if (((Dtool_PyInstDef *)self)->_ptr_to_object != NULL) {\ 284 if (((Dtool_PyInstDef *)self)->_memory_rules) {\ 285 unref_delete((CNAME *)((Dtool_PyInstDef *)self)->_ptr_to_object);\ 288 Py_TYPE(self)->tp_free(self);\ 291 #define Define_Dtool_Simple_FreeInstance(CLASS_NAME, CNAME)\ 292 static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ 293 ((Dtool_InstDef_##CLASS_NAME *)self)->_value.~##CLASS_NAME();\ 294 Py_TYPE(self)->tp_free(self);\ 300 EXPCL_DTOOLCONFIG
bool DtoolCanThisBeAPandaInstance(PyObject *
self);
310 EXPCL_DTOOLCONFIG
void RegisterRuntimeClass(Dtool_PyTypedObject *otype,
int class_id);
314 EXPCL_DTOOLCONFIG Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(
int type);
324 EXPCL_DTOOLCONFIG
void DTOOL_Call_ExtractThisPointerForType(PyObject *
self, Dtool_PyTypedObject * classdef,
void ** answer);
326 EXPCL_DTOOLCONFIG
void *DTOOL_Call_GetPointerThisClass(PyObject *
self, Dtool_PyTypedObject *classdef,
int param,
const string &function_name,
bool const_ok,
bool report_errors);
328 EXPCL_DTOOLCONFIG
void *DTOOL_Call_GetPointerThis(PyObject *
self);
330 EXPCL_DTOOLCONFIG
bool Dtool_Call_ExtractThisPointer(PyObject *
self, Dtool_PyTypedObject &classdef,
void **answer);
332 EXPCL_DTOOLCONFIG
bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *
self, Dtool_PyTypedObject &classdef,
333 void **answer,
const char *method_name);
335 template<
class T> INLINE
bool DTOOL_Call_ExtractThisPointer(PyObject *
self, T *&into) {
336 if (DtoolCanThisBeAPandaInstance(
self)) {
337 Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
338 if (target_class != NULL) {
339 into = (T*) ((Dtool_PyInstDef *)
self)->_My_Type->_Dtool_UpcastInterface(
self, target_class);
340 return (into != NULL);
352 #ifndef _PyErr_OCCURRED 353 #define _PyErr_OCCURRED() PyErr_Occurred() 357 #define Dtool_CheckErrorOccurred() (_PyErr_OCCURRED() != NULL) 359 EXPCL_DTOOLCONFIG
bool Dtool_CheckErrorOccurred();
362 EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_AssertionError();
363 EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_TypeError(
const char *message);
364 EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_ArgTypeError(PyObject *obj,
int param,
const char *function_name,
const char *type_name);
365 EXPCL_DTOOLCONFIG PyObject *Dtool_Raise_AttributeError(PyObject *obj,
const char *attribute);
367 EXPCL_DTOOLCONFIG PyObject *_Dtool_Raise_BadArgumentsError();
370 #define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError() 373 #define Dtool_Raise_BadArgumentsError(x) Dtool_Raise_TypeError("Arguments must match:\n" x) 376 EXPCL_DTOOLCONFIG PyObject *_Dtool_Return_None();
377 EXPCL_DTOOLCONFIG PyObject *Dtool_Return_Bool(
bool value);
378 EXPCL_DTOOLCONFIG PyObject *_Dtool_Return(PyObject *value);
381 #define Dtool_Return_None() (_PyErr_OCCURRED() != NULL ? NULL : (Py_INCREF(Py_None), Py_None)) 382 #define Dtool_Return(value) (_PyErr_OCCURRED() != NULL ? NULL : value) 384 #define Dtool_Return_None() _Dtool_Return_None() 385 #define Dtool_Return(value) _Dtool_Return(value) 394 EXPCL_DTOOLCONFIG PyObject *DTool_CreatePyInstanceTyped(
void *local_this_in, Dtool_PyTypedObject &known_class_type,
bool memory_rules,
bool is_const,
int RunTimeType);
400 EXPCL_DTOOLCONFIG PyObject *DTool_CreatePyInstance(
void *local_this, Dtool_PyTypedObject &in_classdef,
bool memory_rules,
bool is_const);
404 template<
class T> INLINE PyObject *DTool_CreatePyInstance(
const T *obj,
bool memory_rules) {
405 Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
406 nassertr(known_class != NULL, NULL);
407 return DTool_CreatePyInstance((
void*) obj, *known_class, memory_rules,
true);
410 template<
class T> INLINE PyObject *DTool_CreatePyInstance(T *obj,
bool memory_rules) {
411 Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
412 nassertr(known_class != NULL, NULL);
413 return DTool_CreatePyInstance((
void*) obj, *known_class, memory_rules,
false);
416 template<
class T> INLINE PyObject *DTool_CreatePyInstanceTyped(
const T *obj,
bool memory_rules) {
417 Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
418 nassertr(known_class != NULL, NULL);
419 return DTool_CreatePyInstanceTyped((
void*) obj, *known_class, memory_rules,
true, obj->get_type().get_index());
422 template<
class T> INLINE PyObject *DTool_CreatePyInstanceTyped(T *obj,
bool memory_rules) {
423 Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
424 nassertr(known_class != NULL, NULL);
425 return DTool_CreatePyInstanceTyped((
void*) obj, *known_class, memory_rules,
false, obj->get_type().get_index());
435 #define Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ 436 extern EXPORT_THIS Dtool_PyTypedObject Dtool_##CLASS_NAME;\ 437 int Dtool_Init_##CLASS_NAME(PyObject *self, PyObject *args, PyObject *kwds);\ 438 PyObject * Dtool_new_##CLASS_NAME(PyTypeObject *type, PyObject *args, PyObject *kwds);\ 439 void * Dtool_UpcastInterface_##CLASS_NAME(PyObject *self, Dtool_PyTypedObject *requested_type);\ 440 void * Dtool_DowncastInterface_##CLASS_NAME(void *self, Dtool_PyTypedObject *requested_type); 443 #define Define_Module_Class(MODULE_NAME,CLASS_NAME,CNAME,PUBLIC_NAME)\ 444 Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ 445 Define_Dtool_new(CLASS_NAME,CNAME)\ 446 Define_Dtool_FreeInstance(CLASS_NAME,CNAME)\ 447 Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) 450 #define Define_Module_Class_Private(MODULE_NAME,CLASS_NAME,CNAME,PUBLIC_NAME)\ 451 Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ 452 Define_Dtool_new(CLASS_NAME,CNAME)\ 453 Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ 454 Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) 457 #define Define_Module_ClassRef_Private(MODULE_NAME,CLASS_NAME,CNAME,PUBLIC_NAME)\ 458 Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ 459 Define_Dtool_new(CLASS_NAME,CNAME)\ 460 Define_Dtool_FreeInstance_Private(CLASS_NAME,CNAME)\ 461 Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) 464 #define Define_Module_ClassRef(MODULE_NAME,CLASS_NAME,CNAME,PUBLIC_NAME)\ 465 Define_Module_Class_Internal(MODULE_NAME,CLASS_NAME,CNAME)\ 466 Define_Dtool_new(CLASS_NAME,CNAME)\ 467 Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\ 468 Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) 473 EXPCL_DTOOLCONFIG
int DTool_PyInit_Finalize(PyObject *
self,
void *This, Dtool_PyTypedObject *type,
bool memory_rules,
bool is_const);
480 typedef std::map<std::string, PyMethodDef *> MethodDefmap;
482 EXPCL_DTOOLCONFIG
void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap);
489 typedef void (*ConstantFunction)(PyObject *);
491 PyMethodDef *_methods;
492 ConstantFunction _constants;
496 #if PY_MAJOR_VERSION >= 3 497 EXPCL_DTOOLCONFIG PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], PyModuleDef *module_def);
499 EXPCL_DTOOLCONFIG PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[],
const char *modulename);
510 EXPCL_DTOOLCONFIG PyObject *Dtool_BorrowThisReference(PyObject *
self, PyObject *args);
515 EXPCL_DTOOLCONFIG PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args);
519 EXPCL_DTOOLCONFIG Py_hash_t DTOOL_PyObject_HashPointer(PyObject *obj);
529 EXPCL_DTOOLCONFIG
int DTOOL_PyObject_ComparePointers(PyObject *v1, PyObject *v2);
530 EXPCL_DTOOLCONFIG
int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2);
532 EXPCL_DTOOLCONFIG PyObject *DTOOL_PyObject_RichCompare(PyObject *v1, PyObject *v2,
int op);
534 EXPCL_DTOOLCONFIG PyObject *
535 make_list_for_item(PyObject *
self,
const char *num_name,
536 const char *element_name);
538 EXPCL_DTOOLCONFIG PyObject *
539 copy_from_make_copy(PyObject *
self);
541 EXPCL_DTOOLCONFIG PyObject *
542 copy_from_copy_constructor(PyObject *
self);
544 EXPCL_DTOOLCONFIG PyObject *
545 map_deepcopy_to_copy(PyObject *
self, PyObject *args);
547 #if PY_MAJOR_VERSION < 3 549 EXPCL_DTOOLCONFIG PyObject *
550 PyLongOrInt_FromUnsignedLong(
unsigned long value);
553 EXPCL_DTOOLCONFIG
extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE;
554 EXPCL_DTOOLCONFIG
extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module);
556 #endif // HAVE_PYTHON && !CPPPARSER 558 #endif // PY_PANDA_H_
TypeHandle is the identifier used to differentiate C++ class types.