Commit 232ecb89 authored by Benjamin Peterson's avatar Benjamin Peterson

cleanup a bit

parent a567a779
...@@ -3041,6 +3041,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3041,6 +3041,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
register PyObject **fastlocals, **freevars; register PyObject **fastlocals, **freevars;
PyThreadState *tstate = PyThreadState_GET(); PyThreadState *tstate = PyThreadState_GET();
PyObject *x, *u; PyObject *x, *u;
int total_args = co->co_argcount + co->co_kwonlyargcount;
if (globals == NULL) { if (globals == NULL) {
PyErr_SetString(PyExc_SystemError, PyErr_SetString(PyExc_SystemError,
...@@ -3057,9 +3058,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3057,9 +3058,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
fastlocals = f->f_localsplus; fastlocals = f->f_localsplus;
freevars = f->f_localsplus + co->co_nlocals; freevars = f->f_localsplus + co->co_nlocals;
if (co->co_argcount > 0 || if (total_args || co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
co->co_kwonlyargcount > 0 ||
co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
int i; int i;
int n = argcount; int n = argcount;
PyObject *kwdict = NULL; PyObject *kwdict = NULL;
...@@ -3067,7 +3066,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3067,7 +3066,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
kwdict = PyDict_New(); kwdict = PyDict_New();
if (kwdict == NULL) if (kwdict == NULL)
goto fail; goto fail;
i = co->co_argcount + co->co_kwonlyargcount; i = total_args;
if (co->co_flags & CO_VARARGS) if (co->co_flags & CO_VARARGS)
i++; i++;
SETLOCAL(i, kwdict); SETLOCAL(i, kwdict);
...@@ -3095,7 +3094,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3095,7 +3094,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
u = PyTuple_New(argcount - n); u = PyTuple_New(argcount - n);
if (u == NULL) if (u == NULL)
goto fail; goto fail;
SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u); SETLOCAL(total_args, u);
for (i = n; i < argcount; i++) { for (i = n; i < argcount; i++) {
x = args[i]; x = args[i];
Py_INCREF(x); Py_INCREF(x);
...@@ -3116,17 +3115,13 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3116,17 +3115,13 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
/* Speed hack: do raw pointer compares. As names are /* Speed hack: do raw pointer compares. As names are
normally interned this should almost always hit. */ normally interned this should almost always hit. */
co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
for (j = 0; for (j = 0; j < total_args; j++) {
j < co->co_argcount + co->co_kwonlyargcount;
j++) {
PyObject *nm = co_varnames[j]; PyObject *nm = co_varnames[j];
if (nm == keyword) if (nm == keyword)
goto kw_found; goto kw_found;
} }
/* Slow fallback, just in case */ /* Slow fallback, just in case */
for (j = 0; for (j = 0; j < total_args; j++) {
j < co->co_argcount + co->co_kwonlyargcount;
j++) {
PyObject *nm = co_varnames[j]; PyObject *nm = co_varnames[j];
int cmp = PyObject_RichCompareBool( int cmp = PyObject_RichCompareBool(
keyword, nm, Py_EQ); keyword, nm, Py_EQ);
...@@ -3138,15 +3133,13 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3138,15 +3133,13 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
/* Check errors from Compare */ /* Check errors from Compare */
if (PyErr_Occurred()) if (PyErr_Occurred())
goto fail; goto fail;
if (j >= co->co_argcount + co->co_kwonlyargcount) { if (j >= total_args && kwdict == NULL) {
if (kwdict == NULL) { PyErr_Format(PyExc_TypeError,
PyErr_Format(PyExc_TypeError, "%U() got an unexpected "
"%U() got an unexpected " "keyword argument '%S'",
"keyword argument '%S'", co->co_name,
co->co_name, keyword);
keyword); goto fail;
goto fail;
}
} }
PyDict_SetItem(kwdict, keyword, value); PyDict_SetItem(kwdict, keyword, value);
continue; continue;
...@@ -3164,9 +3157,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3164,9 +3157,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
SETLOCAL(j, value); SETLOCAL(j, value);
} }
if (co->co_kwonlyargcount > 0) { if (co->co_kwonlyargcount > 0) {
for (i = co->co_argcount; for (i = co->co_argcount; i < total_args; i++) {
i < co->co_argcount + co->co_kwonlyargcount;
i++) {
PyObject *name, *def; PyObject *name, *def;
if (GETLOCAL(i) != NULL) if (GETLOCAL(i) != NULL)
continue; continue;
...@@ -3232,7 +3223,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, ...@@ -3232,7 +3223,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Py_UNICODE *cellname, *argname; Py_UNICODE *cellname, *argname;
PyObject *c; PyObject *c;
nargs = co->co_argcount + co->co_kwonlyargcount; nargs = total_args;
if (co->co_flags & CO_VARARGS) if (co->co_flags & CO_VARARGS)
nargs++; nargs++;
if (co->co_flags & CO_VARKEYWORDS) if (co->co_flags & CO_VARKEYWORDS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment