@@ -834,12 +834,15 @@ PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
834834 assert (PyVectorcall_NARGS (nargsf ) >= 1 );
835835
836836 PyThreadState * tstate = _PyThreadState_GET ();
837- PyObject * callable = NULL ;
837+ _PyCStackRef method ;
838+ _PyThreadState_PushCStackRef (tstate , & method );
838839 /* Use args[0] as "self" argument */
839- int unbound = _PyObject_GetMethod (args [0 ], name , & callable );
840- if (callable == NULL ) {
840+ int unbound = _PyObject_GetMethodStackRef (tstate , args [0 ], name , & method .ref );
841+ if (PyStackRef_IsNull (method .ref )) {
842+ _PyThreadState_PopCStackRef (tstate , & method );
841843 return NULL ;
842844 }
845+ PyObject * callable = PyStackRef_AsPyObjectBorrow (method .ref );
843846
844847 if (unbound ) {
845848 /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
@@ -855,7 +858,7 @@ PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
855858 EVAL_CALL_STAT_INC_IF_FUNCTION (EVAL_CALL_METHOD , callable );
856859 PyObject * result = _PyObject_VectorcallTstate (tstate , callable ,
857860 args , nargsf , kwnames );
858- Py_DECREF ( callable );
861+ _PyThreadState_PopCStackRef ( tstate , & method );
859862 return result ;
860863}
861864
@@ -868,19 +871,22 @@ PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
868871 return null_error (tstate );
869872 }
870873
871- PyObject * callable = NULL ;
872- int is_method = _PyObject_GetMethod (obj , name , & callable );
873- if (callable == NULL ) {
874+ _PyCStackRef method ;
875+ _PyThreadState_PushCStackRef (tstate , & method );
876+ int is_method = _PyObject_GetMethodStackRef (tstate , obj , name , & method .ref );
877+ if (PyStackRef_IsNull (method .ref )) {
878+ _PyThreadState_PopCStackRef (tstate , & method );
874879 return NULL ;
875880 }
881+ PyObject * callable = PyStackRef_AsPyObjectBorrow (method .ref );
876882 obj = is_method ? obj : NULL ;
877883
878884 va_list vargs ;
879885 va_start (vargs , name );
880886 PyObject * result = object_vacall (tstate , obj , callable , vargs );
881887 va_end (vargs );
882888
883- Py_DECREF ( callable );
889+ _PyThreadState_PopCStackRef ( tstate , & method );
884890 return result ;
885891}
886892
@@ -897,20 +903,23 @@ _PyObject_CallMethodIdObjArgs(PyObject *obj, _Py_Identifier *name, ...)
897903 if (!oname ) {
898904 return NULL ;
899905 }
900-
901- PyObject * callable = NULL ;
902- int is_method = _PyObject_GetMethod (obj , oname , & callable );
903- if (callable == NULL ) {
906+ _PyCStackRef method ;
907+ _PyThreadState_PushCStackRef (tstate , & method );
908+ int is_method = _PyObject_GetMethodStackRef (tstate , obj , oname , & method .ref );
909+ if (PyStackRef_IsNull (method .ref )) {
910+ _PyThreadState_PopCStackRef (tstate , & method );
904911 return NULL ;
905912 }
913+ PyObject * callable = PyStackRef_AsPyObjectBorrow (method .ref );
914+
906915 obj = is_method ? obj : NULL ;
907916
908917 va_list vargs ;
909918 va_start (vargs , name );
910919 PyObject * result = object_vacall (tstate , obj , callable , vargs );
911920 va_end (vargs );
912921
913- Py_DECREF ( callable );
922+ _PyThreadState_PopCStackRef ( tstate , & method );
914923 return result ;
915924}
916925
0 commit comments