Skip to content

Commit ff869e7

Browse files
committed
Implement C API function 'PyArg_UnpackTuple'.
1 parent 4beee95 commit ff869e7

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,29 @@ extern int PyTruffle_UnpackStack(PyObject *const *args, Py_ssize_t nargs, cons
321321
#define ARG_PARSE__PyArg_UnpackStack_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, NAME, ...) NAME
322322
#define _PyArg_UnpackStack(F1, F2, F3, F4, F5, ...) ARG_PARSE__PyArg_UnpackStack_IMPL(__VA_ARGS__, PyTruffle_UnpackStack_20, PyTruffle_UnpackStack_19, PyTruffle_UnpackStack_18, PyTruffle_UnpackStack_17, PyTruffle_UnpackStack_16, PyTruffle_UnpackStack_15, PyTruffle_UnpackStack_14, PyTruffle_UnpackStack_13, PyTruffle_UnpackStack_12, PyTruffle_UnpackStack_11, PyTruffle_UnpackStack_10, PyTruffle_UnpackStack_9, PyTruffle_UnpackStack_8, PyTruffle_UnpackStack_7, PyTruffle_UnpackStack_6, PyTruffle_UnpackStack_5, PyTruffle_UnpackStack_4, PyTruffle_UnpackStack_3, PyTruffle_UnpackStack_2, PyTruffle_UnpackStack_1, PyTruffle_UnpackStack_0)(F1, F2, F3, F4, F5, ##__VA_ARGS__)
323323

324+
extern int PyTruffle_Arg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, 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);
325+
#define PyTruffle_Arg_UnpackTuple_0(F1, F2, F3, F4) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
326+
#define PyTruffle_Arg_UnpackTuple_1(F1, F2, F3, F4, V1) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 1, (void*)(V1), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
327+
#define PyTruffle_Arg_UnpackTuple_2(F1, F2, F3, F4, V1, V2) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 2, (void*)(V1), (void*)(V2), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
328+
#define PyTruffle_Arg_UnpackTuple_3(F1, F2, F3, F4, V1, V2, V3) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 3, (void*)(V1), (void*)(V2), (void*)(V3), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
329+
#define PyTruffle_Arg_UnpackTuple_4(F1, F2, F3, F4, V1, V2, V3, V4) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
330+
#define PyTruffle_Arg_UnpackTuple_5(F1, F2, F3, F4, V1, V2, V3, V4, V5) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
331+
#define PyTruffle_Arg_UnpackTuple_6(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
332+
#define PyTruffle_Arg_UnpackTuple_7(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
333+
#define PyTruffle_Arg_UnpackTuple_8(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
334+
#define PyTruffle_Arg_UnpackTuple_9(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
335+
#define PyTruffle_Arg_UnpackTuple_10(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
336+
#define PyTruffle_Arg_UnpackTuple_11(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
337+
#define PyTruffle_Arg_UnpackTuple_12(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
338+
#define PyTruffle_Arg_UnpackTuple_13(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
339+
#define PyTruffle_Arg_UnpackTuple_14(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
340+
#define PyTruffle_Arg_UnpackTuple_15(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
341+
#define PyTruffle_Arg_UnpackTuple_16(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
342+
#define PyTruffle_Arg_UnpackTuple_17(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
343+
#define PyTruffle_Arg_UnpackTuple_18(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
344+
#define PyTruffle_Arg_UnpackTuple_19(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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)
345+
#define PyTruffle_Arg_UnpackTuple_20(F1, F2, F3, F4, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20) PyTruffle_Arg_UnpackTuple(F1, F2, F3, F4, 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))
346+
#define ARG_PARSE_PyArg_UnpackTuple_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, NAME, ...) NAME
347+
#define PyArg_UnpackTuple(F1, F2, F3, F4, ...) ARG_PARSE_PyArg_UnpackTuple_IMPL(__VA_ARGS__, PyTruffle_Arg_UnpackTuple_20, PyTruffle_Arg_UnpackTuple_19, PyTruffle_Arg_UnpackTuple_18, PyTruffle_Arg_UnpackTuple_17, PyTruffle_Arg_UnpackTuple_16, PyTruffle_Arg_UnpackTuple_15, PyTruffle_Arg_UnpackTuple_14, PyTruffle_Arg_UnpackTuple_13, PyTruffle_Arg_UnpackTuple_12, PyTruffle_Arg_UnpackTuple_11, PyTruffle_Arg_UnpackTuple_10, PyTruffle_Arg_UnpackTuple_9, PyTruffle_Arg_UnpackTuple_8, PyTruffle_Arg_UnpackTuple_7, PyTruffle_Arg_UnpackTuple_6, PyTruffle_Arg_UnpackTuple_5, PyTruffle_Arg_UnpackTuple_4, PyTruffle_Arg_UnpackTuple_3, PyTruffle_Arg_UnpackTuple_2, PyTruffle_Arg_UnpackTuple_1, PyTruffle_Arg_UnpackTuple_0)(F1, F2, F3, F4, ##__VA_ARGS__)
348+
324349
#endif

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,3 +728,69 @@ int _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name
728728
#define _PyArg_UnpackStack _backup_PyArg_UnpackStack
729729
#undef _backup_PyArg_UnpackStack
730730
#endif
731+
732+
int PyTruffle_Arg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, 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) {
733+
Py_ssize_t i, l;
734+
PyObject **o;
735+
736+
assert(min >= 0);
737+
assert(min <= max);
738+
if (!PyTuple_Check(args)) {
739+
PyErr_SetString(PyExc_SystemError,
740+
"PyArg_UnpackTuple() argument list is not a tuple");
741+
return 0;
742+
}
743+
l = PyTuple_GET_SIZE(args);
744+
if (l < min) {
745+
if (name != NULL)
746+
PyErr_Format(
747+
PyExc_TypeError,
748+
"%s expected %s%zd arguments, got %zd",
749+
name, (min == max ? "" : "at least "), min, l);
750+
else
751+
PyErr_Format(
752+
PyExc_TypeError,
753+
"unpacked tuple should have %s%zd elements,"
754+
" but has %zd",
755+
(min == max ? "" : "at least "), min, l);
756+
return 0;
757+
}
758+
if (l == 0)
759+
return 1;
760+
if (l > max) {
761+
if (name != NULL)
762+
PyErr_Format(
763+
PyExc_TypeError,
764+
"%s expected %s%zd arguments, got %zd",
765+
name, (min == max ? "" : "at most "), max, l);
766+
else
767+
PyErr_Format(
768+
PyExc_TypeError,
769+
"unpacked tuple should have %s%zd elements,"
770+
" but has %zd",
771+
(min == max ? "" : "at most "), max, l);
772+
return 0;
773+
}
774+
775+
for (i = 0; i < l; i++) {
776+
o = PyTruffle_ArgN(i);
777+
*o = PyTuple_GET_ITEM(args, i);
778+
}
779+
return 1;
780+
}
781+
782+
#ifdef PyArg_UnpackTuple
783+
#define _backup_PyArg_UnpackTuple PyArg_UnpackTuple
784+
#undef PyArg_UnpackTuple
785+
#endif
786+
// partially taken from CPython 3.6.4 "Python/getargs.c"
787+
int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) {
788+
#define ARG(__i__) ((__i__)+4 < n ? polyglot_get_arg((__i__)+4) : NULL)
789+
int n = polyglot_get_arg_count();
790+
return PyTruffle_Arg_UnpackTuple(args, name, min, max, n-4, ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(8), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18), ARG(19));
791+
#undef ARG
792+
}
793+
#ifdef _backup_PyArg_UnpackTuple
794+
#define PyArg_UnpackTuple _backup_PyArg_UnpackTuple
795+
#undef _backup_PyArg_UnpackTuple
796+
#endif

0 commit comments

Comments
 (0)