]> granicus.if.org Git - python/commitdiff
It turns out that some calls return AEDesc records that are "borrowed",
authorJack Jansen <jack.jansen@cwi.nl>
Fri, 17 Jan 2003 23:11:17 +0000 (23:11 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Fri, 17 Jan 2003 23:11:17 +0000 (23:11 +0000)
the AEDesc data shouldn't be disposed when the Python object is.

Added a C call AEDesc_NewBorrowed() to create these objects and a Python
method old=AEDesc.AutoDispose(onoff) to change auto-dispose state.

Include/pymactoolbox.h
Mac/Modules/ae/_AEmodule.c
Mac/Modules/ae/aesupport.py
Python/mactoolboxglue.c

index 16f73523f1627666e11b6cd03144990ad0545fc2..2286ebe1a99efe576239dd572e773582736953fc 100644 (file)
@@ -106,6 +106,7 @@ PyObject *PyMac_BuildFSRef(FSRef *);                /* Convert FSRef to PyObject */
 
 /* AE exports */
 extern PyObject *AEDesc_New(AppleEvent *); /* XXXX Why passed by address?? */
+extern PyObject *AEDesc_NewBorrowed(AppleEvent *);
 extern int AEDesc_Convert(PyObject *, AppleEvent *);
 
 /* Cm exports */
index bcb24a75a676a8090f806b3dba3bb8f1719a1ba4..c5445dc883d35d1a97b486f269d83256cdae5d36 100644 (file)
@@ -35,6 +35,7 @@ extern PyObject *_AEDesc_New(AEDesc *);
 extern int _AEDesc_Convert(PyObject *, AEDesc *);
 
 #define AEDesc_New _AEDesc_New
+#define AEDesc_NewBorrowed _AEDesc_NewBorrowed
 #define AEDesc_Convert _AEDesc_Convert
 #endif
 
@@ -70,6 +71,7 @@ PyTypeObject AEDesc_Type;
 typedef struct AEDescObject {
        PyObject_HEAD
        AEDesc ob_itself;
+       int ob_owned;
 } AEDescObject;
 
 PyObject *AEDesc_New(AEDesc *itself)
@@ -78,6 +80,7 @@ PyObject *AEDesc_New(AEDesc *itself)
        it = PyObject_NEW(AEDescObject, &AEDesc_Type);
        if (it == NULL) return NULL;
        it->ob_itself = *itself;
+       it->ob_owned = 1;
        return (PyObject *)it;
 }
 int AEDesc_Convert(PyObject *v, AEDesc *p_itself)
@@ -93,7 +96,7 @@ int AEDesc_Convert(PyObject *v, AEDesc *p_itself)
 
 static void AEDesc_dealloc(AEDescObject *self)
 {
-       AEDisposeDesc(&self->ob_itself);
+       if (self->ob_owned) AEDisposeDesc(&self->ob_itself);
        self->ob_type->tp_free((PyObject *)self);
 }
 
@@ -759,6 +762,20 @@ static PyObject *AEDesc_AEResolve(AEDescObject *_self, PyObject *_args)
        return _res;
 }
 
+static PyObject *AEDesc_AutoDispose(AEDescObject *_self, PyObject *_args)
+{
+       PyObject *_res = NULL;
+
+       int onoff, old;
+       if (!PyArg_ParseTuple(_args, "i", &onoff))
+               return NULL;
+       old = _self->ob_owned;
+       _self->ob_owned = onoff;
+       _res = Py_BuildValue("i", old);
+       return _res;
+
+}
+
 static PyMethodDef AEDesc_methods[] = {
        {"AECoerceDesc", (PyCFunction)AEDesc_AECoerceDesc, 1,
         PyDoc_STR("(DescType toType) -> (AEDesc result)")},
@@ -816,6 +833,8 @@ static PyMethodDef AEDesc_methods[] = {
         PyDoc_STR("() -> None")},
        {"AEResolve", (PyCFunction)AEDesc_AEResolve, 1,
         PyDoc_STR("(short callbackFlags) -> (AEDesc theToken)")},
+       {"AutoDispose", (PyCFunction)AEDesc_AutoDispose, 1,
+        PyDoc_STR("(int)->int. Automatically AEDisposeDesc the object on Python object cleanup")},
        {NULL, NULL, 0}
 };
 
@@ -1413,6 +1432,17 @@ GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype ref
        return noErr;
 }
 
+PyObject *AEDesc_NewBorrowed(AEDesc *itself)
+{
+       PyObject *it;
+       
+       it = AEDesc_New(itself);
+       if (it)
+               ((AEDescObject *)it)->ob_owned = 0;
+       return (PyObject *)it;
+}
+
+
 
 void init_AE(void)
 {
@@ -1424,6 +1454,7 @@ void init_AE(void)
                upp_AEIdleProc = NewAEIdleUPP(AEIdleProc);
                upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler);
                PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New);
+               PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_NewBorrowed);
                PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert);
 
 
index 16b9c5d50b2401a4dbfaaeb529c99124c548284c..89a571baa502aeefac1254c4b7eaf0b95f831861 100644 (file)
@@ -97,6 +97,7 @@ extern PyObject *_AEDesc_New(AEDesc *);
 extern int _AEDesc_Convert(PyObject *, AEDesc *);
 
 #define AEDesc_New _AEDesc_New
+#define AEDesc_NewBorrowed _AEDesc_NewBorrowed
 #define AEDesc_Convert _AEDesc_Convert
 #endif
 
@@ -155,12 +156,24 @@ GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype ref
        Py_DECREF(res);
        return noErr;
 }
+
+PyObject *AEDesc_NewBorrowed(AEDesc *itself)
+{
+       PyObject *it;
+       
+       it = AEDesc_New(itself);
+       if (it)
+               ((AEDescObject *)it)->ob_owned = 0;
+       return (PyObject *)it;
+}
+
 """
 
 initstuff = initstuff + """
        upp_AEIdleProc = NewAEIdleUPP(AEIdleProc);
        upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler);
        PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New);
+       PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_NewBorrowed);
        PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert);
 """
 
@@ -197,8 +210,16 @@ class AEDescDefinition(PEP253Mixin, GlobalObjectDefinition):
                GlobalObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
                self.argref = "*"
 
-       def outputFreeIt(self, name):
-               Output("AEDisposeDesc(&%s);", name)
+       def outputStructMembers(self):
+               GlobalObjectDefinition.outputStructMembers(self)
+               Output("int ob_owned;")
+               
+       def outputInitStructMembers(self):
+               GlobalObjectDefinition.outputInitStructMembers(self)
+               Output("it->ob_owned = 1;")
+               
+       def outputCleanupStructMembers(self):
+               Output("if (self->ob_owned) AEDisposeDesc(&self->ob_itself);")
 
 aedescobject = AEDescDefinition('AEDesc')
 module.addobject(aedescobject)
@@ -209,6 +230,20 @@ aedescmethods = []
 execfile('aegen.py')
 ##execfile('aedatamodelgen.py')
 
+# Manual generator
+AutoDispose_body = """
+int onoff, old;
+if (!PyArg_ParseTuple(_args, "i", &onoff))
+        return NULL;
+old = _self->ob_owned;
+_self->ob_owned = onoff;
+_res = Py_BuildValue("i", old);
+return _res;
+"""
+f = ManualGenerator("AutoDispose", AutoDispose_body)
+f.docstring = lambda: "(int)->int. Automatically AEDisposeDesc the object on Python object cleanup"
+aedescmethods.append(f)
+
 for f in functions: module.add(f)
 for f in aedescmethods: aedescobject.add(f)
 
index 3dfd6991e598e05c429c94ff7bd7649aae9a606f..16ed3b5a11283dde2af55bd65dbe66682e54202c 100644 (file)
@@ -534,6 +534,7 @@ GLUE_NEW(FSRef *, PyMac_BuildFSRef, "macfs")
 GLUE_CONVERT(FSRef, PyMac_GetFSRef, "macfs")
 
 GLUE_NEW(AppleEvent *, AEDesc_New, "Carbon.AE") /* XXXX Why by address? */
+GLUE_NEW(AppleEvent *, AEDesc_NewBorrowed, "Carbon.AE")
 GLUE_CONVERT(AppleEvent, AEDesc_Convert, "Carbon.AE")
 
 GLUE_NEW(Component, CmpObj_New, "Carbon.Cm")