Skip to content

Commit c3a61fd

Browse files
committed
change IS_SINGLE_ARG to account for modifiers
1 parent c8a4001 commit c3a61fd

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

graalpython/com.oracle.graal.python.cext/src/object_shared.c

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,28 @@ void PyObject_GC_Del(void *tp) {
205205
PyObject_Free(tp);
206206
}
207207

208-
#define IS_SINGLE_ARG(_fmt) ((_fmt[0]) != '\0' && (_fmt[1]) == '\0')
208+
inline int is_single_arg(const char* fmt) {
209+
if (fmt[0] == 0) {
210+
return 0;
211+
}
212+
if (fmt[1] == 0) {
213+
return 1;
214+
}
215+
if (fmt[2] != 0) {
216+
return 0;
217+
}
218+
switch (fmt[1]) {
219+
case '#':
220+
case '&':
221+
case ',':
222+
case ':':
223+
case ' ':
224+
case '\t':
225+
return 1;
226+
default:
227+
return 0;
228+
}
229+
}
209230

210231
PyObject* PyObject_Call(PyObject* callable, PyObject* args, PyObject* kwargs) {
211232
return Graal_PyTruffleObject_Call1(callable, args, kwargs, 0);
@@ -228,10 +249,10 @@ PyObject* PyObject_CallFunction(PyObject* callable, const char* fmt, ...) {
228249
PyObject* args = Py_VaBuildValue(fmt, va);
229250
va_end(va);
230251
// A special case in CPython for backwards compatibility
231-
if (IS_SINGLE_ARG(fmt) && PyTuple_Check(args)) {
252+
if (is_single_arg(fmt) && PyTuple_Check(args)) {
232253
return Graal_PyTruffleObject_Call1(callable, args, NULL, 0);
233254
}
234-
return Graal_PyTruffleObject_Call1(callable, args, NULL, IS_SINGLE_ARG(fmt));
255+
return Graal_PyTruffleObject_Call1(callable, args, NULL, is_single_arg(fmt));
235256
}
236257

237258
PyObject* _PyObject_CallFunction_SizeT(PyObject* callable, const char* fmt, ...) {
@@ -240,13 +261,13 @@ PyObject* _PyObject_CallFunction_SizeT(PyObject* callable, const char* fmt, ...)
240261
}
241262
va_list va;
242263
va_start(va, fmt);
243-
PyObject* args = Py_VaBuildValue(fmt, va);
264+
PyObject* args = _Py_VaBuildValue_SizeT(fmt, va);
244265
va_end(va);
245266
// A special case in CPython for backwards compatibility
246-
if (IS_SINGLE_ARG(fmt) && PyTuple_Check(args)) {
267+
if (is_single_arg(fmt) && PyTuple_Check(args)) {
247268
return Graal_PyTruffleObject_Call1(callable, args, NULL, 0);
248269
}
249-
return Graal_PyTruffleObject_Call1(callable, args, NULL, IS_SINGLE_ARG(fmt));
270+
return Graal_PyTruffleObject_Call1(callable, args, NULL, is_single_arg(fmt));
250271
}
251272

252273
PyObject* PyObject_CallMethod(PyObject* object, const char* method, const char* fmt, ...) {
@@ -258,7 +279,7 @@ PyObject* PyObject_CallMethod(PyObject* object, const char* method, const char*
258279
va_start(va, fmt);
259280
args = Py_VaBuildValue(fmt, va);
260281
va_end(va);
261-
return Graal_PyTruffleObject_CallMethod1(object, truffleString(method), args, IS_SINGLE_ARG(fmt));
282+
return Graal_PyTruffleObject_CallMethod1(object, truffleString(method), args, is_single_arg(fmt));
262283
}
263284

264285
PyObject* _PyObject_CallMethod_SizeT(PyObject* object, const char* method, const char* fmt, ...) {
@@ -268,7 +289,7 @@ PyObject* _PyObject_CallMethod_SizeT(PyObject* object, const char* method, const
268289
}
269290
va_list va;
270291
va_start(va, fmt);
271-
args = Py_VaBuildValue(fmt, va);
292+
args = _Py_VaBuildValue_SizeT(fmt, va);
272293
va_end(va);
273-
return Graal_PyTruffleObject_CallMethod1(object, truffleString(method), args, IS_SINGLE_ARG(fmt));
294+
return Graal_PyTruffleObject_CallMethod1(object, truffleString(method), args, is_single_arg(fmt));
274295
}

0 commit comments

Comments
 (0)