Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 36666:6165927431d6 legacy-trunk
PEP 308 implementation, including minor refdocs and some testcases. It
breaks the parser module, because it adds the if/else construct as well as
two new grammar rules for backward compatibility. If no one else fixes
parsermodule, I guess I'll go ahead and fix it later this week.
The TeX code was checked with texcheck.py, but not rendered. There is
actually a slight incompatibility:
>>> (x for x in lambda:0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: iteration over non-sequence
changes into
>>> (x for x in lambda: 0)
File "<stdin>", line 1
(x for x in lambda: 0)
^
SyntaxError: invalid syntax
Since there's no way the former version can be useful, it's probably a
bugfix ;)
| author | Thomas Wouters <thomas@python.org> |
|---|---|
| date | Mon, 27 Feb 2006 00:24:13 +0000 |
| parents | 7fdc639bc5b4 |
| children | b6d2f6fd3e11 |
line wrap: on
line diff
--- a/Python/compile.c Mon Feb 27 00:09:50 2006 +0000 +++ b/Python/compile.c Mon Feb 27 00:24:13 2006 +0000 @@ -2010,6 +2010,30 @@ } static int +compiler_ifexp(struct compiler *c, expr_ty e) +{ + basicblock *end, *next; + + assert(e->kind == IfExp_kind); + end = compiler_new_block(c); + if (end == NULL) + return 0; + next = compiler_new_block(c); + if (next == NULL) + return 0; + VISIT(c, expr, e->v.IfExp.test); + ADDOP_JREL(c, JUMP_IF_FALSE, next); + ADDOP(c, POP_TOP); + VISIT(c, expr, e->v.IfExp.body); + ADDOP_JREL(c, JUMP_FORWARD, end); + compiler_use_next_block(c, next); + ADDOP(c, POP_TOP); + VISIT(c, expr, e->v.IfExp.orelse); + compiler_use_next_block(c, end); + return 1; +} + +static int compiler_lambda(struct compiler *c, expr_ty e) { PyCodeObject *co; @@ -3290,6 +3314,8 @@ break; case Lambda_kind: return compiler_lambda(c, e); + case IfExp_kind: + return compiler_ifexp(c, e); case Dict_kind: /* XXX get rid of arg? */ ADDOP_I(c, BUILD_MAP, 0);
