[3.6] bpo-33132: Fix reference counting issues in the compiler. (GH-6209). by serhiy-storchaka · Pull Request #6321 · python/cpython
Expand Up
@@ -2599,8 +2599,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
PyUnicode_GET_LENGTH(name));
if (!attr)
return 0;
ADDOP_O(c, LOAD_ATTR, attr, names);
Py_DECREF(attr);
ADDOP_N(c, LOAD_ATTR, attr, names);
pos = dot + 1;
}
}
Expand Down
Expand Up
@@ -2628,8 +2627,7 @@ compiler_import(struct compiler *c, stmt_ty s)
if (level == NULL)
return 0;
ADDOP_O(c, LOAD_CONST, level, consts); Py_DECREF(level); ADDOP_N(c, LOAD_CONST, level, consts); ADDOP_O(c, LOAD_CONST, Py_None, consts); ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Expand Down Expand Up @@ -2662,9 +2660,7 @@ static int compiler_from_import(struct compiler *c, stmt_ty s) { Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
PyObject *names = PyTuple_New(n); PyObject *level; PyObject *level, *names; static PyObject *empty_string;
if (!empty_string) { Expand All @@ -2673,14 +2669,15 @@ compiler_from_import(struct compiler *c, stmt_ty s) return 0; }
if (!names) return 0;
level = PyLong_FromLong(s->v.ImportFrom.level); if (!level) { Py_DECREF(names); return 0; } ADDOP_N(c, LOAD_CONST, level, consts);
names = PyTuple_New(n); if (!names) return 0;
/* build up the names */ for (i = 0; i < n; i++) { Expand All @@ -2691,16 +2688,12 @@ compiler_from_import(struct compiler *c, stmt_ty s)
if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module && _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) { Py_DECREF(level); Py_DECREF(names); return compiler_error(c, "from __future__ imports must occur " "at the beginning of the file"); } ADDOP_N(c, LOAD_CONST, names, consts);
ADDOP_O(c, LOAD_CONST, level, consts); Py_DECREF(level); ADDOP_O(c, LOAD_CONST, names, consts); Py_DECREF(names); if (s->v.ImportFrom.module) { ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); } Expand All @@ -2723,7 +2716,6 @@ compiler_from_import(struct compiler *c, stmt_ty s) store_name = alias->asname;
if (!compiler_nameop(c, store_name, Store)) { Py_DECREF(names); return 0; } } Expand Down Expand Up @@ -3101,8 +3093,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) "param invalid for local variable"); return 0; } ADDOP_O(c, op, mangled, varnames); Py_DECREF(mangled); ADDOP_N(c, op, mangled, varnames); return 1; case OP_GLOBAL: switch (ctx) { Expand Down Expand Up @@ -4552,11 +4543,11 @@ compiler_annassign(struct compiler *c, stmt_ty s) if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || c->u->u_scope_type == COMPILER_SCOPE_CLASS)) { VISIT(c, expr, s->v.AnnAssign.annotation); mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id); if (!mangled) { return 0; } VISIT(c, expr, s->v.AnnAssign.annotation); /* ADDOP_N decrefs its argument */ ADDOP_N(c, STORE_ANNOTATION, mangled, names); } Expand Down
ADDOP_O(c, LOAD_CONST, level, consts); Py_DECREF(level); ADDOP_N(c, LOAD_CONST, level, consts); ADDOP_O(c, LOAD_CONST, Py_None, consts); ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Expand Down Expand Up @@ -2662,9 +2660,7 @@ static int compiler_from_import(struct compiler *c, stmt_ty s) { Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
PyObject *names = PyTuple_New(n); PyObject *level; PyObject *level, *names; static PyObject *empty_string;
if (!empty_string) { Expand All @@ -2673,14 +2669,15 @@ compiler_from_import(struct compiler *c, stmt_ty s) return 0; }
if (!names) return 0;
level = PyLong_FromLong(s->v.ImportFrom.level); if (!level) { Py_DECREF(names); return 0; } ADDOP_N(c, LOAD_CONST, level, consts);
names = PyTuple_New(n); if (!names) return 0;
/* build up the names */ for (i = 0; i < n; i++) { Expand All @@ -2691,16 +2688,12 @@ compiler_from_import(struct compiler *c, stmt_ty s)
if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module && _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) { Py_DECREF(level); Py_DECREF(names); return compiler_error(c, "from __future__ imports must occur " "at the beginning of the file"); } ADDOP_N(c, LOAD_CONST, names, consts);
ADDOP_O(c, LOAD_CONST, level, consts); Py_DECREF(level); ADDOP_O(c, LOAD_CONST, names, consts); Py_DECREF(names); if (s->v.ImportFrom.module) { ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); } Expand All @@ -2723,7 +2716,6 @@ compiler_from_import(struct compiler *c, stmt_ty s) store_name = alias->asname;
if (!compiler_nameop(c, store_name, Store)) { Py_DECREF(names); return 0; } } Expand Down Expand Up @@ -3101,8 +3093,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) "param invalid for local variable"); return 0; } ADDOP_O(c, op, mangled, varnames); Py_DECREF(mangled); ADDOP_N(c, op, mangled, varnames); return 1; case OP_GLOBAL: switch (ctx) { Expand Down Expand Up @@ -4552,11 +4543,11 @@ compiler_annassign(struct compiler *c, stmt_ty s) if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || c->u->u_scope_type == COMPILER_SCOPE_CLASS)) { VISIT(c, expr, s->v.AnnAssign.annotation); mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id); if (!mangled) { return 0; } VISIT(c, expr, s->v.AnnAssign.annotation); /* ADDOP_N decrefs its argument */ ADDOP_N(c, STORE_ANNOTATION, mangled, names); } Expand Down