[PyObjC-svn] r2604 - trunk/pyobjc/pyobjc-core/Modules/objc
[email protected] Tue, 28 Dec 2010 06:04:11 -0600
| Newsgroups | gmane.comp.python.pyobjc.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: ronaldoussoren
Date: Tue Dec 28 06:04:11 2010
New Revision: 2604
Log:
Improve memory management in bridgesupport parser.
Modified:
trunk/pyobjc/pyobjc-core/Modules/objc/parsexml.m
Modified: trunk/pyobjc/pyobjc-core/Modules/objc/parsexml.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/parsexml.m (original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/parsexml.m Tue Dec 28 06:04:11 2010
@@ -641,7 +641,17 @@
return -1;
}
- int r = PyDict_SetItemString(globalDict, name, v);
+ int r;
+ if (PyObjCUnicode_Check(v) &&
+ PyObjC_is_ascii_string(v, name)) {
+ /* avoid duplicate storage for unicode
+ * constants where the name and value
+ * are equal.
+ */
+ r = PyDict_SetItem(globalDict, v, v);
+ } else {
+ r = PyDict_SetItemString(globalDict, name, v);
+ }
if (r == -1) {
if (name) xmlFree(name);
if (type) xmlFree(type);
@@ -664,6 +674,8 @@
if (name != NULL && value != NULL && *value != '\0') {
size_t len = strlen(value);
PyObject* v;
+ BOOL name_equals_value = (strcmp(name, value) == 0);
+
if (nsstring) {
v = PyUnicode_DecodeUTF8(value, len, "strict");
} else {
@@ -675,7 +687,16 @@
return -1;
}
- int r = PyDict_SetItemString(globalDict, name, v);
+ int r;
+ if (name_equals_value
+#if PY_MAJOR_VERSION == 3
+ && nsstring
+#endif
+ ) {
+ r = PyDict_SetItem(globalDict, v, v);
+ } else {
+ r = PyDict_SetItemString(globalDict, name, v);
+ }
Py_DECREF(v);
if (r == -1) {
if (name) xmlFree(name);
@@ -931,6 +952,7 @@
PyObject* metadata = PyDict_New();
if (metadata == NULL) {
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -943,6 +965,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -957,6 +980,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -968,6 +992,7 @@
if (v == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -977,6 +1002,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -987,6 +1013,7 @@
if (v == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -995,6 +1022,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1007,6 +1035,7 @@
if (v == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1015,6 +1044,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1026,6 +1056,7 @@
if (arguments == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1035,6 +1066,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1052,6 +1084,7 @@
if (d == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1062,6 +1095,7 @@
Py_DECREF(d);
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1073,6 +1107,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1083,6 +1118,7 @@
if (d == NULL) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1093,6 +1129,7 @@
if (r == -1) {
Py_DECREF(metadata);
Py_XDECREF(pyClassname);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1100,11 +1137,15 @@
}
}
+ if (c_length) xmlFree(c_length);
+ c_length = NULL;
+
/* Complete metadata for a method, register it */
if (pyClassname == NULL) {
pyClassname = PyBytes_InternFromString(classname);
if (pyClassname == NULL) {
Py_DECREF(metadata);
+ if (c_length) xmlFree(c_length);
xmlFree(selname);
xmlFree(classname);
return -1;
@@ -1158,6 +1199,7 @@
/* Function doesn't exist, don't bother to process
* metadata for it.
*/
+ xmlFree(name);
return 0;
}
}
@@ -1415,6 +1457,8 @@
methodList = PyList_New(0);
if (methodList == NULL) {
xmlFree(name);
+ xmlFree(selector);
+ xmlFree(type);
return -1;
}
}
@@ -1423,6 +1467,8 @@
type, isClassMethod, NULL);
if (m == NULL) {
Py_DECREF(methodList);
+ xmlFree(selector);
+ xmlFree(type);
xmlFree(name);
return -1;
}
@@ -1430,6 +1476,8 @@
Py_DECREF(m);
if (r == -1) {
Py_DECREF(methodList);
+ xmlFree(selector);
+ xmlFree(type);
xmlFree(name);
return -1;
}
@@ -1647,9 +1695,12 @@
PyObject* func_aliases = NULL;
PyObject* cftypes = NULL;
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
if (setupCFClasses) {
cftypes = PyList_New(0);
if (cftypes == NULL) {
+ [pool release];
return -1;
}
}
@@ -1658,6 +1709,7 @@
xmlDoc* doc = xmlReadMemory(data, length,
"noname.xml", NULL, 0 /*XML_PARSE_COMPACT*/);
if (doc == NULL) {
+ [pool release];
PyErr_SetString(PyObjCExc_Error, "invalid bridgesupport file");
return -1;
}
@@ -1674,6 +1726,8 @@
xmlNode* root = xmlDocGetRootElement(doc);
xmlNode* cur_node;
if (root->type != XML_ELEMENT_NODE || strcmp((char*)root->name, "signatures") != 0) {
+ [pool release];
+ xmlFreeDoc(doc);
PyErr_SetString(PyObjCExc_Error, "invalid root node in bridgesupport file");
return -1;
}
@@ -1684,6 +1738,8 @@
func_aliases = PyList_New(0);
if (func_aliases == NULL) {
+ [pool release];
+ xmlFreeDoc(doc);
return -1;
}
@@ -1782,6 +1838,7 @@
Py_DECREF(func_aliases);
xmlFreeDoc(doc);
+ [pool release];
if (PyErr_Occurred()) {
return -1;
} else {
------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl