Index: Python/ceval.c =================================================================== --- Python/ceval.c (revision 62050) +++ Python/ceval.c (working copy) @@ -3650,10 +3650,23 @@ if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) { /* optimize access to bound methods */ PyObject *self = PyMethod_GET_SELF(func); + PyObject *mfunc = PyMethod_GET_FUNCTION(func); + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(mfunc); + if (PyFunction_GET_DEFAULTS(mfunc) == NULL && + !(co->co_flags & CO_VARARGS) && + nk == 0 && co->co_argcount != na+1) { + PyErr_Format(PyExc_TypeError, "<%s object>.%s()" + " takes exactly %d arguments (%d given)", + Py_TYPE(self)->tp_name, + PyString_AS_STRING(((PyFunctionObject*)mfunc)->func_name), + co->co_argcount-1, na); + x = NULL; + goto error; + } PCALL(PCALL_METHOD); PCALL(PCALL_BOUND_METHOD); Py_INCREF(self); - func = PyMethod_GET_FUNCTION(func); + func = mfunc; Py_INCREF(func); Py_DECREF(*pfunc); *pfunc = self; @@ -3674,6 +3687,7 @@ the arguments in case they weren't consumed already (fast_function() and err_args() leave them on the stack). */ + error: while ((*pp_stack) > pfunc) { w = EXT_POP(*pp_stack); Py_DECREF(w);