mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fix #81076 Invalid implicit binds cause incorrect count in static vars of closure debug info
This commit is contained in:
parent
cfd4d3df0b
commit
213063f6ca
3 changed files with 35 additions and 7 deletions
4
NEWS
4
NEWS
|
@ -2,6 +2,10 @@ PHP NEWS
|
||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||
?? ??? 2021, PHP 8.0.8
|
?? ??? 2021, PHP 8.0.8
|
||||||
|
|
||||||
|
- Core:
|
||||||
|
. Fixed bug #81076 (incorrect debug info on Closures with implicit binds).
|
||||||
|
(krakjoe)
|
||||||
|
|
||||||
- Opcache:
|
- Opcache:
|
||||||
. Fixed bug #80968 (JIT segfault with return from required file). (Dmitry)
|
. Fixed bug #80968 (JIT segfault with return from required file). (Dmitry)
|
||||||
|
|
||||||
|
|
9
Zend/tests/bug81076.phpt
Normal file
9
Zend/tests/bug81076.phpt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #81076 Invalid implicit binds cause incorrect static var count in closure debug info
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
var_dump(fn() => [$why, $do, $we, $count]);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
object(Closure)#1 (0) {
|
||||||
|
}
|
|
@ -550,16 +550,31 @@ static HashTable *zend_closure_get_debug_info(zend_object *object, int *is_temp)
|
||||||
|
|
||||||
if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
|
if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
|
||||||
zval *var;
|
zval *var;
|
||||||
HashTable *static_variables =
|
zend_string *key;
|
||||||
ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
|
HashTable *static_variables = ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
|
||||||
ZVAL_ARR(&val, zend_array_dup(static_variables));
|
|
||||||
zend_hash_update(debug_info, ZSTR_KNOWN(ZEND_STR_STATIC), &val);
|
array_init(&val);
|
||||||
ZEND_HASH_FOREACH_VAL(Z_ARRVAL(val), var) {
|
|
||||||
|
ZEND_HASH_FOREACH_STR_KEY_VAL(static_variables, key, var) {
|
||||||
|
zval copy;
|
||||||
|
|
||||||
if (Z_TYPE_P(var) == IS_CONSTANT_AST) {
|
if (Z_TYPE_P(var) == IS_CONSTANT_AST) {
|
||||||
zval_ptr_dtor(var);
|
ZVAL_STRING(©, "<constant ast>");
|
||||||
ZVAL_STRING(var, "<constant ast>");
|
} else {
|
||||||
|
if (Z_ISREF_P(var) && Z_REFCOUNT_P(var) == 1) {
|
||||||
|
var = Z_REFVAL_P(var);
|
||||||
|
}
|
||||||
|
ZVAL_COPY(©, var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zend_hash_add_new(Z_ARRVAL(val), key, ©);
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
|
||||||
|
if (zend_hash_num_elements(Z_ARRVAL(val))) {
|
||||||
|
zend_hash_update(debug_info, ZSTR_KNOWN(ZEND_STR_STATIC), &val);
|
||||||
|
} else {
|
||||||
|
zval_ptr_dtor(&val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
|
if (Z_TYPE(closure->this_ptr) != IS_UNDEF) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue