--- /dev/null
+--TEST--
+Bug #79818: BIND_STATIC frees old variable value too early
+--FILE--
+<?php
+function test($a) {
+ static $a = UNDEFINED;
+}
+test(new stdClass);
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Undefined constant 'UNDEFINED' in %s:%d
+Stack trace:
+#0 %s(%d): test(Object(stdClass))
+#1 {main}
+ thrown in %s on line %d
zval *variable_ptr;
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- i_zval_ptr_dtor(variable_ptr);
ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
if (!ht) {
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
SAVE_OPLINE();
if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
- ZVAL_NULL(variable_ptr);
HANDLE_EXCEPTION();
}
}
+
+ i_zval_ptr_dtor(variable_ptr);
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
GC_SET_REFCOUNT(ref, 2);
ZVAL_REF(variable_ptr, Z_REF_P(value));
}
} else {
+ i_zval_ptr_dtor(variable_ptr);
ZVAL_COPY(variable_ptr, value);
}
zval *variable_ptr;
variable_ptr = EX_VAR(opline->op1.var);
- i_zval_ptr_dtor(variable_ptr);
ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
if (!ht) {
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
SAVE_OPLINE();
if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
- ZVAL_NULL(variable_ptr);
HANDLE_EXCEPTION();
}
}
+
+ i_zval_ptr_dtor(variable_ptr);
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
GC_SET_REFCOUNT(ref, 2);
ZVAL_REF(variable_ptr, Z_REF_P(value));
}
} else {
+ i_zval_ptr_dtor(variable_ptr);
ZVAL_COPY(variable_ptr, value);
}