Issue #27301: Fixed incorrect return codes for errors in compile.c.

This commit is contained in:
Serhiy Storchaka 2016-06-15 20:06:07 +03:00
parent 33e7ca78f9
commit 694de3bff7
1 changed files with 20 additions and 16 deletions

View File

@ -1494,6 +1494,9 @@ static int
compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs, compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
asdl_seq *kw_defaults) asdl_seq *kw_defaults)
{ {
/* Return the number of defaults + 1.
Returns 0 on error.
*/
int i, default_count = 0; int i, default_count = 0;
for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) { for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
arg_ty arg = asdl_seq_GET(kwonlyargs, i); arg_ty arg = asdl_seq_GET(kwonlyargs, i);
@ -1501,16 +1504,16 @@ compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
if (default_) { if (default_) {
PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg); PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
if (!mangled) if (!mangled)
return -1; return 0;
ADDOP_O(c, LOAD_CONST, mangled, consts); ADDOP_O(c, LOAD_CONST, mangled, consts);
Py_DECREF(mangled); Py_DECREF(mangled);
if (!compiler_visit_expr(c, default_)) { if (!compiler_visit_expr(c, default_)) {
return -1; return 0;
} }
default_count++; default_count++;
} }
} }
return default_count; return default_count + 1;
} }
static int static int
@ -1554,17 +1557,17 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args,
expr_ty returns) expr_ty returns)
{ {
/* Push arg annotations and a list of the argument names. Return the # /* Push arg annotations and a list of the argument names. Return the #
of items pushed. The expressions are evaluated out-of-order wrt the of items pushed + 1. The expressions are evaluated out-of-order wrt the
source code. source code.
More than 2^16-1 annotations is a SyntaxError. Returns -1 on error. More than 2^16-1 annotations is a SyntaxError. Returns 0 on error.
*/ */
static identifier return_str; static identifier return_str;
PyObject *names; PyObject *names;
Py_ssize_t len; Py_ssize_t len;
names = PyList_New(0); names = PyList_New(0);
if (!names) if (!names)
return -1; return 0;
if (!compiler_visit_argannotations(c, args->args, names)) if (!compiler_visit_argannotations(c, args->args, names))
goto error; goto error;
@ -1614,11 +1617,11 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args,
Py_DECREF(names); Py_DECREF(names);
/* We just checked that len <= 65535, see above */ /* We just checked that len <= 65535, see above */
return Py_SAFE_DOWNCAST(len, Py_ssize_t, int); return Py_SAFE_DOWNCAST(len + 1, Py_ssize_t, int);
error: error:
Py_DECREF(names); Py_DECREF(names);
return -1; return 0;
} }
static int static int
@ -1667,13 +1670,14 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
if (args->kwonlyargs) { if (args->kwonlyargs) {
int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
args->kw_defaults); args->kw_defaults);
if (res < 0) if (res == 0)
return 0; return 0;
kw_default_count = res; kw_default_count = res - 1;
} }
num_annotations = compiler_visit_annotations(c, args, returns); num_annotations = compiler_visit_annotations(c, args, returns);
if (num_annotations < 0) if (num_annotations == 0)
return 0; return 0;
num_annotations--;
assert((num_annotations & 0xFFFF) == num_annotations); assert((num_annotations & 0xFFFF) == num_annotations);
if (!compiler_enter_scope(c, name, if (!compiler_enter_scope(c, name,
@ -1889,8 +1893,8 @@ compiler_lambda(struct compiler *c, expr_ty e)
if (args->kwonlyargs) { if (args->kwonlyargs) {
int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
args->kw_defaults); args->kw_defaults);
if (res < 0) return 0; if (res == 0) return 0;
kw_default_count = res; kw_default_count = res - 1;
} }
if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA, if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
(void *)e, e->lineno)) (void *)e, e->lineno))
@ -2403,7 +2407,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
PyUnicode_GET_LENGTH(name), 1); PyUnicode_GET_LENGTH(name), 1);
if (dot == -2) if (dot == -2)
return -1; return 0;
if (dot != -1) { if (dot != -1) {
/* Consume the base module name to get the first attribute */ /* Consume the base module name to get the first attribute */
Py_ssize_t pos = dot + 1; Py_ssize_t pos = dot + 1;
@ -2412,12 +2416,12 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
dot = PyUnicode_FindChar(name, '.', pos, dot = PyUnicode_FindChar(name, '.', pos,
PyUnicode_GET_LENGTH(name), 1); PyUnicode_GET_LENGTH(name), 1);
if (dot == -2) if (dot == -2)
return -1; return 0;
attr = PyUnicode_Substring(name, pos, attr = PyUnicode_Substring(name, pos,
(dot != -1) ? dot : (dot != -1) ? dot :
PyUnicode_GET_LENGTH(name)); PyUnicode_GET_LENGTH(name));
if (!attr) if (!attr)
return -1; return 0;
ADDOP_O(c, LOAD_ATTR, attr, names); ADDOP_O(c, LOAD_ATTR, attr, names);
Py_DECREF(attr); Py_DECREF(attr);
pos = dot + 1; pos = dot + 1;