mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
PEP 342 implementation. Per Guido's comments, the generator throw()
method still needs to support string exceptions, and allow None for the third argument. Documentation updates are needed, too.
This commit is contained in:
parent
d794666048
commit
0d6615fd29
16 changed files with 862 additions and 242 deletions
|
|
@ -859,7 +859,8 @@ VALIDATER(arglist); VALIDATER(argument);
|
|||
VALIDATER(listmaker); VALIDATER(yield_stmt);
|
||||
VALIDATER(testlist1); VALIDATER(gen_for);
|
||||
VALIDATER(gen_iter); VALIDATER(gen_if);
|
||||
VALIDATER(testlist_gexp);
|
||||
VALIDATER(testlist_gexp); VALIDATER(yield_expr);
|
||||
VALIDATER(yield_or_testlist);
|
||||
|
||||
#undef VALIDATER
|
||||
|
||||
|
|
@ -1506,6 +1507,15 @@ validate_compound_stmt(node *tree)
|
|||
}
|
||||
|
||||
|
||||
static int
|
||||
validate_yield_or_testlist(node *tree)
|
||||
{
|
||||
if (TYPE(tree) == yield_expr)
|
||||
return validate_yield_expr(tree);
|
||||
else
|
||||
return validate_testlist(tree);
|
||||
}
|
||||
|
||||
static int
|
||||
validate_expr_stmt(node *tree)
|
||||
{
|
||||
|
|
@ -1517,8 +1527,8 @@ validate_expr_stmt(node *tree)
|
|||
|
||||
if (res && nch == 3
|
||||
&& TYPE(CHILD(tree, 1)) == augassign) {
|
||||
res = (validate_numnodes(CHILD(tree, 1), 1, "augassign")
|
||||
&& validate_testlist(CHILD(tree, 2)));
|
||||
res = validate_numnodes(CHILD(tree, 1), 1, "augassign")
|
||||
&& validate_yield_or_testlist(CHILD(tree, 2));
|
||||
|
||||
if (res) {
|
||||
char *s = STR(CHILD(CHILD(tree, 1), 0));
|
||||
|
|
@ -1541,8 +1551,8 @@ validate_expr_stmt(node *tree)
|
|||
}
|
||||
else {
|
||||
for (j = 1; res && (j < nch); j += 2)
|
||||
res = (validate_equal(CHILD(tree, j))
|
||||
&& validate_testlist(CHILD(tree, j + 1)));
|
||||
res = validate_equal(CHILD(tree, j))
|
||||
&& validate_yield_or_testlist(CHILD(tree, j + 1));
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
|
|
@ -1649,15 +1659,31 @@ validate_raise_stmt(node *tree)
|
|||
}
|
||||
|
||||
|
||||
/* yield_stmt: 'yield' testlist
|
||||
/* yield_expr: 'yield' [testlist]
|
||||
*/
|
||||
static int
|
||||
validate_yield_expr(node *tree)
|
||||
{
|
||||
int nch = NCH(tree);
|
||||
int res = (validate_ntype(tree, yield_expr)
|
||||
&& ((nch == 1) || (nch == 2))
|
||||
&& validate_name(CHILD(tree, 0), "yield"));
|
||||
|
||||
if (res && (nch == 2))
|
||||
res = validate_testlist(CHILD(tree, 1));
|
||||
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/* yield_stmt: yield_expr
|
||||
*/
|
||||
static int
|
||||
validate_yield_stmt(node *tree)
|
||||
{
|
||||
return (validate_ntype(tree, yield_stmt)
|
||||
&& validate_numnodes(tree, 2, "yield_stmt")
|
||||
&& validate_name(CHILD(tree, 0), "yield")
|
||||
&& validate_testlist(CHILD(tree, 1)));
|
||||
&& validate_numnodes(tree, 1, "yield_stmt")
|
||||
&& validate_yield_expr(CHILD(tree, 0)));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2300,8 +2326,12 @@ validate_atom(node *tree)
|
|||
res = ((nch <= 3)
|
||||
&& (validate_rparen(CHILD(tree, nch - 1))));
|
||||
|
||||
if (res && (nch == 3))
|
||||
res = validate_testlist_gexp(CHILD(tree, 1));
|
||||
if (res && (nch == 3)) {
|
||||
if (TYPE(CHILD(tree, 1))==yield_expr)
|
||||
res = validate_yield_expr(CHILD(tree, 1));
|
||||
else
|
||||
res = validate_testlist_gexp(CHILD(tree, 1));
|
||||
}
|
||||
break;
|
||||
case LSQB:
|
||||
if (nch == 2)
|
||||
|
|
@ -2914,6 +2944,9 @@ validate_node(node *tree)
|
|||
case testlist:
|
||||
res = validate_testlist(tree);
|
||||
break;
|
||||
case yield_expr:
|
||||
res = validate_yield_expr(tree);
|
||||
break;
|
||||
case testlist1:
|
||||
res = validate_testlist1(tree);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue