mirror of https://github.com/python/cpython
Fix memory leak on attributes.
This commit is contained in:
parent
26cc63f867
commit
03e5bc02c9
|
@ -607,7 +607,9 @@ class ObjVisitor(PickleVisitor):
|
||||||
for a in sum.attributes:
|
for a in sum.attributes:
|
||||||
self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1)
|
self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1)
|
||||||
self.emit("if (!value) goto failed;", 1)
|
self.emit("if (!value) goto failed;", 1)
|
||||||
self.emit('PyObject_SetAttrString(result, "%s", value);' % a.name, 1)
|
self.emit('if (PyObject_SetAttrString(result, "%s", value) < 0)' % a.name, 1)
|
||||||
|
self.emit('goto failed;', 2)
|
||||||
|
self.emit('Py_DECREF(value);', 1)
|
||||||
self.func_end()
|
self.func_end()
|
||||||
|
|
||||||
def simpleSum(self, sum, name):
|
def simpleSum(self, sum, name):
|
||||||
|
|
|
@ -2324,10 +2324,14 @@ ast2obj_stmt(void* _o)
|
||||||
}
|
}
|
||||||
value = ast2obj_int(o->lineno);
|
value = ast2obj_int(o->lineno);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
PyObject_SetAttrString(result, "lineno", value);
|
if (PyObject_SetAttrString(result, "lineno", value) < 0)
|
||||||
|
goto failed;
|
||||||
|
Py_DECREF(value);
|
||||||
value = ast2obj_int(o->col_offset);
|
value = ast2obj_int(o->col_offset);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
PyObject_SetAttrString(result, "col_offset", value);
|
if (PyObject_SetAttrString(result, "col_offset", value) < 0)
|
||||||
|
goto failed;
|
||||||
|
Py_DECREF(value);
|
||||||
return result;
|
return result;
|
||||||
failed:
|
failed:
|
||||||
Py_XDECREF(value);
|
Py_XDECREF(value);
|
||||||
|
@ -2643,10 +2647,14 @@ ast2obj_expr(void* _o)
|
||||||
}
|
}
|
||||||
value = ast2obj_int(o->lineno);
|
value = ast2obj_int(o->lineno);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
PyObject_SetAttrString(result, "lineno", value);
|
if (PyObject_SetAttrString(result, "lineno", value) < 0)
|
||||||
|
goto failed;
|
||||||
|
Py_DECREF(value);
|
||||||
value = ast2obj_int(o->col_offset);
|
value = ast2obj_int(o->col_offset);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
PyObject_SetAttrString(result, "col_offset", value);
|
if (PyObject_SetAttrString(result, "col_offset", value) < 0)
|
||||||
|
goto failed;
|
||||||
|
Py_DECREF(value);
|
||||||
return result;
|
return result;
|
||||||
failed:
|
failed:
|
||||||
Py_XDECREF(value);
|
Py_XDECREF(value);
|
||||||
|
@ -3023,7 +3031,7 @@ init_ast(void)
|
||||||
if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return;
|
if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return;
|
||||||
if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
|
if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
|
||||||
return;
|
return;
|
||||||
if (PyModule_AddStringConstant(m, "__version__", "42649") < 0)
|
if (PyModule_AddStringConstant(m, "__version__", "42753") < 0)
|
||||||
return;
|
return;
|
||||||
if(PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return;
|
if(PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return;
|
||||||
if(PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
|
if(PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
|
||||||
|
|
Loading…
Reference in New Issue