From 8cc62c9706607dd61404ad11d7753d77a86cea61 Mon Sep 17 00:00:00 2001 From: "John C. Allwein" Date: Sat, 11 May 2024 22:31:22 -0600 Subject: [PATCH] interrogate: avoid GC exceptions processing objects mid-construction After 38692dd525525e20cd06204a646b35dd7e39902a, GC pauses occuring before the __init__ function of the C++ backed object is called in a inheritance chain will cause an exception during garbage collection and cause the python runtime to exit. This can be observed by say, forcing a GC-pause in MetaInterval.__init__ before it calls CMetaInterval::__init__. --- dtool/src/interrogate/interfaceMakerPythonNative.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index d10722f68a..ddf36d4789 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -3057,9 +3057,10 @@ write_module_class(ostream &out, Object *obj) { out << "static int Dtool_Traverse_" << ClassName << "(PyObject *self, visitproc visit, void *arg) {\n"; out << " // If the only reference remaining is the one held by the Python wrapper,\n"; out << " // report the circular reference to Python's GC, so that it can break it.\n"; - out << " " << cClassName << " *local_this = nullptr;\n"; - out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; - out << " return -1;\n"; + out << " " << cClassName << " *local_this;\n"; + out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void**)(&local_this));\n"; + out << " if (local_this == nullptr) {\n"; + out << " return 0;\n"; out << " }\n"; out << " if (local_this->get_ref_count() == (int)((Dtool_PyInstDef *)self)->_memory_rules) {\n"; if (py_subclassable) {