diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2000-01-13 16:23:39 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2000-01-13 16:23:39 (GMT) |
commit | 3d6163ad2d2ad255f19fb9a2c643c602b3155728 (patch) | |
tree | a500dc9da6e2ca2d5f2af7457de29a5401450be0 /Mac | |
parent | 8242c9e4c44e28696808950e061137d7cc6dd407 (diff) | |
download | cpython-3d6163ad2d2ad255f19fb9a2c643c602b3155728.zip cpython-3d6163ad2d2ad255f19fb9a2c643c602b3155728.tar.gz cpython-3d6163ad2d2ad255f19fb9a2c643c602b3155728.tar.bz2 |
List objects obtained through as_List(resource) are not auto-disposed upon
Python object freeing.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/list/Listmodule.c | 20 | ||||
-rw-r--r-- | Mac/Modules/list/listsupport.py | 25 |
2 files changed, 34 insertions, 11 deletions
diff --git a/Mac/Modules/list/Listmodule.c b/Mac/Modules/list/Listmodule.c index c9091e6..0993ad9 100644 --- a/Mac/Modules/list/Listmodule.c +++ b/Mac/Modules/list/Listmodule.c @@ -58,6 +58,7 @@ PyTypeObject List_Type; typedef struct ListObject { PyObject_HEAD ListHandle ob_itself; + int ob_must_be_disposed; } ListObject; PyObject *ListObj_New(itself) @@ -71,6 +72,7 @@ PyObject *ListObj_New(itself) it = PyObject_NEW(ListObject, &List_Type); if (it == NULL) return NULL; it->ob_itself = itself; + it->ob_must_be_disposed = 1; return (PyObject *)it; } ListObj_Convert(v, p_itself) @@ -89,7 +91,7 @@ ListObj_Convert(v, p_itself) static void ListObj_dealloc(self) ListObject *self; { - LDispose(self->ob_itself); + if (self->ob_must_be_disposed && self->ob_itself) LDispose(self->ob_itself); PyMem_DEL(self); } @@ -686,22 +688,22 @@ static PyObject *List_as_List(_self, _args) PyObject *_args; { PyObject *_res = NULL; - ListHandle _rv; + Handle h; - if (!PyArg_ParseTuple(_args, "O&", - ResObj_Convert, &h)) + ListObject *l; + if (!PyArg_ParseTuple(_args, "O&", ResObj_Convert, &h)) return NULL; - _rv = as_List(h); - _res = Py_BuildValue("O&", - ListObj_New, _rv); - return _res; + l = (ListObject *)ListObj_New(as_List(h)); + l->ob_must_be_disposed = 0; + return Py_BuildValue("O", l); + } static PyMethodDef List_methods[] = { {"LNew", (PyCFunction)List_LNew, 1, "(Rect rView, Rect dataBounds, Point cSize, short theProc, WindowPtr theWindow, Boolean drawIt, Boolean hasGrow, Boolean scrollHoriz, Boolean scrollVert) -> (ListHandle _rv)"}, {"as_List", (PyCFunction)List_as_List, 1, - "(Handle h) -> (ListHandle _rv)"}, + "(Resource)->List.\nReturns List object (which is not auto-freed!)"}, {NULL, NULL, 0} }; diff --git a/Mac/Modules/list/listsupport.py b/Mac/Modules/list/listsupport.py index 4fd7d7e..eca08cb 100644 --- a/Mac/Modules/list/listsupport.py +++ b/Mac/Modules/list/listsupport.py @@ -83,13 +83,23 @@ ListObj_setattr(self, name, value) class MyObjectDefinition(GlobalObjectDefinition): + + def outputStructMembers(self): + ObjectDefinition.outputStructMembers(self) + Output("int ob_must_be_disposed;") + def outputCheckNewArg(self): Output("""if (itself == NULL) { PyErr_SetString(List_Error,"Cannot create null List"); return NULL; }""") + + def outputInitStructMembers(self): + ObjectDefinition.outputInitStructMembers(self) + Output("it->ob_must_be_disposed = 1;") + def outputFreeIt(self, itselfname): - Output("LDispose(%s);", itselfname) + Output("if (self->ob_must_be_disposed && %s) LDispose(%s);", itselfname, itselfname) def outputGetattrHook(self): Output(getattrHookCode) @@ -114,7 +124,18 @@ methods = [] execfile(INPUTFILE) # Function to convert any handle to a list and vv. -f = Function(ListHandle, 'as_List', (Handle, 'h', InMode)) +##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode)) +as_List_body = """ +Handle h; +ListObject *l; +if (!PyArg_ParseTuple(_args, "O&", ResObj_Convert, &h)) + return NULL; +l = (ListObject *)ListObj_New(as_List(h)); +l->ob_must_be_disposed = 0; +return Py_BuildValue("O", l); +""" +f = ManualGenerator("as_List", as_List_body) +f.docstring = lambda: "(Resource)->List.\nReturns List object (which is not auto-freed!)" functions.append(f) f = Method(Handle, 'as_Resource', (ListHandle, 'lh', InMode)) |