diff options
author | Guido van Rossum <guido@python.org> | 2023-01-17 23:59:19 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-17 23:59:19 (GMT) |
commit | 80e3e3423cb456ba341f95d6a07e94cf3b16c0be (patch) | |
tree | 32ddc8bc516b2010d48a529c9cc03fb68631c80e /Python/generated_cases.c.h | |
parent | f34176b77f222726d901595968a4b44456186da4 (diff) | |
download | cpython-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.h | 102 |
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(); } |