]> granicus.if.org Git - php/commitdiff
Fixed issue #79 (Optimization Problem/Bug)
authorDmitry Stogov <dmitry@zend.com>
Mon, 1 Apr 2013 07:33:04 +0000 (11:33 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 1 Apr 2013 07:33:04 +0000 (11:33 +0400)
ext/opcache/Optimizer/block_pass.c
ext/opcache/tests/issue0079.phpt [new file with mode: 0644]

index 7fd986ca6de2606ca42ce97c855b21d6063554cb..61a2b59d2f88263050e39c9346888d709530b3b7 100644 (file)
@@ -1312,6 +1312,12 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra
                                        if (ZEND_OP1_TYPE(last_op) == IS_CONST) {
                                                zval_copy_ctor(&ZEND_OP1_LITERAL(last_op));
                                        }
+#else
+                                       if (ZEND_OP1_TYPE(last_op) == IS_CONST) {
+                                               zval zv = ZEND_OP1_LITERAL(last_op);
+                                               zval_copy_ctor(&zv);
+                                               last_op->op1.constant = zend_optimizer_add_literal(op_array, &zv TSRMLS_CC);
+                                       }
 #endif
                                        del_source(block, block->op1_to);
                                        if (block->op1_to->op2_to) {
@@ -1342,6 +1348,12 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra
                                        if (ZEND_OP1_TYPE(last_op) == IS_CONST) {
                                                zval_copy_ctor(&ZEND_OP1_LITERAL(last_op));
                                        }
+#else
+                                       if (ZEND_OP1_TYPE(last_op) == IS_CONST) {
+                                               zval zv = ZEND_OP1_LITERAL(last_op);
+                                               zval_copy_ctor(&zv);
+                                               last_op->op1.constant = zend_optimizer_add_literal(op_array, &zv TSRMLS_CC);
+                                       }
 #endif
                                        del_source(block, block->op1_to);
                                        block->op1_to = NULL;
diff --git a/ext/opcache/tests/issue0079.phpt b/ext/opcache/tests/issue0079.phpt
new file mode 100644 (file)
index 0000000..4458fce
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--
+ISSUE #79 (Optimization Problem/Bug)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class Test {
+    public function run() {
+        $r = $this->my_parse_m();
+        var_dump ($r);
+        return $r;
+    }
+
+    public function my_parse_m() {
+        $test = true;
+        if ($test === true) {
+            $a = 'b';
+        } else {
+            return false;
+        }
+//      flush();
+        return true;
+    }
+}
+
+$t = new Test();
+var_dump ($t->run());
+--EXPECT--
+bool(true)
+bool(true)