Skip to content

Commit 1492bcf

Browse files
iluuu1994TimWolla
authored andcommitted
Clean up closure static variable handling
1 parent 1ce79eb commit 1492bcf

File tree

2 files changed

+4
-14
lines changed

2 files changed

+4
-14
lines changed

Zend/zend_closures.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,6 @@ static void zend_closure_free_storage(zend_object *object) /* {{{ */
528528
/* We don't own the static variables of fake closures. */
529529
if (!(closure->func.op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
530530
zend_destroy_static_vars(&closure->func.op_array);
531-
closure->func.op_array.static_variables = NULL;
532531
}
533532
destroy_op_array(&closure->func.op_array);
534533
} else if (closure->func.type == ZEND_INTERNAL_FUNCTION) {
@@ -760,16 +759,14 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en
760759
}
761760

762761
/* For fake closures, we want to reuse the static variables of the original function. */
762+
HashTable *ht = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr);
763763
if (!is_fake) {
764-
if (closure->func.op_array.static_variables) {
765-
closure->func.op_array.static_variables =
766-
zend_array_dup(closure->func.op_array.static_variables);
764+
if (!ht) {
765+
ht = closure->func.op_array.static_variables;
767766
}
768767
ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr,
769-
closure->func.op_array.static_variables);
768+
ht ? zend_array_dup(ht) : NULL);
770769
} else if (func->op_array.static_variables) {
771-
HashTable *ht = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr);
772-
773770
if (!ht) {
774771
ht = zend_array_dup(func->op_array.static_variables);
775772
ZEND_MAP_PTR_SET(func->op_array.static_variables_ptr, ht);

Zend/zend_opcode.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -636,13 +636,6 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
636636
}
637637
if (op_array->num_dynamic_func_defs) {
638638
for (i = 0; i < op_array->num_dynamic_func_defs; i++) {
639-
/* Closures overwrite static_variables in their copy.
640-
* Make sure to destroy them when the prototype function is destroyed. */
641-
if (op_array->dynamic_func_defs[i]->static_variables
642-
&& (op_array->dynamic_func_defs[i]->fn_flags & ZEND_ACC_CLOSURE)) {
643-
zend_array_destroy(op_array->dynamic_func_defs[i]->static_variables);
644-
op_array->dynamic_func_defs[i]->static_variables = NULL;
645-
}
646639
destroy_op_array(op_array->dynamic_func_defs[i]);
647640
}
648641
efree(op_array->dynamic_func_defs);

0 commit comments

Comments
 (0)