Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and

PyObject_CallMethod() now changed to `const char*`.
Based on patches by Jörg Müller and Lars Buitinck.
This commit is contained in:
Serhiy Storchaka 2013-05-29 18:50:54 +03:00
parent 8d90e383a3
commit 1cfebc73e0
6 changed files with 42 additions and 22 deletions

View File

@ -240,7 +240,7 @@ is considered sufficient for this determination.
of the Python expression ``callable_object(*args)``. of the Python expression ``callable_object(*args)``.
.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, char *format, ...) .. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)
Call a callable Python object *callable*, with a variable number of C arguments. Call a callable Python object *callable*, with a variable number of C arguments.
The C arguments are described using a :c:func:`Py_BuildValue` style format The C arguments are described using a :c:func:`Py_BuildValue` style format
@ -250,8 +250,11 @@ is considered sufficient for this determination.
pass :c:type:`PyObject \*` args, :c:func:`PyObject_CallFunctionObjArgs` is a pass :c:type:`PyObject \*` args, :c:func:`PyObject_CallFunctionObjArgs` is a
faster alternative. faster alternative.
.. versionchanged:: 3.4
The type of *format* was changed from ``char *``.
.. c:function:: PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
.. c:function:: PyObject* PyObject_CallMethod(PyObject *o, const char *method, const char *format, ...)
Call the method named *method* of object *o* with a variable number of C Call the method named *method* of object *o* with a variable number of C
arguments. The C arguments are described by a :c:func:`Py_BuildValue` format arguments. The C arguments are described by a :c:func:`Py_BuildValue` format
@ -261,6 +264,9 @@ is considered sufficient for this determination.
Note that if you only pass :c:type:`PyObject \*` args, Note that if you only pass :c:type:`PyObject \*` args,
:c:func:`PyObject_CallMethodObjArgs` is a faster alternative. :c:func:`PyObject_CallMethodObjArgs` is a faster alternative.
.. versionchanged:: 3.4
The types of *method* and *format* were changed from ``char *``.
.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL) .. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)

View File

@ -218,7 +218,7 @@ PyDict_GetItem:PyObject*:key:0:
PyDict_GetItemString:PyObject*::0: PyDict_GetItemString:PyObject*::0:
PyDict_GetItemString:PyObject*:p:0: PyDict_GetItemString:PyObject*:p:0:
PyDict_GetItemString:char*:key:: PyDict_GetItemString:const char*:key::
PyDict_SetDefault:PyObject*::0: PyDict_SetDefault:PyObject*::0:
PyDict_SetDefault:PyObject*:p:0: PyDict_SetDefault:PyObject*:p:0:
@ -917,7 +917,7 @@ PyObject_Call:PyObject*:kw:0:
PyObject_CallFunction:PyObject*::+1: PyObject_CallFunction:PyObject*::+1:
PyObject_CallFunction:PyObject*:callable_object:0: PyObject_CallFunction:PyObject*:callable_object:0:
PyObject_CallFunction:char*:format:: PyObject_CallFunction:const char*:format::
PyObject_CallFunction::...:: PyObject_CallFunction::...::
PyObject_CallFunctionObjArgs:PyObject*::+1: PyObject_CallFunctionObjArgs:PyObject*::+1:
@ -926,8 +926,8 @@ PyObject_CallFunctionObjArgs::...::
PyObject_CallMethod:PyObject*::+1: PyObject_CallMethod:PyObject*::+1:
PyObject_CallMethod:PyObject*:o:0: PyObject_CallMethod:PyObject*:o:0:
PyObject_CallMethod:char*:m:: PyObject_CallMethod:const char*:m::
PyObject_CallMethod:char*:format:: PyObject_CallMethod:const char*:format::
PyObject_CallMethod::...:: PyObject_CallMethod::...::
PyObject_CallMethodObjArgs:PyObject*::+1: PyObject_CallMethodObjArgs:PyObject*::+1:

View File

@ -284,7 +284,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/ */
PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object,
char *format, ...); const char *format, ...);
/* /*
Call a callable Python object, callable_object, with a Call a callable Python object, callable_object, with a
@ -296,8 +296,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/ */
PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *method, PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o,
char *format, ...); const char *method,
const char *format, ...);
/* /*
Call the method named m of object o with a variable number of Call the method named m of object o with a variable number of
@ -308,8 +309,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
Python expression: o.method(args). Python expression: o.method(args).
*/ */
PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o, _Py_Identifier *method, PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o,
char *format, ...); _Py_Identifier *method,
const char *format, ...);
/* /*
Like PyObject_CallMethod, but expect a _Py_Identifier* as the Like PyObject_CallMethod, but expect a _Py_Identifier* as the
@ -317,13 +319,16 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/ */
PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable,
char *format, ...); const char *format,
...);
PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o,
char *name, const char *name,
char *format, ...); const char *format,
...);
PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o, PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o,
_Py_Identifier *name, _Py_Identifier *name,
char *format, ...); const char *format,
...);
PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable,
...); ...);

View File

@ -174,6 +174,7 @@ Floris Bruynooghe
Stan Bubrouski Stan Bubrouski
Erik de Bueger Erik de Bueger
Jan-Hein Bührman Jan-Hein Bührman
Lars Buitinck
Dick Bulterman Dick Bulterman
Bill Bumgarner Bill Bumgarner
Jimmy Burgett Jimmy Burgett
@ -872,6 +873,7 @@ Neil Muller
Louis Munro Louis Munro
R. David Murray R. David Murray
Matti Mäki Matti Mäki
Jörg Müller
Dale Nagata Dale Nagata
John Nagle John Nagle
Takahiro Nakayama Takahiro Nakayama

View File

@ -387,6 +387,10 @@ Tests
C-API C-API
----- -----
- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and
PyObject_CallMethod() now changed to `const char*`. Based on patches by
Jörg Müller and Lars Buitinck.
- Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now - Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now
expand their arguments once instead of multiple times. Patch written by Illia expand their arguments once instead of multiple times. Patch written by Illia
Polosukhin. Polosukhin.

View File

@ -2142,7 +2142,7 @@ call_function_tail(PyObject *callable, PyObject *args)
} }
PyObject * PyObject *
PyObject_CallFunction(PyObject *callable, char *format, ...) PyObject_CallFunction(PyObject *callable, const char *format, ...)
{ {
va_list va; va_list va;
PyObject *args; PyObject *args;
@ -2162,7 +2162,7 @@ PyObject_CallFunction(PyObject *callable, char *format, ...)
} }
PyObject * PyObject *
_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...) _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
{ {
va_list va; va_list va;
PyObject *args; PyObject *args;
@ -2182,7 +2182,7 @@ _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
} }
static PyObject* static PyObject*
callmethod(PyObject* func, char *format, va_list va, int is_size_t) callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
{ {
PyObject *retval = NULL; PyObject *retval = NULL;
PyObject *args; PyObject *args;
@ -2211,7 +2211,7 @@ callmethod(PyObject* func, char *format, va_list va, int is_size_t)
} }
PyObject * PyObject *
PyObject_CallMethod(PyObject *o, char *name, char *format, ...) PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
{ {
va_list va; va_list va;
PyObject *func = NULL; PyObject *func = NULL;
@ -2232,7 +2232,8 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
} }
PyObject * PyObject *
_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...) _PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
const char *format, ...)
{ {
va_list va; va_list va;
PyObject *func = NULL; PyObject *func = NULL;
@ -2253,7 +2254,8 @@ _PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...)
} }
PyObject * PyObject *
_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...) _PyObject_CallMethod_SizeT(PyObject *o, const char *name,
const char *format, ...)
{ {
va_list va; va_list va;
PyObject *func = NULL; PyObject *func = NULL;
@ -2273,7 +2275,8 @@ _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
} }
PyObject * PyObject *
_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name, char *format, ...) _PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
const char *format, ...)
{ {
va_list va; va_list va;
PyObject *func = NULL; PyObject *func = NULL;