From: Xinchen Hui Date: Wed, 21 Dec 2016 06:24:14 +0000 (+0800) Subject: Revert "Reorder the oplines" (Break Zend/tests/return_types/bug71092.phpt) X-Git-Tag: php-7.1.1RC1~66 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=82988d3e419c4537e6e5db30c4ea511c4abf29f6;p=php Revert "Reorder the oplines" (Break Zend/tests/return_types/bug71092.phpt) This reverts commit a12f43ee2c3d27a7eb9a3c873901643df5f7197e. --- diff --git a/Zend/tests/return_types/029.phpt b/Zend/tests/return_types/029.phpt index af13e6a699..adc07cde7f 100644 --- a/Zend/tests/return_types/029.phpt +++ b/Zend/tests/return_types/029.phpt @@ -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 diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 71599e0e08..c8f2eefa7d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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); diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 5c6b690c0c..fa86b99b69 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -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: