Skip to content

Commit 7a2dc28

Browse files
committed
Pass va_list to PyTruffle_Arg_ParseTupleAndKeywords built-in function.
1 parent 5d17382 commit 7a2dc28

File tree

4 files changed

+28
-193
lines changed

4 files changed

+28
-193
lines changed

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

Lines changed: 28 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -77,30 +77,6 @@ int get_buffer_rw(PyObject *arg, Py_buffer *view) {
7777
return 0;
7878
}
7979

80-
typedef union {
81-
void *ptr;
82-
float f;
83-
double d;
84-
int64_t i64;
85-
int32_t i32;
86-
int16_t i16;
87-
int8_t i8;
88-
uint64_t u64;
89-
uint32_t u32;
90-
uint16_t u16;
91-
uint8_t u8;
92-
Py_complex c;
93-
} OutVar;
94-
95-
POLYGLOT_DECLARE_TYPE(OutVar);
96-
97-
typedef struct { OutVar *content; } OutVarPtr;
98-
99-
POLYGLOT_DECLARE_TYPE(OutVarPtr);
100-
101-
typedef char* CharPtr;
102-
POLYGLOT_DECLARE_TYPE(CharPtr);
103-
10480

10581
typedef int (*parseargs_func)(PyObject *argv, PyObject *kwds, const char *format, void* kwdnames, void* varargs);
10682

@@ -111,53 +87,35 @@ static void init_upcall_PyTruffle_Arg_ParseTupleAndKeyword(void) {
11187
PyTruffle_Arg_ParseTupleAndKeywords = polyglot_get_member(PY_TRUFFLE_CEXT, polyglot_from_string("PyTruffle_Arg_ParseTupleAndKeywords", SRC_CS));
11288
}
11389

90+
typedef char* char_ptr_t;
91+
POLYGLOT_DECLARE_TYPE(char_ptr_t);
92+
11493
#define CallParseTupleAndKeywordsWithPolyglotArgs(__res__, __offset__, __args__, __kwds__, __fmt__, __kwdnames__) \
115-
int __poly_argc = polyglot_get_arg_count() - (__offset__); \
116-
void **__poly_args = truffle_managed_malloc(sizeof(void*) * __poly_argc); \
94+
va_list __vl; \
11795
int __kwdnames_cnt = 0; \
118-
for (int i = 0; i < __poly_argc; i++) { \
119-
__poly_args[i] = polyglot_get_arg(i + (__offset__)); \
120-
} \
12196
if((__kwdnames__) != NULL){ \
12297
for (; (__kwdnames__)[__kwdnames_cnt] != NULL ; __kwdnames_cnt++); \
12398
} \
124-
__res__ = PyTruffle_Arg_ParseTupleAndKeywords((__args__), (__kwds__), polyglot_from_string((__fmt__), SRC_CS), polyglot_from_CharPtr_array(__kwdnames__, __kwdnames_cnt), polyglot_from_OutVarPtr_array((OutVarPtr*)__poly_args, __poly_argc));
99+
va_start(__vl, __offset__); \
100+
__res__ = PyTruffle_Arg_ParseTupleAndKeywords((__args__), (__kwds__), polyglot_from_string((__fmt__), SRC_CS), polyglot_from_char_ptr_t_array(__kwdnames__, __kwdnames_cnt), &__vl); \
101+
va_end(__vl);
125102

126103

127104
#define CallParseTupleWithPolyglotArgs(__res__, __offset__, __args__, __fmt__) \
128-
int __poly_argc = polyglot_get_arg_count() - (__offset__); \
129-
void **__poly_args = truffle_managed_malloc(sizeof(void*) * __poly_argc); \
130-
for (int i = 0; i < __poly_argc; i++) { \
131-
__poly_args[i] = polyglot_get_arg(i + (__offset__)); \
132-
} \
133-
__res__ = PyTruffle_Arg_ParseTupleAndKeywords((__args__), NULL, polyglot_from_string((__fmt__), SRC_CS), NULL, polyglot_from_OutVarPtr_array((OutVarPtr*)__poly_args, __poly_argc));
105+
va_list __vl; \
106+
va_start(__vl, __offset__); \
107+
__res__ = PyTruffle_Arg_ParseTupleAndKeywords((__args__), NULL, polyglot_from_string((__fmt__), SRC_CS), NULL, &__vl); \
108+
va_end(__vl);
134109

135110

136111
#define CallParseStackWithPolyglotArgs(__res__, __offset__, __args__, __nargs__, __fmt__) \
137-
int __poly_argc = polyglot_get_arg_count() - (__offset__); \
138-
void **__poly_args = truffle_managed_malloc(sizeof(void*) * __poly_argc); \
139-
for (int i = 0; i < __poly_argc; i++) { \
140-
__poly_args[i] = polyglot_get_arg(i + (__offset__)); \
141-
} \
142-
__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));
112+
va_list __vl; \
113+
va_start(__vl, __offset__); \
114+
__res__ = PyTruffle_Arg_ParseTupleAndKeywords(polyglot_from_PyObjectPtr_array((__args__), (__nargs__)), NULL, polyglot_from_string((__fmt__), SRC_CS), NULL, &__vl); \
115+
va_end(__vl);
143116

144117
/* argparse */
145118

146-
OutVarPtr* allocate_outvar() {
147-
return polyglot_from_OutVarPtr(truffle_managed_malloc(sizeof(OutVarPtr)));
148-
}
149-
150-
void get_next_vaarg(va_list *p_va, OutVarPtr *p_outvar) {
151-
p_outvar->content = (OutVar *)va_arg(*p_va, void *);
152-
}
153-
154-
static parseargs_func PyTruffle_Arg_ParseTupleAndKeywords_VaList;
155-
156-
__attribute__((constructor))
157-
static void init_upcall_PyTruffle_Arg_ParseTupleAndKeyword_VaList(void) {
158-
PyTruffle_Arg_ParseTupleAndKeywords_VaList = polyglot_get_member(PY_TRUFFLE_CEXT, polyglot_from_string("PyTruffle_Arg_ParseTupleAndKeywords_VaList", SRC_CS));
159-
}
160-
161119
int PyArg_VaParseTupleAndKeywords(PyObject *argv, PyObject *kwds, const char *format, char **kwdnames, va_list va) {
162120
va_list lva;
163121
va_copy(lva, va);
@@ -166,7 +124,7 @@ int PyArg_VaParseTupleAndKeywords(PyObject *argv, PyObject *kwds, const char *fo
166124
if(kwdnames != NULL) {
167125
for (; kwdnames[__kwdnames_cnt] != NULL ; __kwdnames_cnt++);
168126
}
169-
res =PyTruffle_Arg_ParseTupleAndKeywords_VaList(native_to_java(argv), native_to_java(kwds), polyglot_from_string(format, SRC_CS), polyglot_from_CharPtr_array(kwdnames, __kwdnames_cnt), &lva);
127+
res = PyTruffle_Arg_ParseTupleAndKeywords(native_to_java(argv), native_to_java(kwds), polyglot_from_string(format, SRC_CS), polyglot_from_char_ptr_t_array(kwdnames, __kwdnames_cnt), &lva);
170128
va_end(lva);
171129
return res;
172130
}
@@ -179,32 +137,31 @@ int _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *argv, PyObject *kwds, const c
179137
if(kwdnames != NULL) {
180138
for (; kwdnames[__kwdnames_cnt] != NULL ; __kwdnames_cnt++);
181139
}
182-
res = PyTruffle_Arg_ParseTupleAndKeywords_VaList(native_to_java(argv), native_to_java(kwds), polyglot_from_string(format, SRC_CS), polyglot_from_CharPtr_array(kwdnames, __kwdnames_cnt), &lva);
140+
res = PyTruffle_Arg_ParseTupleAndKeywords(native_to_java(argv), native_to_java(kwds), polyglot_from_string(format, SRC_CS), polyglot_from_char_ptr_t_array(kwdnames, __kwdnames_cnt), &lva);
183141
va_end(lva);
184142
return res;
185143
}
186144

187-
NO_INLINE
188145
int PyArg_ParseTupleAndKeywords(PyObject *argv, PyObject *kwds, const char *format, char** kwdnames, ...) {
189-
CallParseTupleAndKeywordsWithPolyglotArgs(int result, 4, native_to_java(argv), native_to_java(kwds), format, kwdnames);
146+
CallParseTupleAndKeywordsWithPolyglotArgs(int result, kwdnames, native_to_java(argv), native_to_java(kwds), format, kwdnames);
190147
return result;
191148
}
192149

193-
NO_INLINE
150+
194151
int _PyArg_ParseTupleAndKeywords_SizeT(PyObject *argv, PyObject *kwds, const char *format, char** kwdnames, ...) {
195-
CallParseTupleAndKeywordsWithPolyglotArgs(int result, 4, native_to_java(argv), native_to_java(kwds), format, kwdnames);
152+
CallParseTupleAndKeywordsWithPolyglotArgs(int result, kwdnames, native_to_java(argv), native_to_java(kwds), format, kwdnames);
196153
return result;
197154
}
198155

199156
NO_INLINE
200157
int PyArg_ParseStack(PyObject **args, Py_ssize_t nargs, const char* format, ...) {
201-
CallParseStackWithPolyglotArgs(int result, 3, args, nargs, format);
158+
CallParseStackWithPolyglotArgs(int result, format, args, nargs, format);
202159
return result;
203160
}
204161

205162
NO_INLINE
206163
int _PyArg_ParseStack_SizeT(PyObject **args, Py_ssize_t nargs, const char* format, ...) {
207-
CallParseStackWithPolyglotArgs(int result, 3, args, nargs, format);
164+
CallParseStackWithPolyglotArgs(int result, format, args, nargs, format);
208165
return result;
209166
}
210167

@@ -216,28 +173,26 @@ int _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *kwargs, s
216173
return _PyArg_VaParseTupleAndKeywords_SizeT(args, kwargs, parser->format, parser->keywords, va);
217174
}
218175

219-
NO_INLINE
220176
int _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *kwargs, struct _PyArg_Parser *parser, ...) {
221-
CallParseTupleAndKeywordsWithPolyglotArgs(int result, 3, native_to_java(args), native_to_java(kwargs), parser->format, parser->keywords);
177+
CallParseTupleAndKeywordsWithPolyglotArgs(int result, parser, native_to_java(args), native_to_java(kwargs), parser->format, parser->keywords);
222178
return result;
223179
}
224180

225-
NO_INLINE
226181
int _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *kwargs, struct _PyArg_Parser *parser, ...) {
227-
CallParseTupleAndKeywordsWithPolyglotArgs(int result, 3, native_to_java(args), native_to_java(kwargs), parser->format, parser->keywords);
182+
CallParseTupleAndKeywordsWithPolyglotArgs(int result, parser, native_to_java(args), native_to_java(kwargs), parser->format, parser->keywords);
228183
return result;
229184
}
230185

231186

232187
NO_INLINE
233188
int PyArg_ParseTuple(PyObject *args, const char *format, ...) {
234-
CallParseTupleWithPolyglotArgs(int result, 2, native_to_java(args), format);
189+
CallParseTupleWithPolyglotArgs(int result, format, native_to_java(args), format);
235190
return result;
236191
}
237192

238193
NO_INLINE
239194
int _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...) {
240-
CallParseTupleWithPolyglotArgs(int result, 2, native_to_java(args), format);
195+
CallParseTupleWithPolyglotArgs(int result, format, native_to_java(args), format);
241196
return result;
242197
}
243198

@@ -251,13 +206,13 @@ int _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va) {
251206

252207
NO_INLINE
253208
int PyArg_Parse(PyObject *args, const char *format, ...) {
254-
CallParseTupleWithPolyglotArgs(int result, 2, native_to_java(PyTuple_Pack(1, args)), format);
209+
CallParseTupleWithPolyglotArgs(int result, format, native_to_java(PyTuple_Pack(1, args)), format);
255210
return result;
256211
}
257212

258213
NO_INLINE
259214
int _PyArg_Parse_SizeT(PyObject *args, const char *format, ...) {
260-
CallParseTupleWithPolyglotArgs(int result, 2, native_to_java(PyTuple_Pack(1, args)), format);
215+
CallParseTupleWithPolyglotArgs(int result, format, native_to_java(PyTuple_Pack(1, args)), format);
261216
return result;
262217
}
263218

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

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@
160160
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.Charsets;
161161
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ConvertPIntToPrimitiveNode;
162162
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EncodeNativeStringNode;
163-
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.PCallCExtFunction;
164163
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.UnicodeFromWcharNode;
165164
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.ConvertPIntToPrimitiveNodeGen;
166165
import com.oracle.graal.python.builtins.objects.cext.common.CExtContext;
@@ -3287,31 +3286,6 @@ static int doConvert(@SuppressWarnings("unused") Object self, Object[] arguments
32873286

32883287
}
32893288

3290-
@Builtin(name = "PyTruffle_Arg_ParseTupleAndKeywords_VaList", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true)
3291-
@GenerateNodeFactory
3292-
abstract static class ParseTupleAndKeywordsVaListNode extends ParseTupleAndKeywordsBaseNode {
3293-
3294-
@Specialization(guards = "arguments.length == 5", limit = "2")
3295-
static int doConvert(@SuppressWarnings("unused") Object self, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords,
3296-
@CachedContext(PythonLanguage.class) PythonContext context,
3297-
@Cached SplitFormatStringNode splitFormatStringNode,
3298-
@CachedLibrary("getKwds(arguments)") InteropLibrary kwdsRefLib,
3299-
@CachedLibrary("getKwdnames(arguments)") InteropLibrary kwdnamesRefLib,
3300-
@Cached("createBinaryProfile()") ConditionProfile kwdsProfile,
3301-
@Cached("createBinaryProfile()") ConditionProfile kwdnamesProfile,
3302-
@Cached PCallCExtFunction callMallocOutVarPtr,
3303-
@Cached AsPythonObjectNode argvToJavaNode,
3304-
@Cached AsPythonObjectNode kwdsToJavaNode,
3305-
@Cached CastToJavaStringNode castToStringNode,
3306-
@Cached CExtParseArgumentsNode.ParseTupleAndKeywordsNode parseTupleAndKeywordsNode) {
3307-
CExtContext nativeContext = context.getCApiContext();
3308-
Object argv = argvToJavaNode.execute(arguments[0]);
3309-
VaListWrapper varargs = new VaListWrapper(nativeContext, arguments[4], callMallocOutVarPtr.call(nativeContext, NativeCAPISymbols.FUN_ALLOCATE_OUTVAR));
3310-
return ParseTupleAndKeywordsBaseNode.doConvert(nativeContext, argv, arguments[1], arguments[2], arguments[3], varargs, splitFormatStringNode, kwdsRefLib, kwdnamesRefLib, kwdsProfile,
3311-
kwdnamesProfile, kwdsToJavaNode, castToStringNode, parseTupleAndKeywordsNode);
3312-
}
3313-
}
3314-
33153289
@Builtin(name = "PyTruffle_Create_Lightweight_Upcall", minNumOfPositionalArgs = 1)
33163290
@GenerateNodeFactory
33173291
abstract static class PyTruffleCreateLightweightUpcall extends PythonUnaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/NativeCAPISymbols.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ public abstract class NativeCAPISymbols {
8989
public static final String FUN_GET_NEWFUNC_TYPE_ID = "get_newfunc_typeid";
9090
public static final String FUN_GET_BUFFER_R = "get_buffer_r";
9191
public static final String FUN_GET_BUFFER_RW = "get_buffer_rw";
92-
public static final String FUN_ALLOCATE_OUTVAR = "allocate_outvar";
9392
public static final String FUN_NATIVE_UNICODE_AS_STRING = "native_unicode_as_string";
9493
public static final String FUN_PY_UNICODE_GET_LENGTH = "PyUnicode_GetLength";
9594
public static final String FUN_GET_UINT32_ARRAY_TYPE_ID = "get_uint32_array_typeid";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/VaListWrapper.java

Lines changed: 0 additions & 93 deletions
This file was deleted.

0 commit comments

Comments
 (0)