]> granicus.if.org Git - python/commitdiff
Simplify chains of conditional jumps.
authorRaymond Hettinger <python@rcn.com>
Wed, 25 Aug 2004 03:18:29 +0000 (03:18 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 25 Aug 2004 03:18:29 +0000 (03:18 +0000)
(Suggested by Neal Norwitz.)

Python/compile.c

index 85182de9d7b902f4d19703a668beac47f01fbb77..fe31e6f105ef0b03c1859f1a084a776fa9a19d1e 100644 (file)
@@ -550,11 +550,34 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
                        }
                        break;
 
+               /* Simplify conditional jump to conditional jump where the
+                  result of the first test implies the success of a similar
+                  test or the failure of the opposite test.
+                  Arises in code like:
+                       "a and b or c"
+                       "a and b and c"
+                  x:JUMP_IF_FALSE y   y:JUMP_IF_FALSE z  -->  x:JUMP_IF_FALSE z
+                  x:JUMP_IF_FALSE y   y:JUMP_IF_FALSE z  -->  x:JUMP_IF_FALSE y+3 
+               */
+               case JUMP_IF_FALSE:
+               case JUMP_IF_TRUE:
+                       tgt = GETJUMPTGT(codestr, i);
+                       j = codestr[tgt];
+                       if (j == JUMP_IF_FALSE  ||  j == JUMP_IF_TRUE) {
+                               if (j == opcode) {
+                                       tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
+                                       SETARG(codestr, i, tgttgt);
+                               } else {
+                                       tgt -= i;
+                                       SETARG(codestr, i, tgt);
+                               }
+                               break;
+                       }
+                       /* Intentional fallthrough */  
+
                /* Replace jumps to unconditional jumps */
                case FOR_ITER:
                case JUMP_FORWARD:
-               case JUMP_IF_FALSE:
-               case JUMP_IF_TRUE:
                case JUMP_ABSOLUTE:
                case CONTINUE_LOOP:
                case SETUP_LOOP: