[Python-checkins] python/dist/src/Python newcompile.c, 1.1.2.60, 1.1.2.61 ast.c, 1.1.2.39, 1.1.2.40

nnorwitz at users.sourceforge.net nnorwitz at users.sourceforge.net
Wed Dec 31 15:26:39 EST 2003


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);





More information about the Python-checkins mailing list