summaryrefslogtreecommitdiffstats
path: root/Python/generated_cases.c.h
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-01-17 23:59:19 (GMT)
committerGitHub <noreply@github.com>2023-01-17 23:59:19 (GMT)
commit80e3e3423cb456ba341f95d6a07e94cf3b16c0be (patch)
tree32ddc8bc516b2010d48a529c9cc03fb68631c80e /Python/generated_cases.c.h
parentf34176b77f222726d901595968a4b44456186da4 (diff)
downloadcpython-80e3e3423cb456ba341f95d6a07e94cf3b16c0be.zip
cpython-80e3e3423cb456ba341f95d6a07e94cf3b16c0be.tar.gz
cpython-80e3e3423cb456ba341f95d6a07e94cf3b16c0be.tar.bz2
GH-98831: Implement array support in cases generator (#100912)
You can now write things like this: ``` inst(BUILD_STRING, (pieces[oparg] -- str)) { ... } inst(LIST_APPEND, (list, unused[oparg-1], v -- list, unused[oparg-1])) { ... } ``` Note that array output effects are only partially supported (they must be named `unused` or correspond to an input effect).
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r--Python/generated_cases.c.h102
1 files changed, 55 insertions, 47 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index e9819df..445511d 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -574,7 +574,7 @@
TARGET(LIST_APPEND) {
PyObject *v = PEEK(1);
- PyObject *list = PEEK(oparg + 1); // +1 to account for v staying on stack
+ PyObject *list = PEEK(2 + (oparg-1));
if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error;
STACK_SHRINK(1);
PREDICT(JUMP_BACKWARD);
@@ -583,7 +583,7 @@
TARGET(SET_ADD) {
PyObject *v = PEEK(1);
- PyObject *set = PEEK(oparg + 1); // +1 to account for v staying on stack
+ PyObject *set = PEEK(2 + (oparg-1));
int err = PySet_Add(set, v);
Py_DECREF(v);
if (err) goto pop_1_error;
@@ -1511,40 +1511,44 @@
}
TARGET(BUILD_STRING) {
+ PyObject **pieces = &PEEK(oparg);
PyObject *str;
- str = _PyUnicode_JoinArray(&_Py_STR(empty),
- stack_pointer - oparg, oparg);
- if (str == NULL)
- goto error;
- while (--oparg >= 0) {
- PyObject *item = POP();
- Py_DECREF(item);
+ str = _PyUnicode_JoinArray(&_Py_STR(empty), pieces, oparg);
+ for (int i = 0; i < oparg; i++) {
+ Py_DECREF(pieces[i]);
}
- PUSH(str);
+ if (str == NULL) { STACK_SHRINK(oparg); goto error; }
+ STACK_SHRINK(oparg);
+ STACK_GROW(1);
+ POKE(1, str);
DISPATCH();
}
TARGET(BUILD_TUPLE) {
+ PyObject **values = &PEEK(oparg);
+ PyObject *tup;
+ tup = _PyTuple_FromArraySteal(values, oparg);
+ if (tup == NULL) { STACK_SHRINK(oparg); goto error; }
STACK_SHRINK(oparg);
- PyObject *tup = _PyTuple_FromArraySteal(stack_pointer, oparg);
- if (tup == NULL)
- goto error;
- PUSH(tup);
+ STACK_GROW(1);
+ POKE(1, tup);
DISPATCH();
}
TARGET(BUILD_LIST) {
+ PyObject **values = &PEEK(oparg);
+ PyObject *list;
+ list = _PyList_FromArraySteal(values, oparg);
+ if (list == NULL) { STACK_SHRINK(oparg); goto error; }
STACK_SHRINK(oparg);
- PyObject *list = _PyList_FromArraySteal(stack_pointer, oparg);
- if (list == NULL)
- goto error;
- PUSH(list);
+ STACK_GROW(1);
+ POKE(1, list);
DISPATCH();
}
TARGET(LIST_EXTEND) {
PyObject *iterable = PEEK(1);
- PyObject *list = PEEK(oparg + 1); // iterable is still on the stack
+ PyObject *list = PEEK(2 + (oparg-1));
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
if (none_val == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
@@ -1566,7 +1570,7 @@
TARGET(SET_UPDATE) {
PyObject *iterable = PEEK(1);
- PyObject *set = PEEK(oparg + 1); // iterable is still on the stack
+ PyObject *set = PEEK(2 + (oparg-1));
int err = _PySet_Update(set, iterable);
Py_DECREF(iterable);
if (err < 0) goto pop_1_error;
@@ -1575,39 +1579,44 @@
}
TARGET(BUILD_SET) {
- PyObject *set = PySet_New(NULL);
+ PyObject **values = &PEEK(oparg);
+ PyObject *set;
+ set = PySet_New(NULL);
int err = 0;
- int i;
- if (set == NULL)
- goto error;
- for (i = oparg; i > 0; i--) {
- PyObject *item = PEEK(i);
+ for (int i = 0; i < oparg; i++) {
+ PyObject *item = values[i];
if (err == 0)
err = PySet_Add(set, item);
Py_DECREF(item);
}
- STACK_SHRINK(oparg);
if (err != 0) {
Py_DECREF(set);
- goto error;
+ if (true) { STACK_SHRINK(oparg); goto error; }
}
- PUSH(set);
+ STACK_SHRINK(oparg);
+ STACK_GROW(1);
+ POKE(1, set);
DISPATCH();
}
TARGET(BUILD_MAP) {
- PyObject *map = _PyDict_FromItems(
- &PEEK(2*oparg), 2,
- &PEEK(2*oparg - 1), 2,
+ PyObject **values = &PEEK(oparg*2);
+ PyObject *map;
+ map = _PyDict_FromItems(
+ values, 2,
+ values+1, 2,
oparg);
if (map == NULL)
goto error;
- while (oparg--) {
- Py_DECREF(POP());
- Py_DECREF(POP());
+ for (int i = 0; i < oparg; i++) {
+ Py_DECREF(values[i*2]);
+ Py_DECREF(values[i*2+1]);
}
- PUSH(map);
+ if (map == NULL) { STACK_SHRINK(oparg*2); goto error; }
+ STACK_SHRINK(oparg*2);
+ STACK_GROW(1);
+ POKE(1, map);
DISPATCH();
}
@@ -1655,26 +1664,25 @@
}
TARGET(BUILD_CONST_KEY_MAP) {
+ PyObject *keys = PEEK(1);
+ PyObject **values = &PEEK(1 + oparg);
PyObject *map;
- PyObject *keys = TOP();
if (!PyTuple_CheckExact(keys) ||
PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
_PyErr_SetString(tstate, PyExc_SystemError,
"bad BUILD_CONST_KEY_MAP keys argument");
- goto error;
+ goto error; // Pop the keys and values.
}
map = _PyDict_FromItems(
&PyTuple_GET_ITEM(keys, 0), 1,
- &PEEK(oparg + 1), 1, oparg);
- if (map == NULL) {
- goto error;
- }
-
- Py_DECREF(POP());
- while (oparg--) {
- Py_DECREF(POP());
+ values, 1, oparg);
+ Py_DECREF(keys);
+ for (int i = 0; i < oparg; i++) {
+ Py_DECREF(values[i]);
}
- PUSH(map);
+ if (map == NULL) { STACK_SHRINK(oparg); goto pop_1_error; }
+ STACK_SHRINK(oparg);
+ POKE(1, map);
DISPATCH();
}