mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
Implement PEP 380 - 'yield from' (closes #11682)
This commit is contained in:
parent
e51757f6de
commit
1f7ce62bd6
33 changed files with 872 additions and 421 deletions
|
@ -231,7 +231,9 @@ static char *GeneratorExp_fields[]={
|
|||
"generators",
|
||||
};
|
||||
static PyTypeObject *Yield_type;
|
||||
_Py_IDENTIFIER(is_from);
|
||||
static char *Yield_fields[]={
|
||||
"is_from",
|
||||
"value",
|
||||
};
|
||||
static PyTypeObject *Compare_type;
|
||||
|
@ -810,7 +812,7 @@ static int init_types(void)
|
|||
GeneratorExp_type = make_type("GeneratorExp", expr_type,
|
||||
GeneratorExp_fields, 2);
|
||||
if (!GeneratorExp_type) return 0;
|
||||
Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
|
||||
Yield_type = make_type("Yield", expr_type, Yield_fields, 2);
|
||||
if (!Yield_type) return 0;
|
||||
Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
|
||||
if (!Compare_type) return 0;
|
||||
|
@ -1747,13 +1749,14 @@ GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
|
|||
}
|
||||
|
||||
expr_ty
|
||||
Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
|
||||
Yield(int is_from, expr_ty value, int lineno, int col_offset, PyArena *arena)
|
||||
{
|
||||
expr_ty p;
|
||||
p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
|
||||
if (!p)
|
||||
return NULL;
|
||||
p->kind = Yield_kind;
|
||||
p->v.Yield.is_from = is_from;
|
||||
p->v.Yield.value = value;
|
||||
p->lineno = lineno;
|
||||
p->col_offset = col_offset;
|
||||
|
@ -2795,6 +2798,11 @@ ast2obj_expr(void* _o)
|
|||
case Yield_kind:
|
||||
result = PyType_GenericNew(Yield_type, NULL, NULL);
|
||||
if (!result) goto failed;
|
||||
value = ast2obj_int(o->v.Yield.is_from);
|
||||
if (!value) goto failed;
|
||||
if (PyObject_SetAttrString(result, "is_from", value) == -1)
|
||||
goto failed;
|
||||
Py_DECREF(value);
|
||||
value = ast2obj_expr(o->v.Yield.value);
|
||||
if (!value) goto failed;
|
||||
if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
|
||||
|
@ -5337,8 +5345,21 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
|
|||
return 1;
|
||||
}
|
||||
if (isinstance) {
|
||||
int is_from;
|
||||
expr_ty value;
|
||||
|
||||
if (_PyObject_HasAttrId(obj, &PyId_is_from)) {
|
||||
int res;
|
||||
tmp = _PyObject_GetAttrId(obj, &PyId_is_from);
|
||||
if (tmp == NULL) goto failed;
|
||||
res = obj2ast_int(tmp, &is_from, arena);
|
||||
if (res != 0) goto failed;
|
||||
Py_XDECREF(tmp);
|
||||
tmp = NULL;
|
||||
} else {
|
||||
PyErr_SetString(PyExc_TypeError, "required field \"is_from\" missing from Yield");
|
||||
return 1;
|
||||
}
|
||||
if (_PyObject_HasAttrId(obj, &PyId_value)) {
|
||||
int res;
|
||||
tmp = _PyObject_GetAttrId(obj, &PyId_value);
|
||||
|
@ -5350,7 +5371,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
|
|||
} else {
|
||||
value = NULL;
|
||||
}
|
||||
*out = Yield(value, lineno, col_offset, arena);
|
||||
*out = Yield(is_from, value, lineno, col_offset, arena);
|
||||
if (*out == NULL) goto failed;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue