diff --git a/Wrapping/PythonCore/PyVTKObject.cxx b/Wrapping/PythonCore/PyVTKObject.cxx index 88c90375817836aba6e8a1c06cfa15494b6cdb57..6c5b2c77bf3537ed9d0edbedeb50391f4c6fff5d 100644 --- a/Wrapping/PythonCore/PyVTKObject.cxx +++ b/Wrapping/PythonCore/PyVTKObject.cxx @@ -48,7 +48,7 @@ #endif // This will be set to the python type struct for vtkObjectBase -PyTypeObject *PyVTKObject_Type = 0; +static PyTypeObject *PyVTKObject_Type = 0; //-------------------------------------------------------------------- PyVTKClass::PyVTKClass( diff --git a/Wrapping/Tools/vtkWrapPythonClass.c b/Wrapping/Tools/vtkWrapPythonClass.c index 6fbd56f4d5acdc865cdab0cd16f316de8d3ba61f..21ef3c8ce0daf0637be08d2555424b0274142bab 100644 --- a/Wrapping/Tools/vtkWrapPythonClass.c +++ b/Wrapping/Tools/vtkWrapPythonClass.c @@ -386,13 +386,16 @@ static void vtkWrapPython_GenerateObjectNew( " NULL);\n\n"); } + fprintf(fp, + " PyTypeObject *pytype = &Py%s_Type;\n\n", + classname); + /* if type is already ready, then return */ fprintf(fp, - " if ((Py%s_Type.tp_flags & Py_TPFLAGS_READY) != 0)\n" + " if ((pytype->tp_flags & Py_TPFLAGS_READY) != 0)\n" " {\n" - " return (PyObject *)&Py%s_Type;\n" - " }\n\n", - classname, classname); + " return (PyObject *)pytype;\n" + " }\n\n"); /* find the first superclass that is a VTK class, create it first */ name = vtkWrapPython_GetSuperClass(data, hinfo); @@ -400,7 +403,7 @@ static void vtkWrapPython_GenerateObjectNew( { vtkWrapPython_PythonicName(name, superclassname); fprintf(fp, - " Py%s_ClassNew(0);\n\n", + " pytype->tp_base = (PyTypeObject *)Py%s_ClassNew(0);\n\n", superclassname); } @@ -417,10 +420,9 @@ static void vtkWrapPython_GenerateObjectNew( if (has_constants) { fprintf(fp, - " PyObject *d = Py%s_Type.tp_dict;\n" + " PyObject *d = pytype->tp_dict;\n" " PyObject *o;\n" - "\n", - classname); + "\n"); /* add any enum types defined in the class to its dict */ vtkWrapPython_AddPublicEnumTypes(fp, " ", "d", "o", data); @@ -430,53 +432,18 @@ static void vtkWrapPython_GenerateObjectNew( } fprintf(fp, - " PyType_Ready(&Py%s_Type);\n" - " return (PyObject *)&Py%s_Type;\n" - "}\n" - "\n", - classname, classname); + " PyType_Ready(pytype);\n" + " return (PyObject *)pytype;\n" + "}\n\n"); } /* -------------------------------------------------------------------- */ /* write out the type object */ -void vtkWrapPython_GenerateObjectType( - FILE *fp, const char *classname, ClassInfo *data, - HierarchyInfo *hinfo) +void vtkWrapPython_GenerateObjectType(FILE *fp, const char *classname) { - char supername[1024]; - const char *name; - int has_superclass = 0; - int is_external = 0; - - /* forward declaration of the type object */ - fprintf(fp, - "#ifndef DECLARED_Py%s_Type\n" - "extern %s PyTypeObject Py%s_Type;\n" - "#define DECLARED_Py%s_Type\n" - "#endif\n" - "\n", - classname, "VTK_PYTHON_EXPORT", classname, classname); - - /* and the superclass */ - has_superclass = vtkWrapPython_HasWrappedSuperClass( - hinfo, data->Name, &is_external); - if (has_superclass) - { - name = vtkWrapPython_GetSuperClass(data, hinfo); - vtkWrapPython_PythonicName(name, supername); - fprintf(fp, - "#ifndef DECLARED_Py%s_Type\n" - "extern %s PyTypeObject Py%s_Type;\n" - "#define DECLARED_Py%s_Type\n" - "#endif\n" - "\n", - supername, (is_external ? "VTK_PYTHON_IMPORT" : "VTK_PYTHON_EXPORT"), - supername, supername); - } - /* Generate the TypeObject */ fprintf(fp, - "PyTypeObject Py%s_Type = {\n" + "static PyTypeObject Py%s_Type = {\n" " PyObject_HEAD_INIT(&PyType_Type)\n" " 0,\n" " \"%s\", // tp_name\n" @@ -513,21 +480,8 @@ void vtkWrapPython_GenerateObjectType( " 0, // tp_iternext\n" " 0, // tp_methods\n" " 0, // tp_members\n" - " PyVTKObject_GetSet, // tp_getset\n"); - - if (has_superclass) - { - fprintf(fp, - " &Py%s_Type, // tp_base\n", - supername); - } - else - { - fprintf(fp, - " 0, // tp_base\n"); - } - - fprintf(fp, + " PyVTKObject_GetSet, // tp_getset\n" + " 0, // tp_base\n" " 0, // tp_dict\n" " 0, // tp_descr_get\n" " 0, // tp_descr_set\n" @@ -620,7 +574,7 @@ int vtkWrapPython_WrapOneClass( if (is_vtkobject) { vtkWrapPython_GenerateObjectType( - fp, classname, data, hinfo); + fp, classname); vtkWrapPython_GenerateObjectNew( fp, classname, data, hinfo, class_has_new); } diff --git a/Wrapping/Tools/vtkWrapPythonType.c b/Wrapping/Tools/vtkWrapPythonType.c index f07ff8bc96abc329ce44f9a3c6e9316b5f17789d..1bb068d23ec8d20d4bf2a4285e14357baeec8781 100644 --- a/Wrapping/Tools/vtkWrapPythonType.c +++ b/Wrapping/Tools/vtkWrapPythonType.c @@ -230,6 +230,10 @@ static void vtkWrapPython_RichCompareProtocol( { info->has_compare = 1; + fprintf(fp, + "static int Py%s_CheckExact(PyObject *ob);\n\n", + classname); + fprintf(fp, "static PyObject *Py%s_RichCompare(\n" " PyObject *o1, PyObject *o2, int opid)\n" @@ -247,7 +251,7 @@ static void vtkWrapPython_RichCompareProtocol( /* use GetPointerFromSpecialObject to do type conversion, but * at least one of the args will already be the correct type */ fprintf(fp, - " if (o%d->ob_type == &Py%s_Type)\n" + " if (Py%s_CheckExact(o%d))\n" " {\n" " PyVTKSpecialObject *s%d = (PyVTKSpecialObject *)o%d;\n" " so%d = static_cast<const %s *>(s%d->vtk_ptr);\n" @@ -265,7 +269,7 @@ static void vtkWrapPython_RichCompareProtocol( " }\n" " }\n" "\n", - i, classname, i, i, i, data->Name, i, i, data->Name, + classname, i, i, i, i, data->Name, i, i, data->Name, i, classname, i, i); } @@ -637,30 +641,13 @@ void vtkWrapPython_GenerateSpecialType( } } - /* forward declaration of the type object */ - fprintf(fp, - "#ifndef DECLARED_Py%s_Type\n" - "extern %s PyTypeObject Py%s_Type;\n" - "#define DECLARED_Py%s_Type\n" - "#endif\n" - "\n", - classname, "VTK_PYTHON_EXPORT", classname, classname); - - /* and the superclass */ + /* get the superclass */ has_superclass = vtkWrapPython_HasWrappedSuperClass( hinfo, data->Name, &is_external); if (has_superclass) { name = vtkWrapPython_GetSuperClass(data, hinfo); vtkWrapPython_PythonicName(name, supername); - fprintf(fp, - "#ifndef DECLARED_Py%s_Type\n" - "extern %s PyTypeObject Py%s_Type;\n" - "#define DECLARED_Py%s_Type\n" - "#endif\n" - "\n", - supername, (is_external ? "VTK_PYTHON_IMPORT" : "VTK_PYTHON_EXPORT"), - supername, supername); } /* generate all constructor methods */ @@ -672,7 +659,7 @@ void vtkWrapPython_GenerateSpecialType( /* Generate the TypeObject */ fprintf(fp, - "PyTypeObject Py%s_Type = {\n" + "static PyTypeObject Py%s_Type = {\n" " PyObject_HEAD_INIT(&PyType_Type)\n" " 0,\n" " \"%s\", // tp_name\n" @@ -751,21 +738,8 @@ void vtkWrapPython_GenerateSpecialType( " 0, // tp_iternext\n" " 0, // tp_methods\n" " 0, // tp_members\n" - " 0, // tp_getset\n"); - - if (has_superclass) - { - fprintf(fp, - " &Py%s_Type, // tp_base\n", - supername); - } - else - { - fprintf(fp, - " 0, // tp_base\n"); - } - - fprintf(fp, + " 0, // tp_getset\n" + " 0, // tp_base\n" " 0, // tp_dict\n" " 0, // tp_descr_get\n" " 0, // tp_descr_set\n" @@ -791,6 +765,17 @@ void vtkWrapPython_GenerateSpecialType( "};\n" "\n"); + /* need a check function for some protocols */ + if (info.has_compare) + { + fprintf(fp, + "static int Py%s_CheckExact(PyObject *ob)\n" + "{\n" + " return (ob->ob_type == &Py%s_Type);\n" + "}\n\n", + classname, classname); + } + /* generate the copy constructor helper function */ fprintf(fp, "static void *Py%s_CCopy(const void *obj)\n" @@ -806,8 +791,8 @@ void vtkWrapPython_GenerateSpecialType( /* export New method for use by subclasses */ fprintf(fp, - "extern \"C\" { %s PyObject *Py%s_TypeNew(const char *); }\n\n", - "VTK_PYTHON_EXPORT", classname); + "extern \"C\" { %s PyObject *Py%s_TypeNew(const char *); }\n\n", + "VTK_PYTHON_EXPORT", classname); /* import New method of the superclass */ if (has_superclass) @@ -835,19 +820,22 @@ void vtkWrapPython_GenerateSpecialType( classname, (int)n, (int)n, constructor, classname, classname); + fprintf(fp, + " PyTypeObject *pytype = &Py%s_Type;\n\n", + classname); + /* if type is already ready, then return */ fprintf(fp, - " if ((Py%s_Type.tp_flags & Py_TPFLAGS_READY) != 0)\n" + " if ((pytype->tp_flags & Py_TPFLAGS_READY) != 0)\n" " {\n" - " return (PyObject *)&Py%s_Type;\n" - " }\n\n", - classname, classname); + " return (PyObject *)pytype;\n" + " }\n\n"); /* call the superclass New (initialize in dependency order) */ if (has_superclass) { fprintf(fp, - " Py%s_TypeNew(0);\n\n", + " pytype->tp_base = (PyTypeObject *)Py%s_TypeNew(0);\n\n", supername); } @@ -863,10 +851,8 @@ void vtkWrapPython_GenerateSpecialType( if (has_constants) { fprintf(fp, - " PyObject *d = Py%s_Type.tp_dict;\n" - " PyObject *o;\n" - "\n", - classname); + " PyObject *d = pytype->tp_dict;\n" + " PyObject *o;\n\n"); /* add any enum types defined in the class to its dict */ vtkWrapPython_AddPublicEnumTypes(fp, " ", "d", "o", data); @@ -876,9 +862,7 @@ void vtkWrapPython_GenerateSpecialType( } fprintf(fp, - " PyType_Ready(&Py%s_Type);\n" - " return (PyObject *)&Py%s_Type;\n" - "}\n" - "\n", - classname, classname); + " PyType_Ready(pytype);\n" + " return (PyObject *)pytype;\n" + "}\n\n"); }