Skip to content

Commit 5d17382

Browse files
timfelfangerer
authored andcommitted
get rid of CallWithPolyglotArgs
1 parent a77f11d commit 5d17382

File tree

6 files changed

+67
-72
lines changed

6 files changed

+67
-72
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,18 @@ int PyErr_WarnEx(PyObject *category, const char *text, Py_ssize_t stack_level) {
7070
}
7171

7272
NO_INLINE int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...) {
73-
CallWithPolyglotArgs(PyObject* result, format, PyTruffle_Unicode_FromFormat, format);
73+
va_list args;
74+
va_start(args, format);
75+
PyObject* result = PyTruffle_Unicode_FromFormat(format, args);
76+
va_end(args);
7477
return warn_unicode(category, result, stack_level, Py_None);
7578
}
7679

7780
int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...) {
78-
CallWithPolyglotArgs(PyObject* result, format, PyTruffle_Unicode_FromFormat, format);
81+
va_list args;
82+
va_start(args, format);
83+
PyObject* result = PyTruffle_Unicode_FromFormat(format, args);
84+
va_end(args);
7985
return warn_unicode(PyExc_ResourceWarning, result, stack_level, source);
8086
}
8187

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,12 +391,6 @@ int bytes_copy2mem(char* target, char* source, size_t nbytes);
391391
/* MEMORYVIEW, BUFFERDECORATOR */
392392
int bufferdecorator_getbuffer(PyBufferDecorator *self, Py_buffer *view, int flags);
393393

394-
#define CallWithPolyglotArgs(result, last, function, ...) \
395-
va_list __poly_args; \
396-
va_start(__poly_args, last); \
397-
result = function(__VA_ARGS__, __poly_args); \
398-
va_end(__poly_args)
399-
400394
typedef PyObject* PyObjectPtr;
401395
POLYGLOT_DECLARE_TYPE(PyObjectPtr);
402396

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,10 @@ int PyErr_ExceptionMatches(PyObject *exc) {
161161

162162
NO_INLINE
163163
PyObject* PyErr_Format(PyObject* exception, const char* fmt, ...) {
164-
CallWithPolyglotArgs(PyObject* formatted_msg, fmt, PyTruffle_Unicode_FromFormat, fmt);
164+
va_list args;
165+
va_start(args, fmt);
166+
PyObject* formatted_msg = PyTruffle_Unicode_FromFormat(fmt, args);
167+
va_end(args);
165168
UPCALL_CEXT_VOID(_jls_PyErr_CreateAndSetException, native_to_java(exception), native_to_java(formatted_msg));
166169
return NULL;
167170
}

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

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,6 @@ static void init_upcall_PyTruffle_Arg_ParseTupleAndKeyword(void) {
141141
} \
142142
__res__ = PyTruffle_Arg_ParseTupleAndKeywords(polyglot_from_PyObjectPtr_array((__args__), (__nargs__)), NULL, polyglot_from_string((__fmt__), SRC_CS), NULL, polyglot_from_OutVarPtr_array((OutVarPtr*)__poly_args, __poly_argc));
143143

144-
145-
#define PyTruffleVaArgI8(poly_args, offset, va) (poly_args == NULL ? va_arg(va, int8_t) : polyglot_as_i8((poly_args[offset++])))
146-
#define PyTruffleVaArgI32(poly_args, offset, va) (poly_args == NULL ? va_arg(va, int32_t) : polyglot_as_i32((poly_args[offset++])))
147-
#define PyTruffleVaArgI64(poly_args, offset, va, T) (poly_args == NULL ? va_arg(va, T) : ((T)polyglot_as_i64((poly_args[offset++]))))
148-
#define PyTruffleVaArgDouble(poly_args, offset, va) (poly_args == NULL ? va_arg(va, double) : polyglot_as_double((poly_args[offset++])))
149-
#define PyTruffleVaArg(poly_args, offset, va, T) (poly_args == NULL ? va_arg(va, T) : (T)(poly_args[offset++]))
150-
151144
/* argparse */
152145

153146
OutVarPtr* allocate_outvar() {
@@ -293,9 +286,9 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
293286
case 's':
294287
case 'z':
295288
case 'U':
296-
char_arg = PyTruffleVaArg(poly_args, offset, va, char*);
289+
char_arg = va_arg(va, char*);
297290
if (format[format_idx + 1] == '#') {
298-
int size = PyTruffleVaArgI64(poly_args, offset, va, int);
291+
int size = va_arg(va, int);
299292
if (char_arg == NULL) {
300293
PyList_Append(list, Py_None);
301294
} else {
@@ -311,9 +304,9 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
311304
}
312305
break;
313306
case 'y':
314-
char_arg = PyTruffleVaArg(poly_args, offset, va, char*);
307+
char_arg = va_arg(va, char*);
315308
if (format[format_idx + 1] == '#') {
316-
int size = PyTruffleVaArgI64(poly_args, offset, va, int);
309+
int size = va_arg(va, int);
317310
if (char_arg == NULL) {
318311
PyList_Append(list, Py_None);
319312
} else {
@@ -334,52 +327,52 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
334327
case 'i':
335328
case 'b':
336329
case 'h':
337-
PyList_Append(list, PyLong_FromLong(PyTruffleVaArgI64(poly_args, offset, va, int)));
330+
PyList_Append(list, PyLong_FromLong(va_arg(va, int)));
338331
break;
339332
case 'l':
340-
PyList_Append(list, PyLong_FromLong(PyTruffleVaArgI64(poly_args, offset, va, long)));
333+
PyList_Append(list, PyLong_FromLong(va_arg(va, long)));
341334
break;
342335
case 'B':
343336
case 'H':
344337
case 'I':
345-
PyList_Append(list, PyLong_FromUnsignedLong(PyTruffleVaArgI64(poly_args, offset, va, unsigned int)));
338+
PyList_Append(list, PyLong_FromUnsignedLong(va_arg(va, unsigned int)));
346339
break;
347340
case 'k':
348-
PyList_Append(list, PyLong_FromUnsignedLong(PyTruffleVaArgI64(poly_args, offset, va, unsigned long)));
341+
PyList_Append(list, PyLong_FromUnsignedLong(va_arg(va, unsigned long)));
349342
break;
350343
case 'L':
351-
PyList_Append(list, PyLong_FromLongLong(PyTruffleVaArgI64(poly_args, offset, va, long long)));
344+
PyList_Append(list, PyLong_FromLongLong(va_arg(va, long long)));
352345
break;
353346
case 'K':
354-
PyList_Append(list, PyLong_FromUnsignedLongLong(PyTruffleVaArgI64(poly_args, offset, va, unsigned long long)));
347+
PyList_Append(list, PyLong_FromUnsignedLongLong(va_arg(va, unsigned long long)));
355348
break;
356349
case 'n':
357-
PyList_Append(list, PyLong_FromSsize_t(PyTruffleVaArgI64(poly_args, offset, va, Py_ssize_t)));
350+
PyList_Append(list, PyLong_FromSsize_t(va_arg(va, Py_ssize_t)));
358351
break;
359352
case 'c':
360353
// note: a vararg char is promoted to int according to the C standard
361-
argchar[0] = PyTruffleVaArgI64(poly_args, offset, va, int);
354+
argchar[0] = va_arg(va, int);
362355
PyList_Append(list, PyBytes_FromStringAndSize(argchar, 1));
363356
break;
364357
case 'C':
365358
// note: a vararg char is promoted to int according to the C standard
366-
argchar[0] = PyTruffleVaArgI64(poly_args, offset, va, int);
359+
argchar[0] = va_arg(va, int);
367360
PyList_Append(list, polyglot_from_string(argchar, "ascii"));
368361
break;
369362
case 'd':
370363
case 'f':
371-
PyList_Append(list, PyFloat_FromDouble(PyTruffleVaArgDouble(poly_args, offset, va)));
364+
PyList_Append(list, PyFloat_FromDouble(va_arg(va, double)));
372365
break;
373366
case 'D':
374367
fprintf(stderr, "error: unsupported format 'D'\n");
375368
break;
376369
case 'O':
377370
case 'S':
378371
case 'N':
379-
void_arg = PyTruffleVaArg(poly_args, offset, va, void*);
372+
void_arg = va_arg(va, void*);
380373
if (c == 'O') {
381374
if (format[format_idx + 1] == '&') {
382-
converter = PyTruffleVaArg(poly_args, offset, va, void*);
375+
converter = va_arg(va, void*);
383376
}
384377
}
385378

@@ -487,13 +480,19 @@ PyObject* _Py_VaBuildValue_SizeT(const char *format, va_list va) {
487480

488481
NO_INLINE
489482
PyObject* Py_BuildValue(const char *format, ...) {
490-
CallWithPolyglotArgs(PyObject* result, format, _PyTruffle_BuildValue, format);
483+
va_list args;
484+
va_start(args, format);
485+
PyObject* result = _PyTruffle_BuildValue(format, args);
486+
va_end(args);
491487
return result;
492488
}
493489

494490
NO_INLINE
495491
PyObject* _Py_BuildValue_SizeT(const char *format, ...) {
496-
CallWithPolyglotArgs(PyObject* result, format, _PyTruffle_BuildValue, format);
492+
va_list args;
493+
va_start(args, format);
494+
PyObject* result = _PyTruffle_BuildValue(format, args);
495+
va_end(args);
497496
return result;
498497
}
499498

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

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,15 @@ PyObject* PyObject_CallObject(PyObject* callable, PyObject* args) {
163163

164164
NO_INLINE
165165
PyObject* PyObject_CallFunction(PyObject* callable, const char* fmt, ...) {
166-
PyObject* args;
167-
168166
if (fmt == NULL || fmt[0] == '\0') {
169167
return PyObject_CallObject(callable, NULL);
170168
}
171169

172-
CallWithPolyglotArgs(args, fmt, _PyTruffle_BuildValue, fmt);
170+
va_list va;
171+
va_start(va, fmt);
172+
PyObject* args = Py_VaBuildValue(fmt, va);
173+
va_end(va);
174+
173175
if (strlen(fmt) < 2) {
174176
PyObject* singleArg = args;
175177
args = PyTuple_New(strlen(fmt));
@@ -183,13 +185,15 @@ PyObject* PyObject_CallFunction(PyObject* callable, const char* fmt, ...) {
183185

184186
NO_INLINE
185187
PyObject* _PyObject_CallFunction_SizeT(PyObject* callable, const char* fmt, ...) {
186-
PyObject* args;
187-
188188
if (fmt == NULL || fmt[0] == '\0') {
189189
return PyObject_CallObject(callable, NULL);
190190
}
191191

192-
CallWithPolyglotArgs(args, fmt, _PyTruffle_BuildValue, fmt);
192+
va_list va;
193+
va_start(va, fmt);
194+
PyObject* args = Py_VaBuildValue(fmt, va);
195+
va_end(va);
196+
193197
if (strlen(fmt) < 2) {
194198
PyObject* singleArg = args;
195199
args = PyTuple_New(strlen(fmt));
@@ -203,24 +207,14 @@ PyObject* _PyObject_CallFunction_SizeT(PyObject* callable, const char* fmt, ...)
203207

204208
NO_INLINE
205209
PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ...) {
206-
// the arguments are given as a variable list followed by NULL
207210
va_list vargs;
208-
va_list countva;
209211
va_start(vargs, callable);
210-
va_copy(countva, vargs);
211-
int nargs = 0;
212-
for (;;) {
213-
if (va_arg(countva, PyObject *) != NULL) {
214-
nargs++;
215-
} else {
216-
break;
217-
}
218-
}
219-
va_end(countva);
212+
// the arguments are given as a variable list followed by NULL
213+
int nargs = polyglot_get_array_size(vargs) - 1;
220214
PyObject* args = PyTuple_New(nargs);
221215
for (int i = 0; i < nargs; i++) {
222216
PyObject* arg = (PyObject*) va_arg(vargs, PyObject *);
223-
Py_XINCREF(arg);
217+
Py_INCREF(arg);
224218
PyTuple_SetItem(args, i, arg);
225219
}
226220
va_end(vargs);
@@ -234,7 +228,10 @@ PyObject* PyObject_CallMethod(PyObject* object, const char* method, const char*
234228
if (fmt == NULL || fmt[0] == '\0') {
235229
args = Py_None;
236230
} else {
237-
CallWithPolyglotArgs(args, fmt, _PyTruffle_BuildValue, fmt);
231+
va_list va;
232+
va_start(va, fmt);
233+
args = Py_VaBuildValue(fmt, va);
234+
va_end(va);
238235
}
239236
return UPCALL_CEXT_O(_jls_PyObject_CallMethod, native_to_java(object), polyglot_from_string(method, SRC_CS), native_to_java(args));
240237
}
@@ -243,7 +240,8 @@ NO_INLINE
243240
PyObject* PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) {
244241
va_list vargs;
245242
va_start(vargs, name);
246-
int argc = polyglot_get_array_size(vargs);
243+
// the arguments are given as a variable list followed by NULL
244+
int argc = polyglot_get_array_size(vargs) - 1;
247245
PyObject* args = PyTuple_New(argc);
248246
for (int i = 0; i < argc; i++) {
249247
PyObject *arg = va_arg(vargs, PyObject*);
@@ -260,7 +258,10 @@ PyObject* _PyObject_CallMethod_SizeT(PyObject* object, const char* method, const
260258
if (fmt == NULL || fmt[0] == '\0') {
261259
args = Py_None;
262260
} else {
263-
CallWithPolyglotArgs(args, fmt, _PyTruffle_BuildValue, fmt);
261+
va_list va;
262+
va_start(va, fmt);
263+
args = Py_VaBuildValue(fmt, va);
264+
va_end(va);
264265
}
265266
return UPCALL_CEXT_O(_jls_PyObject_CallMethod, native_to_java(object), polyglot_from_string(method, SRC_CS), native_to_java(args));
266267
}

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,6 @@ MUST_INLINE PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va)
234234
size_t fmt_size = strlen(fmt) + 1;
235235
char* fmtcpy = strdup(fmt);
236236
char* c = fmtcpy;
237-
int use_valist = args == NULL;
238-
int pos = 0;
239237

240238
int remaining_space = 2047;
241239
char* buffer = (char*)calloc(sizeof(char), remaining_space + 1);
@@ -256,11 +254,8 @@ MUST_INLINE PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va)
256254
allocated = NULL;
257255
}
258256
variable = NULL;
259-
} else if (use_valist) {
260-
bytes_written = vsnprintf(buffer, remaining_space, fmtcpy, va);
261257
} else {
262-
strncpy(buffer, fmtcpy, remaining_space);
263-
bytes_written = strlen(fmtcpy);
258+
bytes_written = vsnprintf(buffer, remaining_space, fmtcpy, va);
264259
}
265260
remaining_space -= bytes_written;
266261
buffer += bytes_written;
@@ -281,7 +276,7 @@ MUST_INLINE PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va)
281276
case 'R':
282277
if (converter == NULL) converter = PyObject_Repr;
283278
c[1] = 's';
284-
allocated = variable = as_char_pointer(converter(use_valist ? va_arg(va, PyObject*) : (PyObject*)(args[pos++])));
279+
allocated = variable = as_char_pointer(converter(va_arg(va, PyObject*)));
285280
break;
286281
case '%':
287282
// literal %
@@ -290,11 +285,7 @@ MUST_INLINE PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va)
290285
// This case should just treat it's argument as an integer
291286
c[1] = 'd';
292287
default:
293-
// if we're reading args from a void* array, read it now,
294-
// otherwise there's nothing to do
295-
if (args != NULL) {
296-
variable = args[pos++];
297-
}
288+
variable = va_arg(va, PyObject*);
298289
}
299290
// skip over next char, we checked it
300291
c += 1;
@@ -308,10 +299,8 @@ MUST_INLINE PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va)
308299
if (allocated) {
309300
free(allocated);
310301
}
311-
} else if (use_valist) {
312-
vsnprintf(buffer, remaining_space, fmtcpy, va);
313302
} else {
314-
strncpy(buffer, fmtcpy, remaining_space);
303+
vsnprintf(buffer, remaining_space, fmtcpy, va);
315304
}
316305

317306
PyObject* result = PyUnicode_FromString(full_buffer);
@@ -325,7 +314,10 @@ PyObject* PyUnicode_FromFormatV(const char* format, va_list va) {
325314

326315
NO_INLINE
327316
PyObject* PyUnicode_FromFormat(const char* format, ...) {
328-
CallWithPolyglotArgs(PyObject* result, format, PyTruffle_Unicode_FromFormat, format);
317+
va_list args;
318+
va_start(args, format);
319+
PyObject* result = PyTruffle_Unicode_FromFormat(format, args);
320+
va_end(args);
329321
return result;
330322
}
331323

0 commit comments

Comments
 (0)