[Python-checkins] bpo-33132: Fix reference counting issues in the compiler. (GH-6209)

Miss Islington (bot) webhook-mailer at python.org
Sat Mar 24 17:27:09 EDT 2018


https://github.com/python/cpython/commit/471364b4d977fc31bdf3012912954f24e4867d52
commit: 471364b4d977fc31bdf3012912954f24e4867d52
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018年03月24日T14:27:06-07:00
summary:
bpo-33132: Fix reference counting issues in the compiler. (GH-6209)
(cherry picked from commit a95d98607efe0c43475b354543e49bf8e240bc6f)
Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>
files:
M Python/compile.c
diff --git a/Python/compile.c b/Python/compile.c
index 618f31a47d36..03b4826b761b 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2808,9 +2808,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) {
@@ -2819,14 +2817,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++) {
@@ -2837,16 +2836,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);
 }
@@ -2869,7 +2864,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;
 }
 }
@@ -4687,10 +4681,6 @@ 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)) {
- mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
- if (!mangled) {
- return 0;
- }
 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
 VISIT(c, annexpr, s->v.AnnAssign.annotation)
 }
@@ -4698,8 +4688,11 @@ compiler_annassign(struct compiler *c, stmt_ty s)
 VISIT(c, expr, s->v.AnnAssign.annotation);
 }
 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
- ADDOP_O(c, LOAD_CONST, mangled, consts);
- Py_DECREF(mangled);
+ mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
+ if (!mangled) {
+ return 0;
+ }
+ ADDOP_N(c, LOAD_CONST, mangled, consts);
 ADDOP(c, STORE_SUBSCR);
 }
 break;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /