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);