Replace PyObject_GetAttrString with direct type references
Replace ~230 occurrences of PyObject_GetAttrString(McRFPy_API::mcrf_module, "TypeName") with direct &mcrfpydef::PyXxxType references across 32 source files. Each PyObject_GetAttrString call returns a new reference. When used inline in PyObject_IsInstance(), that reference was immediately leaked. When used for tp_alloc, the reference required careful Py_DECREF management that was often missing on error paths. Direct type references are compile-time constants that never need reference counting, eliminating ~230 potential leak sites and removing ~100 lines of Py_DECREF/Py_XDECREF cleanup code. Also adds extractDrawable() helper in UICollection.cpp to replace repeated 8-way type-check-and-extract chains with a single function call. Closes #267, closes #268 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
348826a0f5
commit
71eb01c950
32 changed files with 249 additions and 944 deletions
|
|
@ -74,14 +74,7 @@ PyObject* PyMouse::get_pos(PyObject* self, void* closure)
|
|||
sf::Vector2i pos = getMousePosition();
|
||||
|
||||
// Return a Vector object
|
||||
auto vector_type = (PyTypeObject*)PyObject_GetAttrString(McRFPy_API::mcrf_module, "Vector");
|
||||
if (!vector_type) {
|
||||
PyErr_SetString(PyExc_RuntimeError, "Vector type not found in mcrfpy module");
|
||||
return NULL;
|
||||
}
|
||||
PyObject* result = PyObject_CallFunction((PyObject*)vector_type, "ff", (float)pos.x, (float)pos.y);
|
||||
Py_DECREF(vector_type);
|
||||
return result;
|
||||
return PyObject_CallFunction((PyObject*)&mcrfpydef::PyVectorType, "ff", (float)pos.x, (float)pos.y);
|
||||
}
|
||||
|
||||
PyObject* PyMouse::get_left(PyObject* self, void* closure)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue