python/dist/src/Python newcompile.c, 1.1.2.60, 1.1.2.61 ast.c, 1.1.2.39, 1.1.2.40

Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv26003/Python Modified Files: Tag: ast-branch newcompile.c ast.c Log Message: get nested list comps and list comps with ifs to work Index: newcompile.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.c,v retrieving revision 1.1.2.60 retrieving revision 1.1.2.61 diff -C2 -d -r1.1.2.60 -r1.1.2.61 *** newcompile.c 29 Dec 2003 22:10:41 -0000 1.1.2.60 --- newcompile.c 31 Dec 2003 20:26:36 -0000 1.1.2.61 *************** *** 26,33 **** 4: ! typing Ctrl-C seg faults 5: ! line numbers are off */ --- 26,37 ---- 4: ! line numbers are off a bit (may just need to add calls to set lineno 5: ! Modules/parsermodule.c:496: warning: implicit declaration ! of function `PyParser_SimpleParseString' ! ! 6: ! while loops with try/except in them don't work */ *************** *** 935,938 **** --- 939,946 ---- if there is no else clause ? */ + + /* sometimes this needs to be compiler_use_next_block + (e.g., nested loops), but if the code is + while XXX: try: ... this is correct */ compiler_use_block(c, anchor); ADDOP(c, POP_TOP); *************** *** 1228,1233 **** int i, n; ! fprintf(stderr, "compile stmt %d lineno %d\n", ! s->kind, s->lineno); c->u->u_lineno = s->lineno; c->u->u_lineno_set = false; --- 1236,1240 ---- int i, n; ! fprintf(stderr, "compile stmt %d lineno %d\n", s->kind, s->lineno); c->u->u_lineno = s->lineno; c->u->u_lineno_set = false; *************** *** 1677,1691 **** static int ! compiler_listcomp_generator(struct compiler *c, listcomp_ty l, expr_ty elt) { /* generate code for the iterator, then each of the ifs, and then write to the element */ ! int start, anchor, skip, i, n; start = compiler_new_block(c); skip = compiler_new_block(c); anchor = compiler_new_block(c); VISIT(c, expr, l->iter); ADDOP(c, GET_ITER); --- 1684,1703 ---- static int ! compiler_listcomp_generator(struct compiler *c, ! asdl_seq *generators, int gen_index, ! expr_ty elt) { /* generate code for the iterator, then each of the ifs, and then write to the element */ ! listcomp_ty l; ! int start, anchor, skip, if_cleanup, i, n; start = compiler_new_block(c); skip = compiler_new_block(c); + if_cleanup = compiler_new_block(c); anchor = compiler_new_block(c); + l = asdl_seq_GET(generators, gen_index); VISIT(c, expr, l->iter); ADDOP(c, GET_ITER); *************** *** 1694,1718 **** NEXT_BLOCK(c); VISIT(c, expr, l->target); ! n = asdl_seq_LEN(l->ifs); for (i = 0; i < n; i++) { expr_ty e = asdl_seq_GET(l->ifs, i); VISIT(c, expr, e); ! /* XXX not anchor? */ ! ADDOP_JREL(c, JUMP_IF_FALSE, skip); NEXT_BLOCK(c); ! ADDOP(c, DUP_TOP); } ! if (!compiler_nameop(c, c->u->u_tmp, Load)) return 0; ! VISIT(c, expr, elt); ! ADDOP_I(c, CALL_FUNCTION, 1); ! ADDOP(c, POP_TOP); ! compiler_use_next_block(c, skip); ADDOP_JABS(c, JUMP_ABSOLUTE, start); compiler_use_next_block(c, anchor); ! if (!compiler_nameop(c, c->u->u_tmp, Del)) return 0; --- 1706,1745 ---- NEXT_BLOCK(c); VISIT(c, expr, l->target); ! ! /* XXX this needs to be cleaned up...a lot! */ n = asdl_seq_LEN(l->ifs); for (i = 0; i < n; i++) { expr_ty e = asdl_seq_GET(l->ifs, i); VISIT(c, expr, e); ! ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup); NEXT_BLOCK(c); ! ADDOP(c, POP_TOP); } ! if (++gen_index < asdl_seq_LEN(generators)) ! if (!compiler_listcomp_generator(c, generators, gen_index, elt)) ! return 0; ! ! /* only append after the last for generator */ ! if (gen_index >= asdl_seq_LEN(generators)) { ! if (!compiler_nameop(c, c->u->u_tmp, Load)) return 0; ! VISIT(c, expr, elt); ! ADDOP_I(c, CALL_FUNCTION, 1); ! ADDOP(c, POP_TOP); ! compiler_use_next_block(c, skip); ! } ! for (i = 0; i < n; i++) { ! ADDOP_I(c, JUMP_FORWARD, 1); ! if (i == 0) ! compiler_use_next_block(c, if_cleanup); ! ADDOP(c, POP_TOP); ! } ADDOP_JABS(c, JUMP_ABSOLUTE, start); compiler_use_next_block(c, anchor); ! /* delete the append method added to locals */ ! if (gen_index == 1) ! if (!compiler_nameop(c, c->u->u_tmp, Del)) return 0; *************** *** 1723,1727 **** compiler_listcomp(struct compiler *c, expr_ty e) { - int i; char tmpname[256]; identifier tmp; --- 1750,1753 ---- *************** *** 1746,1755 **** return 0; c->u->u_tmp = tmp; ! for (i = 0; i < asdl_seq_LEN(generators); i++) { ! if (!compiler_listcomp_generator(c, ! asdl_seq_GET(generators, i), ! e->v.ListComp.elt)) ! return 0; ! } c->u->u_tmp = NULL; return 1; --- 1772,1777 ---- return 0; c->u->u_tmp = tmp; ! if (!compiler_listcomp_generator(c, generators, 0, e->v.ListComp.elt)) ! return 0; c->u->u_tmp = NULL; return 1; *************** *** 2476,2480 **** struct basicblock *b = c->u->u_blocks[a.a_postorder[i]]; fprintf(stderr, ! "\nblock %d: order=%d used=%d alloc=%d next=%d\n", i, a.a_postorder[i], b->b_iused, b->b_ialloc, b->b_next); --- 2498,2502 ---- struct basicblock *b = c->u->u_blocks[a.a_postorder[i]]; fprintf(stderr, ! "\nblock %d: order=%d used=%d alloc=%d next=%d\n", i, a.a_postorder[i], b->b_iused, b->b_ialloc, b->b_next); Index: ast.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/Attic/ast.c,v retrieving revision 1.1.2.39 retrieving revision 1.1.2.40 diff -C2 -d -r1.1.2.39 -r1.1.2.40 *** ast.c 29 Dec 2003 22:11:32 -0000 1.1.2.39 --- ast.c 31 Dec 2003 20:26:36 -0000 1.1.2.40 *************** *** 287,290 **** --- 287,297 ---- /* XXX It's not clear why were't getting into this code, although list comps seem like one possibility. + + This occurs in at least 2 cases: + [x(i) for i in range(3)] # Call_kind (8) + [i*2 for i in range(3)] # BinOp_kind (2) + + The byte code generated seems to work fine. + Maybe there's a problem with nested list comps? */ fprintf(stderr, "can't set context for %d\n", e->kind); *************** *** 713,724 **** REQ(ch, list_if); ! asdl_seq_APPEND(ifs, CHILD(ch, 1)); if (NCH(ch) == 3) ch = CHILD(ch, 2); } - /* XXX ifs is leaked, we surely have to do something with it */ /* on exit, must guarantee that ch is a list_for */ if (TYPE(ch) == list_iter) ch = CHILD(ch, 0); } asdl_seq_APPEND(listcomps, c); --- 720,731 ---- REQ(ch, list_if); ! asdl_seq_APPEND(ifs, ast_for_expr(CHILD(ch, 1))); if (NCH(ch) == 3) ch = CHILD(ch, 2); } /* on exit, must guarantee that ch is a list_for */ if (TYPE(ch) == list_iter) ch = CHILD(ch, 0); + c->ifs = ifs; } asdl_seq_APPEND(listcomps, c);
participants (1)
-
nnorwitz@users.sourceforge.net