mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Fixed bug #70241 (Skipped assertions affect Generator returns)
This commit is contained in:
parent
af0d6256d5
commit
dbd8edbbd0
1
NEWS
1
NEWS
@ -12,6 +12,7 @@ PHP NEWS
|
||||
. Fixed bug #69487 (SAPI may truncate POST data). (cmb)
|
||||
. Fixed bug #70198 (Checking liveness does not work as expected).
|
||||
(Shafreeck Sea, Anatol Belski)
|
||||
. Fixed bug #70241 (Skipped assertions affect Generator returns). (Bob)
|
||||
|
||||
- CLI server:
|
||||
. Fixed bug #66606 (Sets HTTP_CONTENT_TYPE but not CONTENT_TYPE).
|
||||
|
17
Zend/tests/bug70241.phpt
Normal file
17
Zend/tests/bug70241.phpt
Normal file
@ -0,0 +1,17 @@
|
||||
--TEST--
|
||||
Bug #70241 (Skipped assertions affect Generator returns)
|
||||
--INI--
|
||||
zend.assertions=-1
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function foo () {
|
||||
assert(yield 1);
|
||||
return null;
|
||||
}
|
||||
|
||||
var_dump(foo() instanceof Generator);
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
@ -1128,6 +1128,32 @@ void zend_do_early_binding(void) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_mark_function_as_generator() /* {{{ */
|
||||
{
|
||||
if (!CG(active_op_array)->function_name) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR,
|
||||
"The \"yield\" expression can only be used inside a function");
|
||||
}
|
||||
if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
|
||||
const char *msg = "Generators may only declare a return type of Generator, Iterator or Traversable, %s is not permitted";
|
||||
if (!CG(active_op_array)->arg_info[-1].class_name) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR, msg,
|
||||
zend_get_type_by_const(CG(active_op_array)->arg_info[-1].type_hint));
|
||||
}
|
||||
if (!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Traversable")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Traversable")-1, "Traversable", sizeof("Traversable")-1) == 0) &&
|
||||
!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Iterator")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Iterator")-1, "Iterator", sizeof("Iterator")-1) == 0) &&
|
||||
!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Generator")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Generator")-1, "Generator", sizeof("Generator")-1) == 0)) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR, msg, ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name));
|
||||
}
|
||||
}
|
||||
|
||||
CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array) /* {{{ */
|
||||
{
|
||||
if (op_array->early_binding != (uint32_t)-1) {
|
||||
@ -3041,6 +3067,22 @@ int zend_compile_func_cuf(znode *result, zend_ast_list *args, zend_string *lcnam
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_compile_assert_side_effects(zend_ast *ast) /* {{{ */
|
||||
{
|
||||
int i;
|
||||
int children = zend_ast_is_list(ast) ? zend_ast_get_list(ast)->children : zend_ast_get_num_children(ast);
|
||||
|
||||
for (i = 0; i < children; i++) {
|
||||
zend_ast *child = (zend_ast_is_list(ast) ? zend_ast_get_list(ast)->child : ast->child)[i];
|
||||
if (child->kind == ZEND_AST_YIELD) {
|
||||
zend_mark_function_as_generator();
|
||||
} else if (ast->kind >= ZEND_AST_IS_LIST_SHIFT) {
|
||||
zend_compile_assert_side_effects(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int zend_compile_assert(znode *result, zend_ast_list *args, zend_string *name, zend_function *fbc) /* {{{ */
|
||||
{
|
||||
if (EG(assertions) >= 0) {
|
||||
@ -3081,6 +3123,8 @@ static int zend_compile_assert(znode *result, zend_ast_list *args, zend_string *
|
||||
}
|
||||
result->op_type = IS_CONST;
|
||||
ZVAL_TRUE(&result->u.constant);
|
||||
|
||||
zend_compile_assert_side_effects((zend_ast *) args);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
@ -6186,32 +6230,6 @@ void zend_compile_exit(znode *result, zend_ast *ast) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_mark_function_as_generator() /* {{{ */
|
||||
{
|
||||
if (!CG(active_op_array)->function_name) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR,
|
||||
"The \"yield\" expression can only be used inside a function");
|
||||
}
|
||||
if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
|
||||
const char *msg = "Generators may only declare a return type of Generator, Iterator or Traversable, %s is not permitted";
|
||||
if (!CG(active_op_array)->arg_info[-1].class_name) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR, msg,
|
||||
zend_get_type_by_const(CG(active_op_array)->arg_info[-1].type_hint));
|
||||
}
|
||||
if (!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Traversable")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Traversable")-1, "Traversable", sizeof("Traversable")-1) == 0) &&
|
||||
!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Iterator")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Iterator")-1, "Iterator", sizeof("Iterator")-1) == 0) &&
|
||||
!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Generator")-1
|
||||
&& zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Generator")-1, "Generator", sizeof("Generator")-1) == 0)) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR, msg, ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name));
|
||||
}
|
||||
}
|
||||
|
||||
CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
|
||||
{
|
||||
zend_ast *value_ast = ast->child[0];
|
||||
|
Loading…
Reference in New Issue
Block a user