Skip to content

Commit 8bf7d68

Browse files
committed
Add special case for single arg to PyObject_Call
1 parent 4ff29ff commit 8bf7d68

File tree

2 files changed

+20
-29
lines changed

2 files changed

+20
-29
lines changed

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

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -199,51 +199,38 @@ PyObject * PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwar
199199
return _Py_CheckFunctionResult(callable, result, NULL);
200200
}
201201

202-
typedef PyObject *(*call_fun_t)(PyObject *, PyObject *, PyObject *);
202+
#define IS_SINGLE_ARG(_fmt) ((_fmt[0]) != '\0' && (_fmt[1]) == '\0')
203+
204+
typedef PyObject *(*call_fun_t)(PyObject *, PyObject *, PyObject *, int32_t);
203205
UPCALL_TYPED_ID(PyObject_Call, call_fun_t);
204206
PyObject* PyObject_Call(PyObject* callable, PyObject* args, PyObject* kwargs) {
205-
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), native_to_java(kwargs));
207+
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), native_to_java(kwargs), 0);
206208
}
207209

208210
PyObject* PyObject_CallObject(PyObject* callable, PyObject* args) {
209-
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL);
211+
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL, 0);
210212
}
211213

212214
PyObject* PyObject_CallFunction(PyObject* callable, const char* fmt, ...) {
213215
if (fmt == NULL || fmt[0] == '\0') {
214-
return _jls_PyObject_Call(native_to_java(callable), NULL, NULL);
216+
return _jls_PyObject_Call(native_to_java(callable), NULL, NULL, 0);
215217
}
216218
va_list va;
217219
va_start(va, fmt);
218220
PyObject* args = Py_VaBuildValue(fmt, va);
219221
va_end(va);
220-
221-
if (strlen(fmt) == 1) {
222-
PyObject* singleArg = args;
223-
args = PyTuple_New(1);
224-
Py_XINCREF(singleArg);
225-
PyTuple_SetItem(args, 0, singleArg);
226-
}
227-
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL);
222+
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL, IS_SINGLE_ARG(fmt));
228223
}
229224

230225
PyObject* _PyObject_CallFunction_SizeT(PyObject* callable, const char* fmt, ...) {
231226
if (fmt == NULL || fmt[0] == '\0') {
232-
return _jls_PyObject_Call(native_to_java(callable), NULL, NULL);
227+
return _jls_PyObject_Call(native_to_java(callable), NULL, NULL, 0);
233228
}
234-
235229
va_list va;
236230
va_start(va, fmt);
237231
PyObject* args = Py_VaBuildValue(fmt, va);
238232
va_end(va);
239-
240-
if (strlen(fmt) == 1) {
241-
PyObject* singleArg = args;
242-
args = PyTuple_New(1);
243-
Py_XINCREF(singleArg);
244-
PyTuple_SetItem(args, 0, singleArg);
245-
}
246-
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL);
233+
return _jls_PyObject_Call(native_to_java(callable), native_to_java(args), NULL, IS_SINGLE_ARG(fmt));
247234
}
248235

249236
typedef PyObject *(*call_fun_obj_args_t)(PyObject *, void *);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PythonCextBuiltins.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3262,13 +3262,12 @@ protected static boolean isMappingOrSequence(Object obj) {
32623262
}
32633263

32643264
// directly called without landing function
3265-
@Builtin(name = "PyObject_Call", parameterNames = {"callee", "args", "kwargs"})
3265+
@Builtin(name = "PyObject_Call", parameterNames = {"callee", "args", "kwargs", "single_arg"})
32663266
@GenerateNodeFactory
3267-
abstract static class PyObjectCallNode extends PythonTernaryBuiltinNode {
3268-
3267+
abstract static class PyObjectCallNode extends PythonQuaternaryBuiltinNode {
32693268
@Specialization
3270-
static Object doGeneric(VirtualFrame frame, Object callableObj, Object argsObj, Object kwargsObj,
3271-
@Cached AsPythonObjectNode callableToJavaNode,
3269+
static Object doGeneric(VirtualFrame frame, Object callableObj, Object argsObj, Object kwargsObj, int singleArg,
3270+
@Cached AsPythonObjectNode asPythonObjectNode,
32723271
@Cached CastArgsNode castArgsNode,
32733272
@Cached CastKwargsNode castKwargsNode,
32743273
@Cached CallNode callNode,
@@ -3278,8 +3277,13 @@ static Object doGeneric(VirtualFrame frame, Object callableObj, Object argsObj,
32783277
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
32793278

32803279
try {
3281-
Object callable = callableToJavaNode.execute(callableObj);
3282-
Object[] args = castArgsNode.execute(frame, argsObj);
3280+
Object callable = asPythonObjectNode.execute(callableObj);
3281+
Object[] args;
3282+
if (singleArg != 0) {
3283+
args = new Object[]{asPythonObjectNode.execute(argsObj)};
3284+
} else {
3285+
args = castArgsNode.execute(frame, argsObj);
3286+
}
32833287
PKeyword[] keywords = castKwargsNode.execute(kwargsObj);
32843288
return toNewRefNode.execute(callNode.execute(frame, callable, args, keywords));
32853289
} catch (PException e) {

0 commit comments

Comments
 (0)