It turns out that some calls return AEDesc records that are "borrowed",
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.
diff --git a/Include/pymactoolbox.h b/Include/pymactoolbox.h
index 16f7352..2286ebe 100644
--- a/Include/pymactoolbox.h
+++ b/Include/pymactoolbox.h
@@ -106,6 +106,7 @@
 
 /* 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 */
diff --git a/Mac/Modules/ae/_AEmodule.c b/Mac/Modules/ae/_AEmodule.c
index bcb24a7..c5445dc 100644
--- a/Mac/Modules/ae/_AEmodule.c
+++ b/Mac/Modules/ae/_AEmodule.c
@@ -35,6 +35,7 @@
 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 @@
 typedef struct AEDescObject {
 	PyObject_HEAD
 	AEDesc ob_itself;
+	int ob_owned;
 } AEDescObject;
 
 PyObject *AEDesc_New(AEDesc *itself)
@@ -78,6 +80,7 @@
 	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 @@
 
 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 @@
 	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 @@
 	 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 @@
 	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 @@
 		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);
 
 
diff --git a/Mac/Modules/ae/aesupport.py b/Mac/Modules/ae/aesupport.py
index 16b9c5d..89a571b 100644
--- a/Mac/Modules/ae/aesupport.py
+++ b/Mac/Modules/ae/aesupport.py
@@ -97,6 +97,7 @@
 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 @@
 	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 @@
 		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 @@
 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)
 
diff --git a/Python/mactoolboxglue.c b/Python/mactoolboxglue.c
index 3dfd699..16ed3b5 100644
--- a/Python/mactoolboxglue.c
+++ b/Python/mactoolboxglue.c
@@ -534,6 +534,7 @@
 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")