summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 2b501c79..5d0a8e4 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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;
}
- x = call_object(func, args);
- DECREF(args);
+ 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;
+ }
+ }
+ 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;
}