mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +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;
|
||||
}
|
||||
|
|
21
Python/ast.c
21
Python/ast.c
|
@ -2369,13 +2369,24 @@ ast_for_expr(struct compiling *c, const node *n)
|
|||
}
|
||||
return ast_for_binop(c, n);
|
||||
case yield_expr: {
|
||||
node *an = NULL;
|
||||
node *en = NULL;
|
||||
int is_from = 0;
|
||||
expr_ty exp = NULL;
|
||||
if (NCH(n) == 2) {
|
||||
exp = ast_for_testlist(c, CHILD(n, 1));
|
||||
if (NCH(n) > 1)
|
||||
an = CHILD(n, 1); /* yield_arg */
|
||||
if (an) {
|
||||
en = CHILD(an, NCH(an) - 1);
|
||||
if (NCH(an) == 2) {
|
||||
is_from = 1;
|
||||
exp = ast_for_expr(c, en);
|
||||
}
|
||||
else
|
||||
exp = ast_for_testlist(c, en);
|
||||
if (!exp)
|
||||
return NULL;
|
||||
}
|
||||
return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
|
||||
return Yield(is_from, exp, LINENO(n), n->n_col_offset, c->c_arena);
|
||||
}
|
||||
case factor:
|
||||
if (NCH(n) == 1) {
|
||||
|
@ -2399,7 +2410,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
|
|||
/*
|
||||
arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
|
||||
| '**' test)
|
||||
argument: [test '='] test [comp_for] # Really [keyword '='] test
|
||||
argument: [test '='] (test) [comp_for] # Really [keyword '='] test
|
||||
*/
|
||||
|
||||
int i, nargs, nkeywords, ngens;
|
||||
|
@ -2693,7 +2704,7 @@ ast_for_flow_stmt(struct compiling *c, const node *n)
|
|||
continue_stmt: 'continue'
|
||||
return_stmt: 'return' [testlist]
|
||||
yield_stmt: yield_expr
|
||||
yield_expr: 'yield' testlist
|
||||
yield_expr: 'yield' testlist | 'yield' 'from' test
|
||||
raise_stmt: 'raise' [test [',' test [',' test]]]
|
||||
*/
|
||||
node *ch;
|
||||
|
|
|
@ -1828,6 +1828,52 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
why = WHY_RETURN;
|
||||
goto fast_block_end;
|
||||
|
||||
TARGET(YIELD_FROM)
|
||||
u = POP();
|
||||
x = PyObject_GetIter(u);
|
||||
Py_DECREF(u);
|
||||
if (x == NULL)
|
||||
break;
|
||||
/* x is now the iterator, make the first next() call */
|
||||
retval = (*Py_TYPE(x)->tp_iternext)(x);
|
||||
if (!retval) {
|
||||
/* iter may be exhausted */
|
||||
Py_CLEAR(x);
|
||||
if (!PyErr_ExceptionMatches(PyExc_StopIteration)) {
|
||||
/* some other exception */
|
||||
break;
|
||||
}
|
||||
/* try to get return value from exception */
|
||||
PyObject *et, *ev, *tb;
|
||||
PyErr_Fetch(&et, &ev, &tb);
|
||||
Py_XDECREF(et);
|
||||
Py_XDECREF(tb);
|
||||
/* u is return value */
|
||||
u = NULL;
|
||||
if (ev) {
|
||||
u = PyObject_GetAttrString(ev, "value");
|
||||
Py_DECREF(ev);
|
||||
if (u == NULL) {
|
||||
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
||||
/* some other exception */
|
||||
break;
|
||||
}
|
||||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
if (u == NULL) {
|
||||
u = Py_None;
|
||||
Py_INCREF(u);
|
||||
}
|
||||
PUSH(u);
|
||||
continue;
|
||||
}
|
||||
/* x is iterator, retval is value to be yielded */
|
||||
f->f_yieldfrom = x;
|
||||
f->f_stacktop = stack_pointer;
|
||||
why = WHY_YIELD;
|
||||
goto fast_yield;
|
||||
|
||||
TARGET(YIELD_VALUE)
|
||||
retval = POP();
|
||||
f->f_stacktop = stack_pointer;
|
||||
|
|
|
@ -840,6 +840,7 @@ opcode_stack_effect(int opcode, int oparg)
|
|||
case IMPORT_STAR:
|
||||
return -1;
|
||||
case YIELD_VALUE:
|
||||
case YIELD_FROM:
|
||||
return 0;
|
||||
|
||||
case POP_BLOCK:
|
||||
|
@ -3318,7 +3319,12 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
|
|||
else {
|
||||
ADDOP_O(c, LOAD_CONST, Py_None, consts);
|
||||
}
|
||||
ADDOP(c, YIELD_VALUE);
|
||||
if (e->v.Yield.is_from) {
|
||||
ADDOP(c, YIELD_FROM);
|
||||
}
|
||||
else {
|
||||
ADDOP(c, YIELD_VALUE);
|
||||
}
|
||||
break;
|
||||
case Compare_kind:
|
||||
return compiler_compare(c, e);
|
||||
|
|
|
@ -1791,7 +1791,7 @@ static arc arcs_80_0[1] = {
|
|||
{167, 1},
|
||||
};
|
||||
static arc arcs_80_1[2] = {
|
||||
{9, 2},
|
||||
{168, 2},
|
||||
{0, 1},
|
||||
};
|
||||
static arc arcs_80_2[1] = {
|
||||
|
@ -1802,171 +1802,188 @@ static state states_80[3] = {
|
|||
{2, arcs_80_1},
|
||||
{1, arcs_80_2},
|
||||
};
|
||||
static dfa dfas[81] = {
|
||||
{256, "single_input", 0, 3, states_0,
|
||||
"\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
|
||||
{257, "file_input", 0, 2, states_1,
|
||||
"\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
|
||||
{258, "eval_input", 0, 3, states_2,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{259, "decorator", 0, 7, states_3,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{260, "decorators", 0, 2, states_4,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{261, "decorated", 0, 3, states_5,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{262, "funcdef", 0, 8, states_6,
|
||||
"\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{263, "parameters", 0, 4, states_7,
|
||||
"\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{264, "typedargslist", 0, 18, states_8,
|
||||
"\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{265, "tfpdef", 0, 4, states_9,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{266, "varargslist", 0, 18, states_10,
|
||||
"\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{267, "vfpdef", 0, 2, states_11,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{268, "stmt", 0, 2, states_12,
|
||||
"\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
|
||||
{269, "simple_stmt", 0, 4, states_13,
|
||||
"\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
|
||||
{270, "small_stmt", 0, 2, states_14,
|
||||
"\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
|
||||
{271, "expr_stmt", 0, 6, states_15,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{272, "testlist_star_expr", 0, 3, states_16,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{273, "augassign", 0, 2, states_17,
|
||||
"\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{274, "del_stmt", 0, 3, states_18,
|
||||
"\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{275, "pass_stmt", 0, 2, states_19,
|
||||
"\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{276, "flow_stmt", 0, 2, states_20,
|
||||
"\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200"},
|
||||
{277, "break_stmt", 0, 2, states_21,
|
||||
"\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{278, "continue_stmt", 0, 2, states_22,
|
||||
"\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{279, "return_stmt", 0, 3, states_23,
|
||||
"\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{280, "yield_stmt", 0, 2, states_24,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"},
|
||||
{281, "raise_stmt", 0, 5, states_25,
|
||||
"\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{282, "import_stmt", 0, 2, states_26,
|
||||
"\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{283, "import_name", 0, 3, states_27,
|
||||
"\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{284, "import_from", 0, 8, states_28,
|
||||
"\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{285, "import_as_name", 0, 4, states_29,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{286, "dotted_as_name", 0, 4, states_30,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{287, "import_as_names", 0, 3, states_31,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{288, "dotted_as_names", 0, 2, states_32,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{289, "dotted_name", 0, 2, states_33,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{290, "global_stmt", 0, 3, states_34,
|
||||
"\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
|
||||
{291, "nonlocal_stmt", 0, 3, states_35,
|
||||
"\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"},
|
||||
{292, "assert_stmt", 0, 5, states_36,
|
||||
"\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"},
|
||||
{293, "compound_stmt", 0, 2, states_37,
|
||||
"\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004"},
|
||||
{294, "if_stmt", 0, 8, states_38,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"},
|
||||
{295, "while_stmt", 0, 8, states_39,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000"},
|
||||
{296, "for_stmt", 0, 10, states_40,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
|
||||
{297, "try_stmt", 0, 13, states_41,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000"},
|
||||
{298, "with_stmt", 0, 5, states_42,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"},
|
||||
{299, "with_item", 0, 4, states_43,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{300, "except_clause", 0, 5, states_44,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"},
|
||||
{301, "suite", 0, 5, states_45,
|
||||
"\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
|
||||
{302, "test", 0, 6, states_46,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{303, "test_nocond", 0, 2, states_47,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{304, "lambdef", 0, 5, states_48,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
|
||||
{305, "lambdef_nocond", 0, 5, states_49,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
|
||||
{306, "or_test", 0, 2, states_50,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
|
||||
{307, "and_test", 0, 2, states_51,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
|
||||
{308, "not_test", 0, 3, states_52,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
|
||||
{309, "comparison", 0, 2, states_53,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{310, "comp_op", 0, 4, states_54,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000"},
|
||||
{311, "star_expr", 0, 3, states_55,
|
||||
"\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{312, "expr", 0, 2, states_56,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{313, "xor_expr", 0, 2, states_57,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{314, "and_expr", 0, 2, states_58,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{315, "shift_expr", 0, 2, states_59,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{316, "arith_expr", 0, 2, states_60,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{317, "term", 0, 2, states_61,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{318, "factor", 0, 3, states_62,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{319, "power", 0, 4, states_63,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"},
|
||||
{320, "atom", 0, 9, states_64,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"},
|
||||
{321, "testlist_comp", 0, 5, states_65,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{322, "trailer", 0, 7, states_66,
|
||||
"\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000"},
|
||||
{323, "subscriptlist", 0, 3, states_67,
|
||||
"\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{324, "subscript", 0, 5, states_68,
|
||||
"\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{325, "sliceop", 0, 3, states_69,
|
||||
"\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{326, "exprlist", 0, 3, states_70,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
|
||||
{327, "testlist", 0, 3, states_71,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{328, "dictorsetmaker", 0, 11, states_72,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{329, "classdef", 0, 8, states_73,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004"},
|
||||
{330, "arglist", 0, 8, states_74,
|
||||
"\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{331, "argument", 0, 4, states_75,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
|
||||
{332, "comp_iter", 0, 2, states_76,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000"},
|
||||
{333, "comp_for", 0, 6, states_77,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
|
||||
{334, "comp_if", 0, 4, states_78,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"},
|
||||
{335, "encoding_decl", 0, 2, states_79,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{336, "yield_expr", 0, 3, states_80,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"},
|
||||
static arc arcs_81_0[2] = {
|
||||
{73, 1},
|
||||
{9, 2},
|
||||
};
|
||||
static label labels[168] = {
|
||||
static arc arcs_81_1[1] = {
|
||||
{24, 2},
|
||||
};
|
||||
static arc arcs_81_2[1] = {
|
||||
{0, 2},
|
||||
};
|
||||
static state states_81[3] = {
|
||||
{2, arcs_81_0},
|
||||
{1, arcs_81_1},
|
||||
{1, arcs_81_2},
|
||||
};
|
||||
static dfa dfas[82] = {
|
||||
{256, "single_input", 0, 3, states_0,
|
||||
"\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
|
||||
{257, "file_input", 0, 2, states_1,
|
||||
"\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
|
||||
{258, "eval_input", 0, 3, states_2,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{259, "decorator", 0, 7, states_3,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{260, "decorators", 0, 2, states_4,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{261, "decorated", 0, 3, states_5,
|
||||
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{262, "funcdef", 0, 8, states_6,
|
||||
"\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{263, "parameters", 0, 4, states_7,
|
||||
"\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{264, "typedargslist", 0, 18, states_8,
|
||||
"\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{265, "tfpdef", 0, 4, states_9,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{266, "varargslist", 0, 18, states_10,
|
||||
"\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{267, "vfpdef", 0, 2, states_11,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{268, "stmt", 0, 2, states_12,
|
||||
"\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
|
||||
{269, "simple_stmt", 0, 4, states_13,
|
||||
"\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
|
||||
{270, "small_stmt", 0, 2, states_14,
|
||||
"\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
|
||||
{271, "expr_stmt", 0, 6, states_15,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{272, "testlist_star_expr", 0, 3, states_16,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{273, "augassign", 0, 2, states_17,
|
||||
"\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{274, "del_stmt", 0, 3, states_18,
|
||||
"\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{275, "pass_stmt", 0, 2, states_19,
|
||||
"\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{276, "flow_stmt", 0, 2, states_20,
|
||||
"\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200\000"},
|
||||
{277, "break_stmt", 0, 2, states_21,
|
||||
"\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{278, "continue_stmt", 0, 2, states_22,
|
||||
"\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{279, "return_stmt", 0, 3, states_23,
|
||||
"\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{280, "yield_stmt", 0, 2, states_24,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},
|
||||
{281, "raise_stmt", 0, 5, states_25,
|
||||
"\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{282, "import_stmt", 0, 2, states_26,
|
||||
"\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{283, "import_name", 0, 3, states_27,
|
||||
"\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{284, "import_from", 0, 8, states_28,
|
||||
"\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{285, "import_as_name", 0, 4, states_29,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{286, "dotted_as_name", 0, 4, states_30,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{287, "import_as_names", 0, 3, states_31,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{288, "dotted_as_names", 0, 2, states_32,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{289, "dotted_name", 0, 2, states_33,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{290, "global_stmt", 0, 3, states_34,
|
||||
"\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{291, "nonlocal_stmt", 0, 3, states_35,
|
||||
"\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{292, "assert_stmt", 0, 5, states_36,
|
||||
"\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{293, "compound_stmt", 0, 2, states_37,
|
||||
"\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004\000"},
|
||||
{294, "if_stmt", 0, 8, states_38,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
|
||||
{295, "while_stmt", 0, 8, states_39,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"},
|
||||
{296, "for_stmt", 0, 10, states_40,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},
|
||||
{297, "try_stmt", 0, 13, states_41,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"},
|
||||
{298, "with_stmt", 0, 5, states_42,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"},
|
||||
{299, "with_item", 0, 4, states_43,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{300, "except_clause", 0, 5, states_44,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
|
||||
{301, "suite", 0, 5, states_45,
|
||||
"\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
|
||||
{302, "test", 0, 6, states_46,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{303, "test_nocond", 0, 2, states_47,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{304, "lambdef", 0, 5, states_48,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
|
||||
{305, "lambdef_nocond", 0, 5, states_49,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
|
||||
{306, "or_test", 0, 2, states_50,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
|
||||
{307, "and_test", 0, 2, states_51,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
|
||||
{308, "not_test", 0, 3, states_52,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
|
||||
{309, "comparison", 0, 2, states_53,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{310, "comp_op", 0, 4, states_54,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000\000"},
|
||||
{311, "star_expr", 0, 3, states_55,
|
||||
"\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{312, "expr", 0, 2, states_56,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{313, "xor_expr", 0, 2, states_57,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{314, "and_expr", 0, 2, states_58,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{315, "shift_expr", 0, 2, states_59,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{316, "arith_expr", 0, 2, states_60,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{317, "term", 0, 2, states_61,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{318, "factor", 0, 3, states_62,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{319, "power", 0, 4, states_63,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},
|
||||
{320, "atom", 0, 9, states_64,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},
|
||||
{321, "testlist_comp", 0, 5, states_65,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{322, "trailer", 0, 7, states_66,
|
||||
"\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000\000"},
|
||||
{323, "subscriptlist", 0, 3, states_67,
|
||||
"\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{324, "subscript", 0, 5, states_68,
|
||||
"\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{325, "sliceop", 0, 3, states_69,
|
||||
"\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{326, "exprlist", 0, 3, states_70,
|
||||
"\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
|
||||
{327, "testlist", 0, 3, states_71,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{328, "dictorsetmaker", 0, 11, states_72,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{329, "classdef", 0, 8, states_73,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"},
|
||||
{330, "arglist", 0, 8, states_74,
|
||||
"\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{331, "argument", 0, 4, states_75,
|
||||
"\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
{332, "comp_iter", 0, 2, states_76,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000\000"},
|
||||
{333, "comp_for", 0, 6, states_77,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},
|
||||
{334, "comp_if", 0, 4, states_78,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
|
||||
{335, "encoding_decl", 0, 2, states_79,
|
||||
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
|
||||
{336, "yield_expr", 0, 3, states_80,
|
||||
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},
|
||||
{337, "yield_arg", 0, 3, states_81,
|
||||
"\000\040\040\000\000\000\000\000\000\202\000\000\000\200\020\000\000\206\120\076\000\000"},
|
||||
};
|
||||
static label labels[169] = {
|
||||
{0, "EMPTY"},
|
||||
{256, 0},
|
||||
{4, 0},
|
||||
|
@ -2135,10 +2152,11 @@ static label labels[168] = {
|
|||
{334, 0},
|
||||
{335, 0},
|
||||
{1, "yield"},
|
||||
{337, 0},
|
||||
};
|
||||
grammar _PyParser_Grammar = {
|
||||
81,
|
||||
82,
|
||||
dfas,
|
||||
{168, labels},
|
||||
{169, labels},
|
||||
256
|
||||
};
|
||||
|
|
|
@ -71,7 +71,7 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_STORE_LOCALS,
|
||||
&&TARGET_PRINT_EXPR,
|
||||
&&TARGET_LOAD_BUILD_CLASS,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_YIELD_FROM,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_INPLACE_LSHIFT,
|
||||
|
|
|
@ -19,10 +19,6 @@
|
|||
|
||||
#define IMPORT_STAR_WARNING "import * only allowed at module level"
|
||||
|
||||
#define RETURN_VAL_IN_GENERATOR \
|
||||
"'return' with argument inside generator"
|
||||
|
||||
|
||||
static PySTEntryObject *
|
||||
ste_new(struct symtable *st, identifier name, _Py_block_ty block,
|
||||
void *key, int lineno, int col_offset)
|
||||
|
@ -1133,14 +1129,6 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
|||
if (s->v.Return.value) {
|
||||
VISIT(st, expr, s->v.Return.value);
|
||||
st->st_cur->ste_returns_value = 1;
|
||||
if (st->st_cur->ste_generator) {
|
||||
PyErr_SetString(PyExc_SyntaxError,
|
||||
RETURN_VAL_IN_GENERATOR);
|
||||
PyErr_SyntaxLocationEx(st->st_filename,
|
||||
s->lineno,
|
||||
s->col_offset);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Delete_kind:
|
||||
|
@ -1345,13 +1333,6 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
|
|||
if (e->v.Yield.value)
|
||||
VISIT(st, expr, e->v.Yield.value);
|
||||
st->st_cur->ste_generator = 1;
|
||||
if (st->st_cur->ste_returns_value) {
|
||||
PyErr_SetString(PyExc_SyntaxError,
|
||||
RETURN_VAL_IN_GENERATOR);
|
||||
PyErr_SyntaxLocationEx(st->st_filename,
|
||||
e->lineno, e->col_offset);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case Compare_kind:
|
||||
VISIT(st, expr, e->v.Compare.left);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue