gh-98831: rewrite BEFORE_ASYNC_WITH and END_ASYNC_FOR in the instruction definition DSL (#101458)

This commit is contained in:
Irit Katriel 2023-01-31 18:47:50 +00:00 committed by GitHub
parent f80db6cef0
commit 0062f538d9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 38 deletions

View file

@ -981,18 +981,21 @@
}
TARGET(END_ASYNC_FOR) {
PyObject *val = POP();
assert(val && PyExceptionInstance_Check(val));
if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) {
Py_DECREF(val);
Py_DECREF(POP());
PyObject *exc = PEEK(1);
PyObject *awaitable = PEEK(2);
assert(exc && PyExceptionInstance_Check(exc));
if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
Py_DECREF(awaitable);
Py_DECREF(exc);
}
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_SHRINK(2);
DISPATCH();
}
@ -2699,7 +2702,8 @@
}
TARGET(BEFORE_ASYNC_WITH) {
PyObject *mgr = TOP();
PyObject *mgr = PEEK(1);
PyObject *exit;
PyObject *res;
PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__));
if (enter == NULL) {
@ -2711,7 +2715,7 @@
}
goto error;
}
PyObject *exit = _PyObject_LookupSpecial(mgr, &_Py_ID(__aexit__));
exit = _PyObject_LookupSpecial(mgr, &_Py_ID(__aexit__));
if (exit == NULL) {
if (!_PyErr_Occurred(tstate)) {
_PyErr_Format(tstate, PyExc_TypeError,
@ -2723,13 +2727,16 @@
Py_DECREF(enter);
goto error;
}
SET_TOP(exit);
Py_DECREF(mgr);
res = _PyObject_CallNoArgs(enter);
Py_DECREF(enter);
if (res == NULL)
goto error;
PUSH(res);
if (res == NULL) {
Py_DECREF(exit);
if (true) goto pop_1_error;
}
STACK_GROW(1);
POKE(1, res);
POKE(2, exit);
PREDICT(GET_AWAITABLE);
DISPATCH();
}