]> granicus.if.org Git - php/commitdiff
Revert "Reorder the oplines" (Break Zend/tests/return_types/bug71092.phpt)
authorXinchen Hui <laruence@gmail.com>
Wed, 21 Dec 2016 06:24:14 +0000 (14:24 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 21 Dec 2016 06:24:14 +0000 (14:24 +0800)
This reverts commit a12f43ee2c3d27a7eb9a3c873901643df5f7197e.

Zend/tests/return_types/029.phpt
Zend/zend_compile.c
ext/opcache/Optimizer/zend_optimizer.c

index af13e6a69918c535828101e7eddf50482deed852..adc07cde7f4dd64a57b37b7dcdfd0c705cf94e0f 100644 (file)
@@ -16,8 +16,13 @@ function foo() : array {
 foo();
 ?>
 --EXPECTF--
-Fatal error: Uncaught TypeError: Return value of foo() must be of the type array, null returned in %s029.php:%d
+Fatal error: Uncaught Exception: xxxx in %s:%d
 Stack trace:
-#0 %s: foo()
+#0 %s(%d): foo()
 #1 {main}
-  thrown in %s on line %d
+
+Next TypeError: Return value of foo() must be of the type array, null returned in %s29.php:%d
+Stack trace:
+#0 %s(%d): foo()
+#1 {main}
+  thrown in %s029.php on line %d
index 71599e0e089c587278bfcb465a5138987547852a..c8f2eefa7d2eca008b1bea579d257817494cdc8f 100644 (file)
@@ -4209,14 +4209,14 @@ void zend_compile_return(zend_ast *ast) /* {{{ */
                }
        }
 
-       zend_handle_loops_and_finally((expr_node.op_type & (IS_TMP_VAR | IS_VAR)) ? &expr_node : NULL);
-
        /* Generator return types are handled separately */
        if (!is_generator && CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
                zend_emit_return_type_check(
                        expr_ast ? &expr_node : NULL, CG(active_op_array)->arg_info - 1, 0);
        }
 
+       zend_handle_loops_and_finally((expr_node.op_type & (IS_TMP_VAR | IS_VAR)) ? &expr_node : NULL);
+
        opline = zend_emit_op(NULL, by_ref ? ZEND_RETURN_BY_REF : ZEND_RETURN,
                &expr_node, NULL);
 
index 5c6b690c0c2c0eb95cfe7c092aec7630defb9645..fa86b99b690a78eed901cbef14ac4e5ba9bf0b5f 100644 (file)
@@ -506,7 +506,6 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                }
                                case ZEND_VERIFY_RETURN_TYPE: {
                                        zend_arg_info *ret_info = op_array->arg_info - 1;
-                                       ZEND_ASSERT((opline + 1)->opcode == ZEND_RETURN || (opline + 1)->opcode == ZEND_RETURN_BY_REF);
                                        if (ret_info->class_name
                                                || ret_info->type_hint == IS_CALLABLE
                                                || !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(val))
@@ -515,7 +514,13 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                                return 0;
                                        }
                                        MAKE_NOP(opline);
-                                       ++opline;
+
+                                       /* zend_handle_loops_and_finally may inserts other oplines */
+                                       do {
+                                               ++opline;
+                                       } while (opline->opcode != ZEND_RETURN && opline->opcode != ZEND_RETURN_BY_REF);
+                                       ZEND_ASSERT(ZEND_OP1(opline).var == var);
+
                                        break;
                                  }
                                default: