Skip to content

Commit 31f085c

Browse files
committed
remove PyUnicode_FromFormat arity defines
1 parent 7b9daac commit 31f085c

File tree

2 files changed

+75
-81
lines changed

2 files changed

+75
-81
lines changed

graalpython/com.oracle.graal.python.cext/include/Python.h

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -144,31 +144,6 @@
144144
* } while (0)
145145
*/
146146

147-
extern PyObject * PyTruffle_Unicode_FromFormat(const char *fmt, int s, void* v0, void* v1, void* v2, void* v3, void* v4, void* v5, void* v6, void* v7, void* v8, void* v9, void* v10, void* v11, void* v12, void* v13, void* v14, void* v15, void* v16, void* v17, void* v18, void* v19);
148-
#define PyTruffle_Unicode_FromFormat_0(F1) PyTruffle_Unicode_FromFormat(F1, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
149-
#define PyTruffle_Unicode_FromFormat_1(F1, V1) PyTruffle_Unicode_FromFormat(F1, 1, (void*)(V1), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
150-
#define PyTruffle_Unicode_FromFormat_2(F1, V1, V2) PyTruffle_Unicode_FromFormat(F1, 2, (void*)(V1), (void*)(V2), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
151-
#define PyTruffle_Unicode_FromFormat_3(F1, V1, V2, V3) PyTruffle_Unicode_FromFormat(F1, 3, (void*)(V1), (void*)(V2), (void*)(V3), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
152-
#define PyTruffle_Unicode_FromFormat_4(F1, V1, V2, V3, V4) PyTruffle_Unicode_FromFormat(F1, 4, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
153-
#define PyTruffle_Unicode_FromFormat_5(F1, V1, V2, V3, V4, V5) PyTruffle_Unicode_FromFormat(F1, 5, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
154-
#define PyTruffle_Unicode_FromFormat_6(F1, V1, V2, V3, V4, V5, V6) PyTruffle_Unicode_FromFormat(F1, 6, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
155-
#define PyTruffle_Unicode_FromFormat_7(F1, V1, V2, V3, V4, V5, V6, V7) PyTruffle_Unicode_FromFormat(F1, 7, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
156-
#define PyTruffle_Unicode_FromFormat_8(F1, V1, V2, V3, V4, V5, V6, V7, V8) PyTruffle_Unicode_FromFormat(F1, 8, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
157-
#define PyTruffle_Unicode_FromFormat_9(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9) PyTruffle_Unicode_FromFormat(F1, 9, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
158-
#define PyTruffle_Unicode_FromFormat_10(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10) PyTruffle_Unicode_FromFormat(F1, 10, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
159-
#define PyTruffle_Unicode_FromFormat_11(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11) PyTruffle_Unicode_FromFormat(F1, 11, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
160-
#define PyTruffle_Unicode_FromFormat_12(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12) PyTruffle_Unicode_FromFormat(F1, 12, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
161-
#define PyTruffle_Unicode_FromFormat_13(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13) PyTruffle_Unicode_FromFormat(F1, 13, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), NULL, NULL, NULL, NULL, NULL, NULL, NULL)
162-
#define PyTruffle_Unicode_FromFormat_14(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14) PyTruffle_Unicode_FromFormat(F1, 14, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), NULL, NULL, NULL, NULL, NULL, NULL)
163-
#define PyTruffle_Unicode_FromFormat_15(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15) PyTruffle_Unicode_FromFormat(F1, 15, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), NULL, NULL, NULL, NULL, NULL)
164-
#define PyTruffle_Unicode_FromFormat_16(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16) PyTruffle_Unicode_FromFormat(F1, 16, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), (void*)(V16), NULL, NULL, NULL, NULL)
165-
#define PyTruffle_Unicode_FromFormat_17(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17) PyTruffle_Unicode_FromFormat(F1, 17, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), (void*)(V16), (void*)(V17), NULL, NULL, NULL)
166-
#define PyTruffle_Unicode_FromFormat_18(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18) PyTruffle_Unicode_FromFormat(F1, 18, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), (void*)(V16), (void*)(V17), (void*)(V18), NULL, NULL)
167-
#define PyTruffle_Unicode_FromFormat_19(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19) PyTruffle_Unicode_FromFormat(F1, 19, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), (void*)(V16), (void*)(V17), (void*)(V18), (void*)(V19), NULL)
168-
#define PyTruffle_Unicode_FromFormat_20(F1, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20) PyTruffle_Unicode_FromFormat(F1, 20, (void*)(V1), (void*)(V2), (void*)(V3), (void*)(V4), (void*)(V5), (void*)(V6), (void*)(V7), (void*)(V8), (void*)(V9), (void*)(V10), (void*)(V11), (void*)(V12), (void*)(V13), (void*)(V14), (void*)(V15), (void*)(V16), (void*)(V17), (void*)(V18), (void*)(V19), (void*)(V20))
169-
#define ARG_PARSE_PyUnicode_FromFormat_IMPL(DUMMY, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, NAME, ...) NAME
170-
#define PyUnicode_FromFormat(F1, ...) ARG_PARSE_PyUnicode_FromFormat_IMPL(NULL, ##__VA_ARGS__, PyTruffle_Unicode_FromFormat_20, PyTruffle_Unicode_FromFormat_19, PyTruffle_Unicode_FromFormat_18, PyTruffle_Unicode_FromFormat_17, PyTruffle_Unicode_FromFormat_16, PyTruffle_Unicode_FromFormat_15, PyTruffle_Unicode_FromFormat_14, PyTruffle_Unicode_FromFormat_13, PyTruffle_Unicode_FromFormat_12, PyTruffle_Unicode_FromFormat_11, PyTruffle_Unicode_FromFormat_10, PyTruffle_Unicode_FromFormat_9, PyTruffle_Unicode_FromFormat_8, PyTruffle_Unicode_FromFormat_7, PyTruffle_Unicode_FromFormat_6, PyTruffle_Unicode_FromFormat_5, PyTruffle_Unicode_FromFormat_4, PyTruffle_Unicode_FromFormat_3, PyTruffle_Unicode_FromFormat_2, PyTruffle_Unicode_FromFormat_1, PyTruffle_Unicode_FromFormat_0)(F1, ## __VA_ARGS__)
171-
172147
extern PyObject* PyTruffle_Err_Format(PyObject* exception, const char* fmt, int s, void* v0, void* v1, void* v2, void* v3, void* v4, void* v5, void* v6, void* v7, void* v8, void* v9);
173148
#define PyTruffle_Err_Format_0(EXC, FORMAT) PyTruffle_Err_Format(EXC, FORMAT, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
174149
#define PyTruffle_Err_Format_1(EXC, FORMAT, V1) PyTruffle_Err_Format(EXC, FORMAT, 1, (void*)(V1), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

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

Lines changed: 75 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -112,85 +112,104 @@ PyObject * PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) {
112112
return to_sulong(polyglot_from_string_n(u, size, SRC_CS));
113113
}
114114

115-
PyObject* PyTruffle_Unicode_FromFormat(const char* fmt, int s, void* v0, void* v1, void* v2, void* v3, void* v4, void* v5, void* v6, void* v7, void* v8, void* v9, void* v10, void* v11, void* v12, void* v13, void* v14, void* v15, void* v16, void* v17, void* v18, void* v19) {
116-
char** allocated_strings = calloc(sizeof(char*), s);
117-
# define ASSIGN(n, value) \
118-
switch(n) { \
119-
case 0: v0 = value; break; \
120-
case 1: v1 = value; break; \
121-
case 2: v2 = value; break; \
122-
case 3: v3 = value; break; \
123-
case 4: v4 = value; break; \
124-
case 5: v5 = value; break; \
125-
case 6: v6 = value; break; \
126-
case 7: v7 = value; break; \
127-
case 8: v8 = value; break; \
128-
case 9: v9 = value; break; \
129-
case 10: v10 = value; break; \
130-
case 11: v11 = value; break; \
131-
case 12: v12 = value; break; \
132-
case 13: v13 = value; break; \
133-
case 14: v14 = value; break; \
134-
case 15: v15 = value; break; \
135-
case 16: v16 = value; break; \
136-
case 17: v17 = value; break; \
137-
case 18: v18 = value; break; \
138-
case 19: v19 = value; break; \
139-
}
140-
115+
PyObject* PyTruffle_Unicode_FromFormat(const char *fmt, va_list va, void **args, int argc) {
141116
char* fmtcpy = strdup(fmt);
142117
char* c = fmtcpy;
143-
char* allocated;
144-
int cnt = 0;
145118

146-
while (c[0] && cnt < s) {
119+
int remaining_space = 2047;
120+
char* buffer = (char*)calloc(sizeof(char), remaining_space + 1);
121+
char* full_buffer = buffer;
122+
123+
void *variable = NULL;
124+
char *allocated = NULL; // points to the same as variable, if it has to be free'd
125+
126+
while (c[0]) {
147127
if (c[0] == '%') {
128+
// we've reached the next directive, write until here
129+
c[0] = '\0';
130+
int bytes_written;
131+
if (variable != NULL) {
132+
bytes_written = snprintf(buffer, remaining_space, fmtcpy, (unsigned long)variable);
133+
if (allocated != NULL) {
134+
free(allocated);
135+
allocated = NULL;
136+
}
137+
variable = NULL;
138+
} else if (va != NULL) {
139+
bytes_written = vsnprintf(buffer, remaining_space, fmtcpy, va);
140+
} else {
141+
strncpy(buffer, fmtcpy, remaining_space);
142+
bytes_written = strlen(fmtcpy);
143+
}
144+
remaining_space -= bytes_written;
145+
buffer += bytes_written;
146+
fmtcpy = c;
147+
c[0] = '%';
148+
149+
// now decide if we need to do something special with this directive
150+
PyObject* (*converter)(PyObject*) = NULL;
148151
switch (c[1]) {
149-
case 'c':
150-
c[1] = 'd';
151-
break;
152152
case 'A':
153-
c[1] = 's';
154-
;
155-
allocated_strings[cnt] = allocated = as_char_pointer(UPCALL_O(PY_BUILTIN, polyglot_from_string("ascii", SRC_CS), native_to_java(polyglot_get_arg(cnt + 2))));
156-
ASSIGN(cnt, allocated);
157-
break;
153+
// The conversion cases, these all use a function to convert the
154+
// PyObject* to a char* and they fall through
155+
converter = PyObject_ASCII;
158156
case 'U':
159-
c[1] = 's';
160-
allocated_strings[cnt] = allocated = as_char_pointer(PyObject_Str(polyglot_get_arg(cnt + 2)));
161-
ASSIGN(cnt, allocated);
162-
break;
157+
if (converter == NULL) converter = PyObject_Str;
163158
case 'S':
164-
c[1] = 's';
165-
allocated_strings[cnt] = allocated = as_char_pointer(PyObject_Str(polyglot_get_arg(cnt + 2)));
166-
ASSIGN(cnt, allocated);
167-
break;
159+
if (converter == NULL) converter = PyObject_Str;
168160
case 'R':
161+
if (converter == NULL) converter = PyObject_Repr;
169162
c[1] = 's';
170-
allocated_strings[cnt] = allocated = as_char_pointer(PyObject_Repr(polyglot_get_arg(cnt + 2)));
171-
ASSIGN(cnt, allocated);
163+
allocated = variable = as_char_pointer(converter(args == NULL ? va_arg(va, PyObject*) : (PyObject*)(args[argc++])));
164+
break;
165+
case '%':
166+
// literal %
172167
break;
168+
case 'c':
169+
// This case should just treat it's argument as an integer
170+
c[1] = 'd';
171+
default:
172+
// if we're reading args from a void* array, read it now,
173+
// otherwise there's nothing to do
174+
if (args != NULL) {
175+
variable = args[argc++];
176+
}
173177
}
174-
cnt++;
178+
// skip over next char, we checked it
175179
c += 1;
176180
}
177181
c += 1;
178182
}
179183

180-
char buffer[2048] = {'\0'};
181-
snprintf(buffer, 2047, fmtcpy, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
182-
183-
for (int i = 0; i < s; i++) {
184-
if (allocated_strings[i] != NULL) {
185-
free(allocated_strings[i]);
184+
// write the remaining buffer
185+
if (variable != NULL) {
186+
snprintf(buffer, remaining_space, fmtcpy, (unsigned long)variable);
187+
if (allocated) {
188+
free(allocated);
186189
}
190+
} else if (va != NULL) {
191+
vsnprintf(buffer, remaining_space, fmtcpy, va);
192+
} else {
193+
strncpy(buffer, fmtcpy, remaining_space);
187194
}
188195

189-
return PyUnicode_FromString(buffer);
196+
PyObject* result = PyUnicode_FromString(full_buffer);
197+
free(full_buffer);
198+
return result;
199+
}
190200

191-
# undef ASSIGN
201+
PyObject* PyUnicode_FromFormatV(const char* format, va_list va) {
202+
return PyTruffle_Unicode_FromFormat(format, va, NULL, 0);
192203
}
193204

205+
PyObject* PyUnicode_FromFormat(const char* format, ...) {
206+
int argc = polyglot_get_arg_count();
207+
void **args = truffle_managed_malloc(sizeof(void*) * (argc - 1));
208+
for (int i = 1; i < argc; i++) {
209+
args[i - 1] = (unsigned long)polyglot_get_arg(i);
210+
}
211+
return PyTruffle_Unicode_FromFormat(format, NULL, args, 0);
212+
}
194213

195214
PyObject * PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) {
196215
if (u == NULL) {

0 commit comments

Comments
 (0)