[Python-checkins] python/dist/src/Python newcompile.c, 1.1.2.95, 1.1.2.96

jhylton at users.sourceforge.net jhylton at users.sourceforge.net
Fri Apr 23 10:53:29 EDT 2004


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25028

Modified Files:
      Tag: ast-branch
	newcompile.c 
Log Message:
Don't generate test-and-jump code for loops with constant tests.
For false constants, don't generate any code at all.


Index: newcompile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.c,v
retrieving revision 1.1.2.95
retrieving revision 1.1.2.96
diff -C2 -d -r1.1.2.95 -r1.1.2.96
*** newcompile.c	23 Apr 2004 04:12:28 -0000	1.1.2.95
--- newcompile.c	23 Apr 2004 14:53:24 -0000	1.1.2.96
***************
*** 185,188 ****
--- 185,189 ----
  
  static int inplace_binop(struct compiler *, operator_ty);
+ static int expr_constant(expr_ty e);
  
  static PyCodeObject *assemble(struct compiler *, int addNone);
***************
*** 1454,1461 ****
  {
  	int loop, orelse, end, anchor;
  	loop = compiler_new_block(c);
  	end = compiler_new_block(c);
! 	anchor = compiler_new_block(c);
! 	if (loop < 0 || end < 0 || anchor < 0)
  		return 0;
  	if (s->v.While.orelse) {
--- 1455,1470 ----
  {
  	int loop, orelse, end, anchor;
+ 	int constant = expr_constant(s->v.While.test);
+ 
+ 	if (constant == 0)
+ 		return 1;
  	loop = compiler_new_block(c);
  	end = compiler_new_block(c);
! 	if (constant == -1) {
! 		anchor = compiler_new_block(c);
! 		if (anchor < 0)
! 			return 0;
! 	}
! 	if (loop < 0 || end < 0)
  		return 0;
  	if (s->v.While.orelse) {
***************
*** 1471,1477 ****
  	if (!compiler_push_fblock(c, LOOP, loop))
  		return 0;
! 	VISIT(c, expr, s->v.While.test);
! 	ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
! 	ADDOP(c, POP_TOP);
  	VISIT_SEQ(c, stmt, s->v.While.body);
  	ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
--- 1480,1488 ----
  	if (!compiler_push_fblock(c, LOOP, loop))
  		return 0;
! 	if (constant == -1) {
! 		VISIT(c, expr, s->v.While.test);
! 		ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
! 		ADDOP(c, POP_TOP);
! 	}
  	VISIT_SEQ(c, stmt, s->v.While.body);
  	ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
***************
*** 1481,1487 ****
  	*/
  
! 	compiler_use_next_block(c, anchor);
! 	ADDOP(c, POP_TOP);
! 	ADDOP(c, POP_BLOCK);
  	compiler_pop_fblock(c, LOOP, loop);
  	if (orelse != -1)
--- 1492,1500 ----
  	*/
  
! 	if (constant == -1) {
! 		compiler_use_next_block(c, anchor);
! 		ADDOP(c, POP_TOP);
! 		ADDOP(c, POP_BLOCK);
! 	}
  	compiler_pop_fblock(c, LOOP, loop);
  	if (orelse != -1)
***************
*** 2367,2370 ****
--- 2380,2402 ----
  }
  
+ /* Test whether expression is constant.  For constants, report
+    whether they are true or false.
+ 
+    Return values: 1 for true, 0 for false, -1 for non-constant.
+  */
+ 
+ static int
+ expr_constant(expr_ty e)
+ {
+ 	switch (e->kind) {
+ 	case Num_kind:
+ 		return PyObject_IsTrue(e->v.Num.n);
+ 	case Str_kind:
+ 		return PyObject_IsTrue(e->v.Str.s);
+ 	default:
+ 		return -1;
+ 	}
+ }
+ 
  static int
  compiler_visit_expr(struct compiler *c, expr_ty e)




More information about the Python-checkins mailing list