diff -r 31342913fb1e Objects/abstract.c --- a/Objects/abstract.c Thu Feb 09 02:01:37 2017 +0100 +++ b/Objects/abstract.c Thu Feb 09 19:31:33 2017 +0900 @@ -2745,13 +2745,12 @@ PyObject * } static PyObject * -object_vacall(PyObject *callable, va_list vargs) +object_vacall(PyObject *callable, PyObject *self, va_list vargs) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; Py_ssize_t nargs; PyObject *result; - Py_ssize_t i; va_list countva; if (callable == NULL) { @@ -2760,7 +2759,7 @@ object_vacall(PyObject *callable, va_lis /* Count the number of arguments */ va_copy(countva, vargs); - nargs = 0; + nargs = (self != NULL); while (1) { PyObject *arg = va_arg(countva, PyObject *); if (arg == NULL) { @@ -2782,7 +2781,11 @@ object_vacall(PyObject *callable, va_lis } } - for (i = 0; i < nargs; ++i) { + Py_ssize_t i = 0; + if (self != NULL) { + stack[i++] = self; + } + for (; i < nargs; ++i) { stack[i] = va_arg(vargs, PyObject *); } @@ -2795,23 +2798,32 @@ object_vacall(PyObject *callable, va_lis return result; } +extern int +_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + PyObject * -PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) +PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) { va_list vargs; PyObject *result; - if (callable == NULL || name == NULL) { + if (obj == NULL || name == NULL) { return null_error(); } - callable = PyObject_GetAttr(callable, name); + PyObject *callable; + int meth_found = _PyObject_GetMethod(obj, name, &callable); if (callable == NULL) { return NULL; } va_start(vargs, name); - result = object_vacall(callable, vargs); + if (meth_found) { + result = object_vacall(callable, obj, vargs); + } + else { + result = object_vacall(callable, NULL, vargs); + } va_end(vargs); Py_DECREF(callable); @@ -2829,13 +2841,19 @@ PyObject * return null_error(); } - callable = _PyObject_GetAttrId(obj, name); + int meth_found = _PyObject_GetMethod( + obj, _PyUnicode_FromId(name), &callable); if (callable == NULL) { return NULL; } va_start(vargs, name); - result = object_vacall(callable, vargs); + if (meth_found) { + result = object_vacall(callable, obj, vargs); + } + else { + result = object_vacall(callable, NULL, vargs); + } va_end(vargs); Py_DECREF(callable); @@ -2849,7 +2867,7 @@ PyObject_CallFunctionObjArgs(PyObject *c PyObject *result; va_start(vargs, callable); - result = object_vacall(callable, vargs); + result = object_vacall(callable, NULL, vargs); va_end(vargs); return result; diff -r 31342913fb1e Objects/object.c --- a/Objects/object.c Thu Feb 09 02:01:37 2017 +0100 +++ b/Objects/object.c Thu Feb 09 19:31:33 2017 +0900 @@ -785,7 +785,7 @@ PyObject_GetAttrString(PyObject *v, cons if (Py_TYPE(v)->tp_getattr != NULL) return (*Py_TYPE(v)->tp_getattr)(v, (char*)name); - w = PyUnicode_InternFromString(name); + w = PyUnicode_FromString(name); if (w == NULL) return NULL; res = PyObject_GetAttr(v, w);