gh-98831: rewrite BEFORE_ASYNC_WITH and END_ASYNC_FOR in the instruction definition DSL by iritkatriel · Pull Request #101458 · python/cpython
// stack effect: (__0, __1 -- ) inst(END_ASYNC_FOR) { PyObject *val = POP(); assert(val && PyExceptionInstance_Check(val)); if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) { Py_DECREF(val); Py_DECREF(POP()); inst(END_ASYNC_FOR, (awaitable, exc -- )) { assert(exc && PyExceptionInstance_Check(exc)); if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { DECREF_INPUTS(); } else { PyObject *exc = Py_NewRef(PyExceptionInstance_Class(val)); PyObject *tb = PyException_GetTraceback(val); _PyErr_Restore(tstate, exc, val, tb); Py_INCREF(exc); PyObject *typ = Py_NewRef(PyExceptionInstance_Class(exc)); PyObject *tb = PyException_GetTraceback(exc); _PyErr_Restore(tstate, typ, exc, tb); goto exception_unwind; } }
// stack effect: ( -- __0) inst(BEFORE_ASYNC_WITH) { PyObject *mgr = TOP(); PyObject *res; inst(BEFORE_ASYNC_WITH, (mgr -- exit, res)) { PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) {