@@ -199,129 +199,92 @@ PyObject * PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwar
199
199
return _Py_CheckFunctionResult (callable , result , NULL );
200
200
}
201
201
202
+ #define IS_SINGLE_ARG (_fmt ) ((_fmt[0]) != '\0' && (_fmt[1]) == '\0')
203
+
204
+ typedef PyObject * (* call_fun_t )(PyObject * , PyObject * , PyObject * , int32_t );
205
+ UPCALL_TYPED_ID (PyObject_Call , call_fun_t );
202
206
PyObject * PyObject_Call (PyObject * callable , PyObject * args , PyObject * kwargs ) {
203
- return polyglot_invoke ( PY_TRUFFLE_CEXT , "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 );
204
208
}
205
209
206
210
PyObject * PyObject_CallObject (PyObject * callable , PyObject * args ) {
207
- return PyObject_Call ( callable , args , PyDict_New () );
211
+ return _jls_PyObject_Call ( native_to_java ( callable ), native_to_java ( args ), NULL , 0 );
208
212
}
209
213
210
- NO_INLINE
211
214
PyObject * PyObject_CallFunction (PyObject * callable , const char * fmt , ...) {
212
215
if (fmt == NULL || fmt [0 ] == '\0' ) {
213
- return PyObject_CallObject ( callable , NULL );
216
+ return _jls_PyObject_Call ( native_to_java ( callable ) , NULL , NULL , 0 );
214
217
}
215
-
216
218
va_list va ;
217
219
va_start (va , fmt );
218
220
PyObject * args = Py_VaBuildValue (fmt , va );
219
221
va_end (va );
220
-
221
- if (strlen (fmt ) < 2 ) {
222
- PyObject * singleArg = args ;
223
- args = PyTuple_New (strlen (fmt ));
224
- if (strlen (fmt ) == 1 ) {
225
- Py_XINCREF (singleArg );
226
- PyTuple_SetItem (args , 0 , singleArg );
227
- }
228
- }
229
- return PyObject_CallObject (callable , args );
222
+ return _jls_PyObject_Call (native_to_java (callable ), native_to_java (args ), NULL , IS_SINGLE_ARG (fmt ));
230
223
}
231
224
232
- NO_INLINE
233
225
PyObject * _PyObject_CallFunction_SizeT (PyObject * callable , const char * fmt , ...) {
234
226
if (fmt == NULL || fmt [0 ] == '\0' ) {
235
- return PyObject_CallObject ( callable , NULL );
227
+ return _jls_PyObject_Call ( native_to_java ( callable ) , NULL , NULL , 0 );
236
228
}
237
-
238
229
va_list va ;
239
230
va_start (va , fmt );
240
231
PyObject * args = Py_VaBuildValue (fmt , va );
241
232
va_end (va );
242
-
243
- if (strlen (fmt ) < 2 ) {
244
- PyObject * singleArg = args ;
245
- args = PyTuple_New (strlen (fmt ));
246
- if (strlen (fmt ) == 1 ) {
247
- Py_XINCREF (singleArg );
248
- PyTuple_SetItem (args , 0 , singleArg );
249
- }
250
- }
251
- return PyObject_CallObject (callable , args );
233
+ return _jls_PyObject_Call (native_to_java (callable ), native_to_java (args ), NULL , IS_SINGLE_ARG (fmt ));
252
234
}
253
235
254
- NO_INLINE
236
+ typedef PyObject * (* call_fun_obj_args_t )(PyObject * , void * );
237
+ UPCALL_TYPED_ID (PyObject_CallFunctionObjArgs , call_fun_obj_args_t );
255
238
PyObject * PyObject_CallFunctionObjArgs (PyObject * callable , ...) {
256
239
va_list vargs ;
257
240
va_start (vargs , callable );
258
241
// the arguments are given as a variable list followed by NULL
259
- int nargs = polyglot_get_array_size (vargs ) - 1 ;
260
- PyObject * args = PyTuple_New (nargs );
261
- for (int i = 0 ; i < nargs ; i ++ ) {
262
- PyObject * arg = (PyObject * ) va_arg (vargs , PyObject * );
263
- Py_INCREF (arg );
264
- PyTuple_SetItem (args , i , arg );
265
- }
242
+ PyObject * result = _jls_PyObject_CallFunctionObjArgs (native_to_java (callable ), & vargs );
266
243
va_end (vargs );
267
- return PyObject_CallObject ( callable , args ) ;
244
+ return result ;
268
245
}
269
246
270
- UPCALL_ID ( PyObject_CallMethod );
271
- NO_INLINE
247
+ typedef PyObject * ( * call_method_t )( PyObject * , void * , void * , int32_t );
248
+ UPCALL_TYPED_ID ( PyObject_CallMethod , call_method_t );
272
249
PyObject * PyObject_CallMethod (PyObject * object , const char * method , const char * fmt , ...) {
273
250
PyObject * args ;
274
251
if (fmt == NULL || fmt [0 ] == '\0' ) {
275
- args = Py_None ;
276
- } else {
277
- va_list va ;
278
- va_start (va , fmt );
279
- args = Py_VaBuildValue (fmt , va );
280
- va_end (va );
252
+ return _jls_PyObject_CallMethod (native_to_java (object ), polyglot_from_string (method , SRC_CS ), NULL , 0 );
281
253
}
282
- return UPCALL_CEXT_O (_jls_PyObject_CallMethod , native_to_java (object ), polyglot_from_string (method , SRC_CS ), native_to_java (args ));
254
+ va_list va ;
255
+ va_start (va , fmt );
256
+ args = Py_VaBuildValue (fmt , va );
257
+ va_end (va );
258
+ return _jls_PyObject_CallMethod (native_to_java (object ), polyglot_from_string (method , SRC_CS ), native_to_java (args ), IS_SINGLE_ARG (fmt ));
283
259
}
284
260
285
- NO_INLINE
261
+ typedef PyObject * (* call_meth_obj_args_t )(PyObject * , void * , void * );
262
+ UPCALL_TYPED_ID (PyObject_CallMethodObjArgs , call_meth_obj_args_t );
286
263
PyObject * PyObject_CallMethodObjArgs (PyObject * callable , PyObject * name , ...) {
287
264
va_list vargs ;
288
265
va_start (vargs , name );
289
266
// the arguments are given as a variable list followed by NULL
290
- int argc = polyglot_get_array_size (vargs ) - 1 ;
291
- PyObject * args = PyTuple_New (argc );
292
- for (int i = 0 ; i < argc ; i ++ ) {
293
- PyObject * arg = va_arg (vargs , PyObject * );
294
- Py_INCREF (arg );
295
- PyTuple_SetItem (args , i , arg );
296
- }
267
+ PyObject * result = _jls_PyObject_CallMethodObjArgs (native_to_java (callable ), native_to_java (name ), & vargs );
297
268
va_end (vargs );
298
- return UPCALL_CEXT_O ( _jls_PyObject_CallMethod , native_to_java ( callable ), native_to_java ( name ), native_to_java ( args )) ;
269
+ return result ;
299
270
}
300
271
301
- NO_INLINE
302
272
PyObject * _PyObject_CallMethod_SizeT (PyObject * object , const char * method , const char * fmt , ...) {
303
273
PyObject * args ;
304
274
if (fmt == NULL || fmt [0 ] == '\0' ) {
305
- args = Py_None ;
306
- } else {
307
- va_list va ;
308
- va_start (va , fmt );
309
- args = Py_VaBuildValue (fmt , va );
310
- va_end (va );
275
+ return _jls_PyObject_CallMethod (native_to_java (object ), polyglot_from_string (method , SRC_CS ), NULL , 0 );
311
276
}
312
- return UPCALL_CEXT_O (_jls_PyObject_CallMethod , native_to_java (object ), polyglot_from_string (method , SRC_CS ), native_to_java (args ));
277
+ va_list va ;
278
+ va_start (va , fmt );
279
+ args = Py_VaBuildValue (fmt , va );
280
+ va_end (va );
281
+ return _jls_PyObject_CallMethod (native_to_java (object ), polyglot_from_string (method , SRC_CS ), native_to_java (args ), IS_SINGLE_ARG (fmt ));
313
282
}
314
283
284
+ typedef PyObject * (* fast_call_dict_fun_t )(PyObject * , void * , PyObject * );
285
+ UPCALL_TYPED_ID (PyObject_FastCallDict , fast_call_dict_fun_t );
315
286
PyObject * _PyObject_FastCallDict (PyObject * func , PyObject * const * args , size_t nargs , PyObject * kwargs ) {
316
- PyObject * targs = PyTuple_New (nargs );
317
- Py_ssize_t i ;
318
- PyObject * arg ;
319
- for (i = 0 ; i < nargs ; i ++ ) {
320
- arg = args [i ];
321
- Py_XINCREF (arg );
322
- PyTuple_SetItem (targs , i , arg );
323
- }
324
- return polyglot_invoke (PY_TRUFFLE_CEXT , "PyObject_Call" , native_to_java (func ), native_to_java (targs ), native_to_java (kwargs ));
287
+ return _jls_PyObject_FastCallDict (native_to_java (func ), polyglot_from_PyObjectPtr_array (args , nargs ), native_to_java (kwargs ));
325
288
}
326
289
327
290
PyObject * PyObject_Type (PyObject * obj ) {
0 commit comments