}
return;
}
-
+
+ /* TODO!: call set on object */
if (EG(ze1_compatibility_mode) && Z_TYPE_P(value) == IS_OBJECT) {
if (value->value.obj.handlers->clone_obj == NULL) {
zend_error(E_ERROR, "Trying to clone an uncloneable object of class %s", Z_OBJCE_P(value)->name);
if (variable_ptr!=value) {
zend_uint refcount = variable_ptr->refcount;
zval garbage;
-
+
if (type!=IS_TMP_VAR) {
value->refcount++;
}
variable_ptr->refcount++;
} else if (PZVAL_IS_REF(value)) {
zval tmp;
-
+
tmp = *value;
zval_copy_ctor(&tmp);
tmp.refcount=1;
value->refcount=1;
*variable_ptr = *value;
break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
} else { /* we need to split */
switch (type) {
case IS_VAR:
value->refcount=1;
**variable_ptr_ptr = *value;
break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
}
(*variable_ptr_ptr)->is_ref=0;
}
{
zval *container;
zval **retval;
-
+
retval = &T(result->u.var).var.ptr;
T(result->u.var).var.ptr_ptr = retval;
return;
}
-
+
if (container->type != IS_OBJECT) {
zend_error(E_NOTICE, "Trying to get property of non-object");
} else {
zval *offset;
zval tmp;
-
+
offset = get_zval_ptr(op2, Ts, &EG(free_op2), BP_VAR_R);
switch (op2->op_type) {
case IS_CONST:
SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
- binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
+ if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
+ && Z_OBJ_HANDLER_PP(var_ptr, set)) {
+ /* proxy object */
+ zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr);
+ objval->refcount++;
+ binary_op(objval, objval, value TSRMLS_CC);
+ Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval);
+ zval_ptr_dtor(&objval);
+ } else {
+ binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
+ }
+
EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result);
FREE_OP(Ex(Ts), &opline->op1, EG(free_op1));
SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
- incdec_op(*var_ptr);
+ if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
+ && Z_OBJ_HANDLER_PP(var_ptr, set)) {
+ /* proxy object */
+ zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr);
+ val->refcount++;
+ incdec_op(val);
+ Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val);
+ zval_ptr_dtor(&val);
+ } else {
+ incdec_op(*var_ptr);
+ }
switch (opline->opcode) {
case ZEND_PRE_INC: