Issue #27301: Fixed incorrect return codes for errors in compile.c.
This commit is contained in:
parent
33e7ca78f9
commit
694de3bff7
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue