static void function_add_ref(zend_function *function)
{
if (function->type == ZEND_USER_FUNCTION) {
- (*((zend_op_array *) function)->refcount)++;
+ zend_op_array *op_array = &function->op_array;
+
+ (*op_array->refcount)++;
+ if (op_array->static_variables) {
+ HashTable *static_variables = op_array->static_variables;
+ zval *tmp_zval;
+
+ op_array->static_variables = (HashTable *) emalloc(sizeof(HashTable));
+ zend_hash_init(op_array->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0);
+ zend_hash_copy(op_array->static_variables, static_variables, (void (*)(void *)) zval_add_ref, (void *) &tmp_zval, sizeof(zval *));
+ }
}
}
zend_op *opline = op_array->opcodes;
zend_op *end = op_array->opcodes+op_array->last;
+ if (op_array->static_variables) {
+ zend_hash_destroy(op_array->static_variables);
+ efree(op_array->static_variables);
+ }
+
if (--(*op_array->refcount)>0) {
return;
}
if (op_array->brk_cont_array) {
efree(op_array->brk_cont_array);
}
- if (op_array->static_variables) {
- zend_hash_destroy(op_array->static_variables);
- efree(op_array->static_variables);
- }
zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_dtor_handler, op_array);
}