Merge branch 'PHP-7.1'

* PHP-7.1:
  Reorder the oplines
This commit is contained in:
Xinchen Hui 2016-12-17 20:09:49 +08:00
commit adf0256c4a
3 changed files with 7 additions and 17 deletions

View File

@ -16,13 +16,8 @@ function foo() : array {
foo();
?>
--EXPECTF--
Fatal error: Uncaught Exception: xxxx in %s:%d
Fatal error: Uncaught TypeError: Return value of foo() must be of the type array, null returned in %s029.php:%d
Stack trace:
#0 %s(%d): foo()
#0 %s: foo()
#1 {main}
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
thrown in %s on line %d

View File

@ -4198,14 +4198,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);

View File

@ -506,6 +506,7 @@ 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))
@ -514,13 +515,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
return 0;
}
MAKE_NOP(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);
++opline;
break;
}
default: