Move Python support code from libp3interrogatedb to generated module

This prevents libp3interrogatedb from having a dependency on the Python library.

See #387
This commit is contained in:
rdb 2018-11-06 14:22:08 +01:00
parent e6f870ece6
commit 49b72fb198
16 changed files with 977 additions and 972 deletions

View File

@ -22,7 +22,8 @@
*/ */
TypeHandle Extension<TypeHandle>:: TypeHandle Extension<TypeHandle>::
make(PyTypeObject *tp) { make(PyTypeObject *tp) {
if (!PyType_IsSubtype(tp, &Dtool_DTOOL_SUPER_BASE._PyType)) { Dtool_PyTypedObject *super_base = Dtool_GetSuperBase();
if (!PyType_IsSubtype(tp, (PyTypeObject *)super_base)) {
PyErr_SetString(PyExc_TypeError, "a Panda type is required"); PyErr_SetString(PyExc_TypeError, "a Panda type is required");
return TypeHandle::none(); return TypeHandle::none();
} }

View File

@ -3097,7 +3097,7 @@ write_module_class(ostream &out, Object *obj) {
out << " Dtool_" << ClassName << "._PyType.tp_bases = PyTuple_Pack(" << bases.size() << baseargs << ");\n"; out << " Dtool_" << ClassName << "._PyType.tp_bases = PyTuple_Pack(" << bases.size() << baseargs << ");\n";
} else { } else {
out << " Dtool_" << ClassName << "._PyType.tp_base = (PyTypeObject *)&Dtool_DTOOL_SUPER_BASE;\n"; out << " Dtool_" << ClassName << "._PyType.tp_base = (PyTypeObject *)Dtool_GetSuperBase();\n";
} }
int num_nested = obj->_itype.number_of_nested_types(); int num_nested = obj->_itype.number_of_nested_types();

View File

@ -30,6 +30,9 @@
using std::cerr; using std::cerr;
using std::string; using std::string;
// This contains a big source string determined at compile time.
extern const char interrogate_preamble_python_native[];
Filename output_code_filename; Filename output_code_filename;
string module_name; string module_name;
string library_name; string library_name;
@ -635,8 +638,10 @@ int main(int argc, char *argv[]) {
if (build_python_native_wrappers) { if (build_python_native_wrappers) {
write_python_table_native(output_code); write_python_table_native(output_code);
}
// Output the support code.
output_code << interrogate_preamble_python_native << "\n";
}
} }
} }

View File

@ -15,120 +15,132 @@
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
class EmptyClass {
};
Define_Module_Class_Private(dtoolconfig, DTOOL_SUPER_BASE, EmptyClass, DTOOL_SUPER_BASE111);
static PyObject *GetSuperBase(PyObject *self) { static PyObject *GetSuperBase(PyObject *self) {
Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE); // order is important .. this is used for static functions Dtool_PyTypedObject *super_base = Dtool_GetSuperBase();
return (PyObject *) &Dtool_DTOOL_SUPER_BASE; Py_XINCREF((PyTypeObject *)super_base); // order is important .. this is used for static functions
return (PyObject *)super_base;
}; };
PyMethodDef Dtool_Methods_DTOOL_SUPER_BASE[] = { static void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) {
{ "DtoolGetSuperBase", (PyCFunction) &GetSuperBase, METH_NOARGS, "Will Return SUPERbase Class"},
{ nullptr, nullptr, 0, nullptr }
};
EXPCL_INTERROGATEDB void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) {
static bool initdone = false;
if (!initdone) {
initdone = true;
Dtool_DTOOL_SUPER_BASE._PyType.tp_dict = PyDict_New();
PyDict_SetItemString(Dtool_DTOOL_SUPER_BASE._PyType.tp_dict, "DtoolClassDict", Dtool_DTOOL_SUPER_BASE._PyType.tp_dict);
if (PyType_Ready((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE) < 0) {
PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_DTOOL_SUPER_BASE)");
return;
}
Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE);
PyDict_SetItemString(Dtool_DTOOL_SUPER_BASE._PyType.tp_dict, "DtoolGetSuperBase", PyCFunction_New(&Dtool_Methods_DTOOL_SUPER_BASE[0], (PyObject *)&Dtool_DTOOL_SUPER_BASE));
}
if (module != nullptr) { if (module != nullptr) {
Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE); Dtool_PyTypedObject *super_base = Dtool_GetSuperBase();
PyModule_AddObject(module, "DTOOL_SUPER_BASE", (PyObject *)&Dtool_DTOOL_SUPER_BASE); Py_INCREF((PyTypeObject *)&super_base);
PyModule_AddObject(module, "DTOOL_SUPER_BASE", (PyObject *)&super_base);
} }
} }
inline void *Dtool_DowncastInterface_DTOOL_SUPER_BASE(void *from_this, Dtool_PyTypedObject *from_type) { static void *Dtool_DowncastInterface_DTOOL_SUPER_BASE(void *from_this, Dtool_PyTypedObject *from_type) {
return nullptr; return nullptr;
} }
inline void *Dtool_UpcastInterface_DTOOL_SUPER_BASE(PyObject *self, Dtool_PyTypedObject *requested_type) { static void *Dtool_UpcastInterface_DTOOL_SUPER_BASE(PyObject *self, Dtool_PyTypedObject *requested_type) {
return nullptr; return nullptr;
} }
int Dtool_Init_DTOOL_SUPER_BASE(PyObject *self, PyObject *args, PyObject *kwds) { static int Dtool_Init_DTOOL_SUPER_BASE(PyObject *self, PyObject *args, PyObject *kwds) {
assert(self != nullptr); assert(self != nullptr);
PyErr_Format(PyExc_TypeError, "cannot init constant class %s", Py_TYPE(self)->tp_name); PyErr_Format(PyExc_TypeError, "cannot init constant class %s", Py_TYPE(self)->tp_name);
return -1; return -1;
} }
EXPORT_THIS Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE = { static void Dtool_FreeInstance_DTOOL_SUPER_BASE(PyObject *self) {
{ Py_TYPE(self)->tp_free(self);
PyVarObject_HEAD_INIT(nullptr, 0) }
"dtoolconfig.DTOOL_SUPER_BASE",
sizeof(Dtool_PyInstDef), /**
0, // tp_itemsize * Returns a pointer to the DTOOL_SUPER_BASE class that is the base class of
&Dtool_FreeInstance_DTOOL_SUPER_BASE, * all Panda types. This pointer is shared by all modules.
nullptr, // tp_print */
nullptr, // tp_getattr Dtool_PyTypedObject *Dtool_GetSuperBase() {
nullptr, // tp_setattr Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap();
auto it = type_map->find("DTOOL_SUPER_BASE");
if (it != type_map->end()) {
return it->second;
}
static PyMethodDef methods[] = {
{ "DtoolGetSuperBase", (PyCFunction)&GetSuperBase, METH_NOARGS, "Will Return SUPERbase Class"},
{ nullptr, nullptr, 0, nullptr }
};
static Dtool_PyTypedObject super_base_type = {
{
PyVarObject_HEAD_INIT(nullptr, 0)
"dtoolconfig.DTOOL_SUPER_BASE",
sizeof(Dtool_PyInstDef),
0, // tp_itemsize
&Dtool_FreeInstance_DTOOL_SUPER_BASE,
nullptr, // tp_print
nullptr, // tp_getattr
nullptr, // tp_setattr
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
nullptr, // tp_compare nullptr, // tp_compare
#else #else
&DtoolInstance_ComparePointers, &DtoolInstance_ComparePointers,
#endif #endif
nullptr, // tp_repr nullptr, // tp_repr
nullptr, // tp_as_number nullptr, // tp_as_number
nullptr, // tp_as_sequence nullptr, // tp_as_sequence
nullptr, // tp_as_mapping nullptr, // tp_as_mapping
&DtoolInstance_HashPointer, &DtoolInstance_HashPointer,
nullptr, // tp_call nullptr, // tp_call
nullptr, // tp_str nullptr, // tp_str
PyObject_GenericGetAttr, PyObject_GenericGetAttr,
PyObject_GenericSetAttr, PyObject_GenericSetAttr,
nullptr, // tp_as_buffer nullptr, // tp_as_buffer
(Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES),
nullptr, // tp_doc nullptr, // tp_doc
nullptr, // tp_traverse nullptr, // tp_traverse
nullptr, // tp_clear nullptr, // tp_clear
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
&DtoolInstance_RichComparePointers, &DtoolInstance_RichComparePointers,
#else #else
nullptr, // tp_richcompare nullptr, // tp_richcompare
#endif #endif
0, // tp_weaklistoffset 0, // tp_weaklistoffset
nullptr, // tp_iter nullptr, // tp_iter
nullptr, // tp_iternext nullptr, // tp_iternext
Dtool_Methods_DTOOL_SUPER_BASE, methods,
standard_type_members, standard_type_members,
nullptr, // tp_getset nullptr, // tp_getset
nullptr, // tp_base nullptr, // tp_base
nullptr, // tp_dict nullptr, // tp_dict
nullptr, // tp_descr_get nullptr, // tp_descr_get
nullptr, // tp_descr_set nullptr, // tp_descr_set
0, // tp_dictoffset 0, // tp_dictoffset
Dtool_Init_DTOOL_SUPER_BASE, Dtool_Init_DTOOL_SUPER_BASE,
PyType_GenericAlloc, PyType_GenericAlloc,
Dtool_new_DTOOL_SUPER_BASE, nullptr, // tp_new
PyObject_Del, PyObject_Del,
nullptr, // tp_is_gc nullptr, // tp_is_gc
nullptr, // tp_bases nullptr, // tp_bases
nullptr, // tp_mro nullptr, // tp_mro
nullptr, // tp_cache nullptr, // tp_cache
nullptr, // tp_subclasses nullptr, // tp_subclasses
nullptr, // tp_weaklist nullptr, // tp_weaklist
nullptr, // tp_del nullptr, // tp_del
}, },
TypeHandle::none(), TypeHandle::none(),
Dtool_PyModuleClassInit_DTOOL_SUPER_BASE, Dtool_PyModuleClassInit_DTOOL_SUPER_BASE,
Dtool_UpcastInterface_DTOOL_SUPER_BASE, Dtool_UpcastInterface_DTOOL_SUPER_BASE,
Dtool_DowncastInterface_DTOOL_SUPER_BASE, Dtool_DowncastInterface_DTOOL_SUPER_BASE,
nullptr, nullptr,
nullptr, nullptr,
}; };
super_base_type._PyType.tp_dict = PyDict_New();
PyDict_SetItemString(super_base_type._PyType.tp_dict, "DtoolClassDict", super_base_type._PyType.tp_dict);
if (PyType_Ready((PyTypeObject *)&super_base_type) < 0) {
PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_DTOOL_SUPER_BASE)");
return nullptr;
}
Py_INCREF((PyTypeObject *)&super_base_type);
PyDict_SetItemString(super_base_type._PyType.tp_dict, "DtoolGetSuperBase", PyCFunction_New(&methods[0], (PyObject *)&super_base_type));
(*type_map)["DTOOL_SUPER_BASE"] = &super_base_type;
return &super_base_type;
}
#endif // HAVE_PYTHON #endif // HAVE_PYTHON

View File

@ -1,5 +1,4 @@
#include "config_interrogatedb.cxx" #include "config_interrogatedb.cxx"
#include "dtool_super_base.cxx"
#include "indexRemapper.cxx" #include "indexRemapper.cxx"
#include "interrogateComponent.cxx" #include "interrogateComponent.cxx"
#include "interrogateDatabase.cxx" #include "interrogateDatabase.cxx"

View File

@ -4,6 +4,3 @@
#include "interrogate_datafile.cxx" #include "interrogate_datafile.cxx"
#include "interrogate_interface.cxx" #include "interrogate_interface.cxx"
#include "interrogate_request.cxx" #include "interrogate_request.cxx"
#include "py_panda.cxx"
#include "py_compat.cxx"
#include "py_wrappers.cxx"

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_compat.cxx * @file py_compat.cxx
* @author rdb * @author rdb
* @date 2017-12-03 * @date 2017-12-03

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_compat.h * @file py_compat.h
* @author rdb * @author rdb
* @date 2017-12-02 * @date 2017-12-02
@ -106,7 +99,7 @@ typedef int Py_ssize_t;
// PyInt_FromSize_t automatically picks the right type. // PyInt_FromSize_t automatically picks the right type.
# define PyLongOrInt_AS_LONG PyInt_AsLong # define PyLongOrInt_AS_LONG PyInt_AsLong
EXPCL_INTERROGATEDB size_t PyLongOrInt_AsSize_t(PyObject *); size_t PyLongOrInt_AsSize_t(PyObject *);
#endif #endif
// Which character to use in PyArg_ParseTuple et al for a byte string. // Which character to use in PyArg_ParseTuple et al for a byte string.

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_panda.I * @file py_panda.I
* @author rdb * @author rdb
* @date 2016-06-06 * @date 2016-06-06
@ -142,6 +135,18 @@ DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) {
return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index()); return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index());
} }
/**
* Finishes initializing the Dtool_PyInstDef.
*/
INLINE int
DTool_PyInit_Finalize(PyObject *self, void *local_this, Dtool_PyTypedObject *type, bool memory_rules, bool is_const) {
((Dtool_PyInstDef *)self)->_My_Type = type;
((Dtool_PyInstDef *)self)->_ptr_to_object = local_this;
((Dtool_PyInstDef *)self)->_memory_rules = memory_rules;
((Dtool_PyInstDef *)self)->_is_const = is_const;
return 0;
}
/** /**
* Checks that the tuple is empty. * Checks that the tuple is empty.
*/ */

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_panda.cxx * @file py_panda.cxx
* @author drose * @author drose
* @date 2005-07-04 * @date 2005-07-04
@ -480,49 +473,22 @@ PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_class
return (PyObject *)self; return (PyObject *)self;
} }
// Th Finalizer for simple instances..
int DTool_PyInit_Finalize(PyObject *self, void *local_this, Dtool_PyTypedObject *type, bool memory_rules, bool is_const) {
// lets put some code in here that checks to see the memory is properly
// configured.. prior to my call ..
((Dtool_PyInstDef *)self)->_My_Type = type;
((Dtool_PyInstDef *)self)->_ptr_to_object = local_this;
((Dtool_PyInstDef *)self)->_memory_rules = memory_rules;
((Dtool_PyInstDef *)self)->_is_const = is_const;
return 0;
}
// A helper function to glue method definition together .. that can not be
// done at code generation time because of multiple generation passes in
// interrogate..
void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap) {
for (; in->ml_name != nullptr; in++) {
if (themap.find(in->ml_name) == themap.end()) {
themap[in->ml_name] = in;
}
}
}
/** /**
* Returns a borrowed reference to the global type dictionary. * Returns a borrowed reference to the global type dictionary.
*/ */
Dtool_TypeMap *Dtool_GetGlobalTypeMap() { Dtool_TypeMap *Dtool_GetGlobalTypeMap() {
PyObject *capsule = PySys_GetObject("_interrogate_types"); PyObject *capsule = PySys_GetObject((char *)"_interrogate_types");
if (capsule != nullptr) { if (capsule != nullptr) {
return (Dtool_TypeMap *)PyCapsule_GetPointer(capsule, nullptr); return (Dtool_TypeMap *)PyCapsule_GetPointer(capsule, nullptr);
} else { } else {
Dtool_TypeMap *type_map = new Dtool_TypeMap; Dtool_TypeMap *type_map = new Dtool_TypeMap;
capsule = PyCapsule_New((void *)type_map, nullptr, nullptr); capsule = PyCapsule_New((void *)type_map, nullptr, nullptr);
PySys_SetObject("_interrogate_types", capsule); PySys_SetObject((char *)"_interrogate_types", capsule);
Py_DECREF(capsule); Py_DECREF(capsule);
return type_map; return type_map;
} }
} }
Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type) {
return (Dtool_PyTypedObject *)TypeHandle::from_index(type).get_python_type();
}
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def) { PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def) {
#else #else
@ -544,58 +510,19 @@ PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulen
return nullptr; return nullptr;
} }
// Initialize the types we define in py_panda.
static bool dtool_inited = false;
if (!dtool_inited) {
dtool_inited = true;
if (PyType_Ready(&Dtool_SequenceWrapper_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_SequenceWrapper)");
}
if (PyType_Ready(&Dtool_MutableSequenceWrapper_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MutableSequenceWrapper)");
}
if (PyType_Ready(&Dtool_MappingWrapper_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper)");
}
if (PyType_Ready(&Dtool_MutableMappingWrapper_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MutableMappingWrapper)");
}
if (PyType_Ready(&Dtool_MappingWrapper_Keys_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Keys)");
}
if (PyType_Ready(&Dtool_MappingWrapper_Values_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Values)");
}
if (PyType_Ready(&Dtool_MappingWrapper_Items_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Items)");
}
if (PyType_Ready(&Dtool_GeneratorWrapper_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_GeneratorWrapper)");
}
if (PyType_Ready(&Dtool_StaticProperty_Type) < 0) {
return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)");
}
// Initialize the base class of everything.
Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(nullptr);
}
Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap(); Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap();
// the module level function inits.... // the module level function inits....
MethodDefmap functions; MethodDefmap functions;
for (size_t i = 0; defs[i] != nullptr; i++) { for (size_t i = 0; defs[i] != nullptr; i++) {
const LibraryDef &def = *defs[i]; const LibraryDef &def = *defs[i];
Dtool_Accum_MethDefs(def._methods, functions);
// Accumulate method definitions.
for (PyMethodDef *meth = def._methods; meth->ml_name != nullptr; meth++) {
if (functions.find(meth->ml_name) == functions.end()) {
functions[meth->ml_name] = meth;
}
}
// Define exported types. // Define exported types.
const Dtool_TypeDef *types = def._types; const Dtool_TypeDef *types = def._types;
@ -746,7 +673,7 @@ PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args) {
// We do expose a dictionay for dtool classes .. this should be removed at // We do expose a dictionay for dtool classes .. this should be removed at
// some point.. // some point..
EXPCL_INTERROGATEDB PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) { PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) {
PyObject *self; PyObject *self;
PyObject *subject; PyObject *subject;
PyObject *key; PyObject *key;

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_panda.h * @file py_panda.h
*/ */
@ -43,9 +36,6 @@ using namespace std;
#endif #endif
struct Dtool_PyTypedObject; struct Dtool_PyTypedObject;
typedef std::map<int, Dtool_PyTypedObject *> RuntimeTypeMap;
typedef std::set<int> RuntimeTypeSet;
typedef std::map<std::string, Dtool_PyTypedObject *> NamedTypeMap;
// used to stamp dtool instance.. // used to stamp dtool instance..
#define PY_PANDA_SIGNATURE 0xbeaf #define PY_PANDA_SIGNATURE 0xbeaf
@ -78,7 +68,7 @@ struct Dtool_PyInstDef {
}; };
// A Offset Dictionary Defining How to read the Above Object.. // A Offset Dictionary Defining How to read the Above Object..
extern EXPCL_INTERROGATEDB PyMemberDef standard_type_members[]; extern PyMemberDef standard_type_members[];
// The Class Definition Structor For a Dtool python type. // The Class Definition Structor For a Dtool python type.
struct Dtool_PyTypedObject { struct Dtool_PyTypedObject {
@ -192,21 +182,19 @@ static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\
typedef std::map<std::string, Dtool_PyTypedObject *> Dtool_TypeMap; typedef std::map<std::string, Dtool_PyTypedObject *> Dtool_TypeMap;
EXPCL_INTERROGATEDB Dtool_TypeMap *Dtool_GetGlobalTypeMap(); Dtool_TypeMap *Dtool_GetGlobalTypeMap();
EXPCL_INTERROGATEDB Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type);
/** /**
*/ */
EXPCL_INTERROGATEDB void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer); void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer);
EXPCL_INTERROGATEDB void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors); void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors);
EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer); bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer);
EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef, bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef,
void **answer, const char *method_name); void **answer, const char *method_name);
template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into); template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into);
template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into, Dtool_PyTypedObject &classdef); template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into, Dtool_PyTypedObject &classdef);
@ -216,7 +204,7 @@ INLINE int DtoolInstance_ComparePointers(PyObject *v1, PyObject *v2);
INLINE PyObject *DtoolInstance_RichComparePointers(PyObject *v1, PyObject *v2, int op); INLINE PyObject *DtoolInstance_RichComparePointers(PyObject *v1, PyObject *v2, int op);
// Functions related to error reporting. // Functions related to error reporting.
EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred(); bool _Dtool_CheckErrorOccurred();
#ifdef NDEBUG #ifdef NDEBUG
#define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != nullptr)) #define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != nullptr))
@ -224,12 +212,12 @@ EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred();
#define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred())) #define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred()))
#endif #endif
EXPCL_INTERROGATEDB PyObject *Dtool_Raise_AssertionError(); PyObject *Dtool_Raise_AssertionError();
EXPCL_INTERROGATEDB PyObject *Dtool_Raise_TypeError(const char *message); PyObject *Dtool_Raise_TypeError(const char *message);
EXPCL_INTERROGATEDB PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name); PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name);
EXPCL_INTERROGATEDB PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute); PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute);
EXPCL_INTERROGATEDB PyObject *_Dtool_Raise_BadArgumentsError(); PyObject *_Dtool_Raise_BadArgumentsError();
#ifdef NDEBUG #ifdef NDEBUG
// Define it to a function that just prints a generic message. // Define it to a function that just prints a generic message.
#define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError() #define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError()
@ -241,9 +229,9 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Raise_BadArgumentsError();
// These functions are similar to Dtool_WrapValue, except that they also // These functions are similar to Dtool_WrapValue, except that they also
// contain code for checking assertions and exceptions when compiling with // contain code for checking assertions and exceptions when compiling with
// NDEBUG mode on. // NDEBUG mode on.
EXPCL_INTERROGATEDB PyObject *_Dtool_Return_None(); PyObject *_Dtool_Return_None();
EXPCL_INTERROGATEDB PyObject *Dtool_Return_Bool(bool value); PyObject *Dtool_Return_Bool(bool value);
EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value); PyObject *_Dtool_Return(PyObject *value);
#ifdef NDEBUG #ifdef NDEBUG
#define Dtool_Return_None() (LIKELY(_PyErr_OCCURRED() == nullptr) ? (Py_INCREF(Py_None), Py_None) : nullptr) #define Dtool_Return_None() (LIKELY(_PyErr_OCCURRED() == nullptr) ? (Py_INCREF(Py_None), Py_None) : nullptr)
@ -256,19 +244,19 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value);
/** /**
* Wrapper around Python 3.4's enum library, which does not have a C API. * Wrapper around Python 3.4's enum library, which does not have a C API.
*/ */
EXPCL_INTERROGATEDB PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names, PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names,
const char *module = nullptr); const char *module = nullptr);
EXPCL_INTERROGATEDB INLINE long Dtool_EnumValue_AsLong(PyObject *value); INLINE long Dtool_EnumValue_AsLong(PyObject *value);
/** /**
*/ */
EXPCL_INTERROGATEDB PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType); PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType);
// DTool_CreatePyInstance .. wrapper function to finalize the existance of a // DTool_CreatePyInstance .. wrapper function to finalize the existance of a
// general dtool py instance.. // general dtool py instance..
EXPCL_INTERROGATEDB PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const); PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const);
// These template methods allow use when the Dtool_PyTypedObject is not known. // These template methods allow use when the Dtool_PyTypedObject is not known.
// They require a get_class_type() to be defined for the class. // They require a get_class_type() to be defined for the class.
@ -312,15 +300,13 @@ Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\
Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME)
// The finalizer for simple instances. // The finalizer for simple instances.
EXPCL_INTERROGATEDB int DTool_PyInit_Finalize(PyObject *self, void *This, Dtool_PyTypedObject *type, bool memory_rules, bool is_const); INLINE int DTool_PyInit_Finalize(PyObject *self, void *This, Dtool_PyTypedObject *type, bool memory_rules, bool is_const);
// A heler function to glu methed definition together .. that can not be done // A heler function to glu methed definition together .. that can not be done
// at code generation time becouse of multiple generation passes in // at code generation time becouse of multiple generation passes in
// interigate.. // interigate..
typedef std::map<std::string, PyMethodDef *> MethodDefmap; typedef std::map<std::string, PyMethodDef *> MethodDefmap;
EXPCL_INTERROGATEDB void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap);
// We need a way to runtime merge compile units into a python "Module" .. this // We need a way to runtime merge compile units into a python "Module" .. this
// is done with the fallowing structors and code.. along with the support of // is done with the fallowing structors and code.. along with the support of
// interigate_module // interigate_module
@ -337,26 +323,26 @@ struct LibraryDef {
}; };
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
EXPCL_INTERROGATEDB PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def); PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def);
#else #else
EXPCL_INTERROGATEDB PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename); PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename);
#endif #endif
// HACK.... Be carefull Dtool_BorrowThisReference This function can be used to // HACK.... Be carefull Dtool_BorrowThisReference This function can be used to
// grab the "THIS" pointer from an object and use it Required to support fom // grab the "THIS" pointer from an object and use it Required to support fom
// historical inharatence in the for of "is this instance of".. // historical inharatence in the for of "is this instance of"..
EXPCL_INTERROGATEDB PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args); PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args);
#define DTOOL_PyObject_HashPointer DtoolInstance_HashPointer #define DTOOL_PyObject_HashPointer DtoolInstance_HashPointer
#define DTOOL_PyObject_ComparePointers DtoolInstance_ComparePointers #define DTOOL_PyObject_ComparePointers DtoolInstance_ComparePointers
EXPCL_INTERROGATEDB PyObject * PyObject *
copy_from_make_copy(PyObject *self, PyObject *noargs); copy_from_make_copy(PyObject *self, PyObject *noargs);
EXPCL_INTERROGATEDB PyObject * PyObject *
copy_from_copy_constructor(PyObject *self, PyObject *noargs); copy_from_copy_constructor(PyObject *self, PyObject *noargs);
EXPCL_INTERROGATEDB PyObject * PyObject *
map_deepcopy_to_copy(PyObject *self, PyObject *args); map_deepcopy_to_copy(PyObject *self, PyObject *args);
/** /**
@ -365,13 +351,13 @@ map_deepcopy_to_copy(PyObject *self, PyObject *args);
*/ */
ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args); ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args);
ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds); ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds);
EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, bool Dtool_ExtractArg(PyObject **result, PyObject *args,
PyObject *kwds, const char *keyword); PyObject *kwds, const char *keyword);
EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, bool Dtool_ExtractArg(PyObject **result, PyObject *args,
PyObject *kwds); PyObject *kwds);
EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
PyObject *kwds, const char *keyword); PyObject *kwds, const char *keyword);
EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
PyObject *kwds); PyObject *kwds);
/** /**
@ -407,10 +393,7 @@ ALWAYS_INLINE PyObject *Dtool_WrapValue(Py_buffer *value);
template<class T1, class T2> template<class T1, class T2>
ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value); ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value);
EXPCL_INTERROGATEDB extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE; Dtool_PyTypedObject *Dtool_GetSuperBase();
EXPCL_INTERROGATEDB extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module);
#define Dtool_Ptr_DTOOL_SUPER_BASE (&Dtool_DTOOL_SUPER_BASE)
#include "py_panda.I" #include "py_panda.I"

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,4 @@
/** /**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file py_wrappers.h * @file py_wrappers.h
* @author rdb * @author rdb
* @date 2017-11-26 * @date 2017-11-26
@ -56,22 +49,12 @@ struct Dtool_GeneratorWrapper {
iternextfunc _iternext_func; iternextfunc _iternext_func;
}; };
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MutableSequenceWrapper_Type; Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Type; Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MutableMappingWrapper_Type; Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Items_Type; PyObject *Dtool_NewGenerator(PyObject *self, iternextfunc func);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Keys_Type; PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset);
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Values_Type;
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_GeneratorWrapper_Type;
EXPCL_INTERROGATEDB extern PyTypeObject Dtool_StaticProperty_Type;
EXPCL_INTERROGATEDB Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name);
EXPCL_INTERROGATEDB PyObject *Dtool_NewGenerator(PyObject *self, const char *name, iternextfunc func);
EXPCL_INTERROGATEDB PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset);
#endif // HAVE_PYTHON #endif // HAVE_PYTHON

View File

@ -3442,14 +3442,13 @@ TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI', 'OPENSSL', 'WINGDI', 'WINUSER'
# DIRECTORY: dtool/src/interrogatedb/ # DIRECTORY: dtool/src/interrogatedb/
# #
OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:INTERROGATEDB', 'PYTHON'] OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:INTERROGATEDB']
TargetAdd('p3interrogatedb_composite1.obj', opts=OPTS, input='p3interrogatedb_composite1.cxx') TargetAdd('p3interrogatedb_composite1.obj', opts=OPTS, input='p3interrogatedb_composite1.cxx')
TargetAdd('p3interrogatedb_composite2.obj', opts=OPTS, input='p3interrogatedb_composite2.cxx') TargetAdd('p3interrogatedb_composite2.obj', opts=OPTS, input='p3interrogatedb_composite2.cxx')
TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite1.obj') TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite1.obj')
TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite2.obj') TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite2.obj')
TargetAdd('libp3interrogatedb.dll', input='libp3dtool.dll') TargetAdd('libp3interrogatedb.dll', input='libp3dtool.dll')
TargetAdd('libp3interrogatedb.dll', input='libp3dtoolconfig.dll') TargetAdd('libp3interrogatedb.dll', input='libp3dtoolconfig.dll')
TargetAdd('libp3interrogatedb.dll', opts=['PYTHON'])
if not PkgSkip("PYTHON"): if not PkgSkip("PYTHON"):
# This used to be called dtoolconfig.pyd, but it just contains the interrogatedb # This used to be called dtoolconfig.pyd, but it just contains the interrogatedb
@ -3489,8 +3488,16 @@ if (not RUNTIME):
TargetAdd('interrogate.exe', input='libp3pystub.lib') TargetAdd('interrogate.exe', input='libp3pystub.lib')
TargetAdd('interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) TargetAdd('interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER'])
preamble = WriteEmbeddedStringFile('interrogate_preamble_python_native', inputs=[
'dtool/src/interrogatedb/py_panda.cxx',
'dtool/src/interrogatedb/py_compat.cxx',
'dtool/src/interrogatedb/py_wrappers.cxx',
'dtool/src/interrogatedb/dtool_super_base.cxx',
])
TargetAdd('interrogate_module_preamble_python_native.obj', opts=OPTS, input=preamble)
TargetAdd('interrogate_module_interrogate_module.obj', opts=OPTS, input='interrogate_module.cxx') TargetAdd('interrogate_module_interrogate_module.obj', opts=OPTS, input='interrogate_module.cxx')
TargetAdd('interrogate_module.exe', input='interrogate_module_interrogate_module.obj') TargetAdd('interrogate_module.exe', input='interrogate_module_interrogate_module.obj')
TargetAdd('interrogate_module.exe', input='interrogate_module_preamble_python_native.obj')
TargetAdd('interrogate_module.exe', input='libp3cppParser.ilb') TargetAdd('interrogate_module.exe', input='libp3cppParser.ilb')
TargetAdd('interrogate_module.exe', input=COMMON_DTOOL_LIBS) TargetAdd('interrogate_module.exe', input=COMMON_DTOOL_LIBS)
TargetAdd('interrogate_module.exe', input='libp3interrogatedb.dll') TargetAdd('interrogate_module.exe', input='libp3interrogatedb.dll')

View File

@ -3190,6 +3190,48 @@ def WriteResourceFile(basename, **kwargs):
ConditionalWriteFile(basename, GenerateResourceFile(**kwargs)) ConditionalWriteFile(basename, GenerateResourceFile(**kwargs))
return basename return basename
def WriteEmbeddedStringFile(basename, inputs, string_name=None):
if os.path.splitext(basename)[1] not in SUFFIX_INC:
basename += '.cxx'
target = GetOutputDir() + "/tmp/" + basename
if string_name is None:
string_name = os.path.basename(os.path.splitext(target)[0])
string_name = string_name.replace('-', '_')
data = bytearray()
for input in inputs:
fp = open(input, 'rb')
# Insert a #line so that we get meaningful compile/assert errors when
# the result is inserted by interrogate_module into generated code.
if os.path.splitext(input)[1] in SUFFIX_INC:
line = '#line 1 "%s"\n' % (input)
data += bytearray(line.encode('ascii', 'replace'))
data += bytearray(fp.read())
fp.close()
data.append(0)
output = 'extern const char %s[] = {\n' % (string_name)
i = 0
for byte in data:
if i == 0:
output += ' '
output += ' 0x%02x,' % (byte)
i += 1
if i >= 12:
output += '\n'
i = 0
output += '\n};\n'
ConditionalWriteFile(target, output)
return target
######################################################################## ########################################################################
## ##
## FindLocation ## FindLocation

View File

@ -168,14 +168,7 @@ static PyObject *gen_next(PyObject *self) {
*/ */
PyObject *Extension<AsyncFuture>:: PyObject *Extension<AsyncFuture>::
__await__(PyObject *self) { __await__(PyObject *self) {
Dtool_GeneratorWrapper *gen; return Dtool_NewGenerator(self, &gen_next);
gen = (Dtool_GeneratorWrapper *)PyType_GenericAlloc(&Dtool_GeneratorWrapper_Type, 0);
if (gen != nullptr) {
Py_INCREF(self);
gen->_base._self = self;
gen->_iternext_func = &gen_next;
}
return (PyObject *)gen;
} }
/** /**