if (variable_ptr == EG(error_zval_ptr) || value_ptr==EG(error_zval_ptr)) {
variable_ptr_ptr = &EG(uninitialized_zval_ptr);
/* } else if (variable_ptr==&EG(uninitialized_zval) || variable_ptr!=value_ptr) { */
- } else if (variable_ptr_ptr != value_ptr_ptr) {
+ } else if (variable_ptr != value_ptr) {
variable_ptr->refcount--;
if (variable_ptr->refcount==0) {
zendi_zval_dtor(*variable_ptr);
*variable_ptr_ptr = value_ptr;
value_ptr->refcount++;
} else {
- if (variable_ptr->refcount>1) { /* we need to break away */
- SEPARATE_ZVAL(variable_ptr_ptr);
+ if (variable_ptr==EG(uninitialized_zval_ptr)
+ || variable_ptr->refcount>2) {
+ /* we need to separate */
+ variable_ptr->refcount -= 2;
+ ALLOC_ZVAL(*variable_ptr_ptr);
+ **variable_ptr_ptr = *variable_ptr;
+ zval_copy_ctor(*variable_ptr_ptr);
+ *value_ptr_ptr = *variable_ptr_ptr;
+ (*variable_ptr_ptr)->refcount = 2;
}
(*variable_ptr_ptr)->is_ref = 1;
}
EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
+ current_this = EG(This);
+ EG(This) = EX(object);
+ current_scope = EG(scope);
+ EG(scope) = EX(calling_scope);
+
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
INIT_ZVAL(*(EX_T(EX(opline)->result.u.var).var.ptr));
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
HashTable *calling_symbol_table;
- current_this = EG(This);
- EG(This) = EX(object);
- current_scope = EG(scope);
- EG(scope) = EX(calling_scope);
-
EX_T(EX(opline)->result.u.var).var.ptr = NULL;
if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
/*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
zend_hash_clean(*EG(symtable_cache_ptr));
}
EG(active_symbol_table) = calling_symbol_table;
- if (EG(This)) {
- zval_ptr_dtor(&EG(This));
- }
- EG(This) = current_this;
- EG(scope) = current_scope;
} else { /* ZEND_OVERLOADED_FUNCTION */
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
INIT_ZVAL(*(EX_T(EX(opline)->result.u.var).var.ptr));
zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr);
}
}
+ if (EG(This)) {
+ zval_ptr_dtor(&EG(This));
+ }
+ EG(This) = current_this;
+ EG(scope) = current_scope;
zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &EX(calling_scope), &EX(object), &EX(fbc));
if(EG(active_namespace) != active_namespace) {
}
EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
+ printf ("[zend - new handler]\n");
object_init_ex(EX_T(EX(opline)->result.u.var).var.ptr, EX_T(EX(opline)->op1.u.var).EA.class_entry);
EX_T(EX(opline)->result.u.var).var.ptr->refcount=1;
EX_T(EX(opline)->result.u.var).var.ptr->is_ref=1;