summaryrefslogtreecommitdiff
path: root/Python/Python-ast.c
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2012-01-13 21:43:40 +1000
committerNick Coghlan <ncoghlan@gmail.com>2012-01-13 21:43:40 +1000
commite4f5fc423651e760f014159dce83273f9d54831c (patch)
treee360ee4d0537af068dfc72bd23a8f10923df95af /Python/Python-ast.c
parentc1e6291fd19c26493558363fb75d5395cd05511b (diff)
downloadcpython-e4f5fc423651e760f014159dce83273f9d54831c.tar.gz
Implement PEP 380 - 'yield from' (closes #11682)
Diffstat (limited to 'Python/Python-ast.c')
-rw-r--r--Python/Python-ast.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 8a101cf3b0..3121eb1bb7 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -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;
}