|
|
|
@ -69,6 +69,7 @@ static PyObject * unicode_concatenate(PyObject *, PyObject *, |
|
|
|
static PyObject * special_lookup(PyObject *, _Py_Identifier *); |
|
|
|
static int check_args_iterable(PyObject *func, PyObject *vararg); |
|
|
|
static void format_kwargs_mapping_error(PyObject *func, PyObject *kwargs); |
|
|
|
static void format_awaitable_error(PyTypeObject *, int); |
|
|
|
|
|
|
|
#define NAME_ERROR_MSG \ |
|
|
|
"name '%.200s' is not defined" |
|
|
|
@ -1736,6 +1737,11 @@ main_loop: |
|
|
|
PyObject *iterable = TOP(); |
|
|
|
PyObject *iter = _PyCoro_GetAwaitableIter(iterable); |
|
|
|
|
|
|
|
if (iter == NULL) { |
|
|
|
format_awaitable_error(Py_TYPE(iterable), |
|
|
|
_Py_OPCODE(next_instr[-2])); |
|
|
|
} |
|
|
|
|
|
|
|
Py_DECREF(iterable); |
|
|
|
|
|
|
|
if (iter != NULL && PyCoro_CheckExact(iter)) { |
|
|
|
@ -4985,6 +4991,25 @@ format_exc_unbound(PyCodeObject *co, int oparg) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void |
|
|
|
format_awaitable_error(PyTypeObject *type, int prevopcode) |
|
|
|
{ |
|
|
|
if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) { |
|
|
|
if (prevopcode == BEFORE_ASYNC_WITH) { |
|
|
|
PyErr_Format(PyExc_TypeError, |
|
|
|
"'async with' received an object from __aenter__ " |
|
|
|
"that does not implement __await__: %.100s", |
|
|
|
type->tp_name); |
|
|
|
} |
|
|
|
else if (prevopcode == WITH_CLEANUP_START) { |
|
|
|
PyErr_Format(PyExc_TypeError, |
|
|
|
"'async with' received an object from __aexit__ " |
|
|
|
"that does not implement __await__: %.100s", |
|
|
|
type->tp_name); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static PyObject * |
|
|
|
unicode_concatenate(PyObject *v, PyObject *w, |
|
|
|
PyFrameObject *f, const _Py_CODEUNIT *next_instr) |
|
|
|
|