changes for keyword args to built-in functions and classes
This commit is contained in:
parent
ce0a6ded4d
commit
ff8b494cf0
|
@ -1565,21 +1565,42 @@ eval_code2(co, globals, locals,
|
|||
else {
|
||||
object *args = newtupleobject(na);
|
||||
object *kwdict = NULL;
|
||||
if (args == NULL)
|
||||
x = NULL;
|
||||
else if (nk > 0) {
|
||||
err_setstr(SystemError,
|
||||
"calling built-in with keywords not yet implemented");
|
||||
if (args == NULL) {
|
||||
x = NULL;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
while (--na >= 0) {
|
||||
w = POP();
|
||||
SETTUPLEITEM(args, na, w);
|
||||
if (nk > 0) {
|
||||
kwdict = newdictobject();
|
||||
if (kwdict == NULL) {
|
||||
x = NULL;
|
||||
break;
|
||||
}
|
||||
err = 0;
|
||||
while (--nk >= 0) {
|
||||
object *value = POP();
|
||||
object *key = POP();
|
||||
err = mappinginsert(
|
||||
kwdict, key, value);
|
||||
if (err) {
|
||||
DECREF(key);
|
||||
DECREF(value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (err) {
|
||||
DECREF(args);
|
||||
DECREF(kwdict);
|
||||
break;
|
||||
}
|
||||
x = call_object(func, args);
|
||||
DECREF(args);
|
||||
}
|
||||
while (--na >= 0) {
|
||||
w = POP();
|
||||
SETTUPLEITEM(args, na, w);
|
||||
}
|
||||
x = PyEval_CallObjectWithKeywords(
|
||||
func, args, kwdict);
|
||||
DECREF(args);
|
||||
XDECREF(kwdict);
|
||||
}
|
||||
DECREF(func);
|
||||
while (stack_pointer > pfunc) {
|
||||
|
@ -2281,25 +2302,28 @@ call_builtin(func, arg, kw)
|
|||
object *arg;
|
||||
object *kw;
|
||||
{
|
||||
if (kw != NULL) {
|
||||
err_setstr(SystemError,
|
||||
"calling built-in with keywords not yet implemented");
|
||||
return NULL;
|
||||
}
|
||||
if (is_methodobject(func)) {
|
||||
method meth = getmethod(func);
|
||||
object *self = getself(func);
|
||||
if (!getvarargs(func)) {
|
||||
int flags = getflags(func);
|
||||
if (!(flags & METH_VARARGS)) {
|
||||
int size = gettuplesize(arg);
|
||||
if (size == 1)
|
||||
arg = GETTUPLEITEM(arg, 0);
|
||||
else if (size == 0)
|
||||
arg = NULL;
|
||||
}
|
||||
if (flags & METH_KEYWORDS)
|
||||
return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
|
||||
if (kw != NULL) {
|
||||
err_setstr(TypeError,
|
||||
"this function takes no keyword arguments");
|
||||
return NULL;
|
||||
}
|
||||
return (*meth)(self, arg);
|
||||
}
|
||||
if (is_classobject(func)) {
|
||||
return newinstanceobject(func, arg);
|
||||
return newinstanceobject(func, arg, kw);
|
||||
}
|
||||
if (is_instanceobject(func)) {
|
||||
object *res, *call = getattr(func,"__call__");
|
||||
|
@ -2309,7 +2333,7 @@ call_builtin(func, arg, kw)
|
|||
"no __call__ method defined");
|
||||
return NULL;
|
||||
}
|
||||
res = call_object(call, arg);
|
||||
res = PyEval_CallObjectWithKeywords(call, arg, kw);
|
||||
DECREF(call);
|
||||
return res;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue