1010
1111#define HASINDEX (o ) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX)
1212
13+ #ifdef HAVE_DECLSPEC_DLL
14+ PyAPI_FUNC (PyObject * ) _PyObject_CallFunction_SizeT (PyObject * callable_object ,
15+ char * format , ...);
16+ PyAPI_FUNC (PyObject * ) _PyObject_CallMethod_SizeT (PyObject * o , char * m ,
17+ char * format , ...);
18+ #endif
19+
20+
1321/* Shorthands to return certain errors */
1422
1523static PyObject *
@@ -1800,11 +1808,37 @@ PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
18001808 return NULL ;
18011809}
18021810
1811+ static PyObject *
1812+ call_function_tail (PyObject * callable , PyObject * args )
1813+ {
1814+ PyObject * retval ;
1815+
1816+ if (args == NULL )
1817+ return NULL ;
1818+
1819+ if (!PyTuple_Check (args )) {
1820+ PyObject * a ;
1821+
1822+ a = PyTuple_New (1 );
1823+ if (a == NULL ) {
1824+ Py_DECREF (args );
1825+ return NULL ;
1826+ }
1827+ PyTuple_SET_ITEM (a , 0 , args );
1828+ args = a ;
1829+ }
1830+ retval = PyObject_Call (callable , args , NULL );
1831+
1832+ Py_DECREF (args );
1833+
1834+ return retval ;
1835+ }
1836+
18031837PyObject *
18041838PyObject_CallFunction (PyObject * callable , char * format , ...)
18051839{
18061840 va_list va ;
1807- PyObject * args , * retval ;
1841+ PyObject * args ;
18081842
18091843 if (callable == NULL )
18101844 return null_error ();
@@ -1817,31 +1851,34 @@ PyObject_CallFunction(PyObject *callable, char *format, ...)
18171851 else
18181852 args = PyTuple_New (0 );
18191853
1820- if ( args == NULL )
1821- return NULL ;
1854+ return call_function_tail ( callable , args );
1855+ }
18221856
1823- if (!PyTuple_Check (args )) {
1824- PyObject * a ;
1857+ PyObject *
1858+ _PyObject_CallFunction_SizeT (PyObject * callable , char * format , ...)
1859+ {
1860+ va_list va ;
1861+ PyObject * args ;
18251862
1826- a = PyTuple_New (1 );
1827- if (a == NULL )
1828- return NULL ;
1829- if (PyTuple_SetItem (a , 0 , args ) < 0 )
1830- return NULL ;
1831- args = a ;
1832- }
1833- retval = PyObject_Call (callable , args , NULL );
1863+ if (callable == NULL )
1864+ return null_error ();
18341865
1835- Py_DECREF (args );
1866+ if (format && * format ) {
1867+ va_start (va , format );
1868+ args = _Py_VaBuildValue_SizeT (format , va );
1869+ va_end (va );
1870+ }
1871+ else
1872+ args = PyTuple_New (0 );
18361873
1837- return retval ;
1874+ return call_function_tail ( callable , args ) ;
18381875}
18391876
18401877PyObject *
18411878PyObject_CallMethod (PyObject * o , char * name , char * format , ...)
18421879{
18431880 va_list va ;
1844- PyObject * args = NULL ;
1881+ PyObject * args ;
18451882 PyObject * func = NULL ;
18461883 PyObject * retval = NULL ;
18471884
@@ -1867,24 +1904,49 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
18671904 else
18681905 args = PyTuple_New (0 );
18691906
1870- if (!args )
1871- goto exit ;
1907+ retval = call_function_tail (func , args );
18721908
1873- if (!PyTuple_Check (args )) {
1874- PyObject * a ;
1909+ exit :
1910+ /* args gets consumed in call_function_tail */
1911+ Py_XDECREF (func );
18751912
1876- a = PyTuple_New (1 );
1877- if (a == NULL )
1878- goto exit ;
1879- if (PyTuple_SetItem (a , 0 , args ) < 0 )
1880- goto exit ;
1881- args = a ;
1913+ return retval ;
1914+ }
1915+
1916+ PyObject *
1917+ _PyObject_CallMethod_SizeT (PyObject * o , char * name , char * format , ...)
1918+ {
1919+ va_list va ;
1920+ PyObject * args ;
1921+ PyObject * func = NULL ;
1922+ PyObject * retval = NULL ;
1923+
1924+ if (o == NULL || name == NULL )
1925+ return null_error ();
1926+
1927+ func = PyObject_GetAttrString (o , name );
1928+ if (func == NULL ) {
1929+ PyErr_SetString (PyExc_AttributeError , name );
1930+ return 0 ;
1931+ }
1932+
1933+ if (!PyCallable_Check (func )) {
1934+ type_error ("call of non-callable attribute" );
1935+ goto exit ;
1936+ }
1937+
1938+ if (format && * format ) {
1939+ va_start (va , format );
1940+ args = _Py_VaBuildValue_SizeT (format , va );
1941+ va_end (va );
18821942 }
1943+ else
1944+ args = PyTuple_New (0 );
18831945
1884- retval = PyObject_Call (func , args , NULL );
1946+ retval = call_function_tail (func , args );
18851947
18861948 exit :
1887- Py_XDECREF ( args );
1949+ /* args gets consumed in call_function_tail */
18881950 Py_XDECREF (func );
18891951
18901952 return retval ;
0 commit comments