[Python-checkins] CVS: python/dist/src/Python compile.c,2.196.2.2,2.196.2.3

Anthony Baxter anthonybaxter@users.sourceforge.net
Tue, 20 Nov 2001 22:21:20 -0800


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv24579

Modified Files:
      Tag: release21-maint
	compile.c 
Log Message:
backport of jeremy's 2.227:
Fix for SF bug [ #471928 ] global made w/nested list comprehensions

. Initially I was going to just rip out the bits of this that fixed this
  bug, but the rest of the code looks (after a fair amount of staring at
  it) like it's ok - variable renames, that sort of thing. 
  flames and "hey, no way!" to me, or to python-dev.
  It felt safer to just go with the full patch, rather than butchering
  it.



Index: compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.196.2.2
retrieving revision 2.196.2.3
diff -C2 -d -r2.196.2.2 -r2.196.2.3
*** compile.c	2001/06/27 14:04:03	2.196.2.2
--- compile.c	2001/11/21 06:21:18	2.196.2.3
***************
*** 4824,4828 ****
  symtable_node(struct symtable *st, node *n)
  {
! 	int i, start = 0;
  
   loop:
--- 4824,4828 ----
  symtable_node(struct symtable *st, node *n)
  {
! 	int i;
  
   loop:
***************
*** 4930,4939 ****
  		}
  		goto loop;
! 		/* watchout for fall-through logic below */
  	case argument:
! 		if (NCH(n) == 3) {
  			n = CHILD(n, 2);
  			goto loop;
  		}
  	case listmaker:
  		if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
--- 4930,4965 ----
  		}
  		goto loop;
! 	case list_iter:
! 		n = CHILD(n, 0);
! 		if (TYPE(n) == list_for) {
! 			st->st_tmpname++;
! 			symtable_list_comprehension(st, n);
! 			st->st_tmpname--;
! 		} else {
! 			REQ(n, list_if);
! 			symtable_node(st, CHILD(n, 1));
! 			if (NCH(n) == 3) {
! 				n = CHILD(n, 2); 
! 				goto loop;
! 			}
! 		}
! 		break;
! 	case for_stmt:
! 		symtable_assign(st, CHILD(n, 1), 0);
! 		for (i = 3; i < NCH(n); ++i)
! 			if (TYPE(CHILD(n, i)) >= single_input)
! 				symtable_node(st, CHILD(n, i));
! 		break;
! 	/* The remaining cases fall through to default except in
! 	   special circumstances.  This requires the individual cases
! 	   to be coded with great care, even though they look like
! 	   rather innocuous.  Each case must double-check TYPE(n).
! 	*/
  	case argument:
! 		if (TYPE(n) == argument && NCH(n) == 3) {
  			n = CHILD(n, 2);
  			goto loop;
  		}
+ 		/* fall through */
  	case listmaker:
  		if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
***************
*** 4942,4947 ****
  			symtable_node(st, CHILD(n, 0));
  			st->st_tmpname--;
! 			return;
  		}
  	case atom:
  		if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
--- 4968,4974 ----
  			symtable_node(st, CHILD(n, 0));
  			st->st_tmpname--;
! 			break;
  		}
+ 		/* fall through */
  	case atom:
  		if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
***************
*** 4949,4963 ****
  			break;
  		}
! 	case for_stmt:
! 		if (TYPE(n) == for_stmt) {
! 			symtable_assign(st, CHILD(n, 1), 0);
! 			start = 3;
! 		}
  	default:
  		if (NCH(n) == 1) {
  			n = CHILD(n, 0);
  			goto loop;
  		}
! 		for (i = start; i < NCH(n); ++i)
  			if (TYPE(CHILD(n, i)) >= single_input)
  				symtable_node(st, CHILD(n, i));
--- 4976,4989 ----
  			break;
  		}
! 		/* fall through */
  	default:
+ 		/* Walk over every non-token child with a special case
+ 		   for one child.
+ 		*/
  		if (NCH(n) == 1) {
  			n = CHILD(n, 0);
  			goto loop;
  		}
! 		for (i = 0; i < NCH(n); ++i)
  			if (TYPE(CHILD(n, i)) >= single_input)
  				symtable_node(st, CHILD(n, i));
***************
*** 5190,5195 ****
  }
  
  static void 
! symtable_assign(struct symtable *st, node *n, int flag)
  {
  	node *tmp;
--- 5216,5227 ----
  }
  
+ /* The third argument to symatble_assign() is a flag to be passed to
+    symtable_add_def() if it is eventually called.  The flag is useful
+    to specify the particular type of assignment that should be
+    recorded, e.g. an assignment caused by import.
+  */
+ 
  static void 
! symtable_assign(struct symtable *st, node *n, int def_flag)
  {
  	node *tmp;
***************
*** 5223,5227 ****
  		} else {
  			for (i = 0; i < NCH(n); i += 2)
! 				symtable_assign(st, CHILD(n, i), flag);
  		}
  		return;
--- 5255,5259 ----
  		} else {
  			for (i = 0; i < NCH(n); i += 2)
! 				symtable_assign(st, CHILD(n, i), def_flag);
  		}
  		return;
***************
*** 5235,5239 ****
  			int i;
  			for (i = 0; i < NCH(n); i += 2)
! 				symtable_assign(st, CHILD(n, i), flag);
  			return;
  		}
--- 5267,5271 ----
  			int i;
  			for (i = 0; i < NCH(n); i += 2)
! 				symtable_assign(st, CHILD(n, i), def_flag);
  			return;
  		}
***************
*** 5247,5251 ****
  			if (strcmp(STR(tmp), "__debug__") == 0)
  				symtable_warn(st, ASSIGN_DEBUG);
! 			symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
  		}
  		return;
--- 5279,5283 ----
  			if (strcmp(STR(tmp), "__debug__") == 0)
  				symtable_warn(st, ASSIGN_DEBUG);
! 			symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
  		}
  		return;
***************
*** 5253,5268 ****
  		if (NCH(n) == 3)
  			symtable_add_def(st, STR(CHILD(n, 2)),
! 					 DEF_LOCAL | flag);
  		else
  			symtable_add_def(st,
  					 STR(CHILD(CHILD(n,
  							 0), 0)),
! 					 DEF_LOCAL | flag);
  		return;
  	case dotted_name:
! 		symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
  		return;
  	case NAME:
! 		symtable_add_def(st, STR(n), DEF_LOCAL | flag);
  		return;
  	default:
--- 5285,5300 ----
  		if (NCH(n) == 3)
  			symtable_add_def(st, STR(CHILD(n, 2)),
! 					 DEF_LOCAL | def_flag);
  		else
  			symtable_add_def(st,
  					 STR(CHILD(CHILD(n,
  							 0), 0)),
! 					 DEF_LOCAL | def_flag);
  		return;
  	case dotted_name:
! 		symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
  		return;
  	case NAME:
! 		symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
  		return;
  	default:
***************
*** 5277,5281 ****
  		for (i = 0; i < NCH(n); ++i)
  			if (TYPE(CHILD(n, i)) >= single_input)
! 				symtable_assign(st, CHILD(n, i), flag);
  	}
  }
--- 5309,5313 ----
  		for (i = 0; i < NCH(n); ++i)
  			if (TYPE(CHILD(n, i)) >= single_input)
! 				symtable_assign(st, CHILD(n, i), def_flag);
  	}
  }