[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