summaryrefslogtreecommitdiffstats
path: root/Mac
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2000-01-13 16:23:39 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2000-01-13 16:23:39 (GMT)
commit3d6163ad2d2ad255f19fb9a2c643c602b3155728 (patch)
treea500dc9da6e2ca2d5f2af7457de29a5401450be0 /Mac
parent8242c9e4c44e28696808950e061137d7cc6dd407 (diff)
downloadcpython-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.c20
-rw-r--r--Mac/Modules/list/listsupport.py25
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))