Skip to content

Commit 5c91d4c

Browse files
author
martin.v.loewis
committed
Make Py_BuildValue, PyObject_CallFunction and
PyObject_CallMethod aware of PY_SSIZE_T_CLEAN. git-svn-id: http://svn.python.org/projects/python/trunk@45379 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent b89936d commit 5c91d4c

8 files changed

Lines changed: 172 additions & 65 deletions

File tree

Include/abstract.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
extern "C" {
55
#endif
66

7+
#ifdef PY_SSIZE_T_CLEAN
8+
#define PyObject_CallFunction _PyObject_CallFunction_SizeT
9+
#define PyObject_CallMethod _PyObject_CallMethod_SizeT
10+
#endif
11+
712
/* Abstract Object Interface (many thanks to Jim Fulton) */
813

914
/*

Include/modsupport.h

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,11 @@ extern "C" {
1717
#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT
1818
#define PyArg_VaParse _PyArg_VaParse_SizeT
1919
#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT
20-
#define PyArg_BuildValue _PyArg_BuildValue_SizeT
21-
#define PyArg_VaBuildValue _PyArg_VaBuildValue_SizeT
20+
#define Py_BuildValue _Py_BuildValue_SizeT
21+
#define Py_VaBuildValue _Py_VaBuildValue_SizeT
2222
#else
23-
#ifdef HAVE_DECLSPEC_DLL
24-
PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...);
25-
PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...);
26-
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
27-
const char *, char **, ...);
28-
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
29-
PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list);
30-
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
31-
const char *, char **, va_list);
3223
PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list);
3324
#endif
34-
#endif
3525

3626
PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...);
3727
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);

Objects/abstract.c

Lines changed: 90 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@
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

1523
static 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+
18031837
PyObject *
18041838
PyObject_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

18401877
PyObject *
18411878
PyObject_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;

Objects/stringobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* String object implementation */
22

3+
#define PY_SSIZE_T_CLEAN
34
#include "Python.h"
45

56
#include <ctype.h>

Objects/unicodeobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3636
3737
*/
3838

39+
#define PY_SSIZE_T_CLEAN
3940
#include "Python.h"
4041

4142
#include "unicodeobject.h"

Python/exceptions.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Copyright (c) 1998-2000 by Secret Labs AB. All rights reserved.
1515
*/
1616

17+
#define PY_SSIZE_T_CLEAN
1718
#include "Python.h"
1819
#include "osdefs.h"
1920

@@ -1450,8 +1451,8 @@ PyObject * PyUnicodeDecodeError_Create(
14501451
assert(length < INT_MAX);
14511452
assert(start < INT_MAX);
14521453
assert(end < INT_MAX);
1453-
return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#iis",
1454-
encoding, object, (int)length, (int)start, (int)end, reason);
1454+
return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
1455+
encoding, object, length, start, end, reason);
14551456
}
14561457

14571458

@@ -1565,7 +1566,7 @@ PyObject * PyUnicodeTranslateError_Create(
15651566
const Py_UNICODE *object, Py_ssize_t length,
15661567
Py_ssize_t start, Py_ssize_t end, const char *reason)
15671568
{
1568-
return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#iis",
1569+
return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
15691570
object, length, start, end, reason);
15701571
}
15711572
#endif

Python/getargs.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
1818
int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
1919
const char *, char **, va_list);
2020

21+
#ifdef HAVE_DECLSPEC_DLL
22+
/* Export functions */
23+
PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...);
24+
PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...);
25+
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
26+
const char *, char **, ...);
27+
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
28+
PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list);
29+
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
30+
const char *, char **, va_list);
31+
#endif
32+
2133
#define FLAG_COMPAT 1
2234
#define FLAG_SIZE_T 2
2335

0 commit comments

Comments
 (0)