Skip to content

Commit

Permalink
Reorder the oplines
Browse files Browse the repository at this point in the history
1. we should only do the return type checking when it is really about to
return
2. for 029.php, actually, the exception threw should be discard while it
jmp into finally(it could be observed by change the return to return an array)
3. after this fix, the test 029.phpt behavior consistently with 7.0
4. good for optimizer too
  • Loading branch information
laruence committed Dec 17, 2016
1 parent 8ba7878 commit a12f43e
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 17 deletions.
11 changes: 3 additions & 8 deletions Zend/tests/return_types/029.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions Zend/zend_compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
9 changes: 2 additions & 7 deletions ext/opcache/Optimizer/zend_optimizer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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:
Expand Down

0 comments on commit a12f43e

Please sign in to comment.