ALLOC_ZVAL(zv); \
INIT_PZVAL(zv);
+#define PZVAL_IS_REF(z) ((z)->is_ref)
+
#define SEPARATE_ZVAL(ppzv) \
{ \
zval *orig_ptr = *(ppzv); \
\
if (orig_ptr->refcount>1) { \
orig_ptr->refcount--; \
- ALLOC_ZVAL(*(ppzv)); \
+ ALLOC_ZVAL(*(ppzv)); \
**(ppzv) = *orig_ptr; \
zval_copy_ctor(*(ppzv)); \
(*(ppzv))->refcount=1; \
} \
}
+#define SEPARATE_ZVAL_IF_NOT_REF(ppzv) \
+ if (!PZVAL_IS_REF(*ppzv)) { \
+ SEPARATE_ZVAL(ppzv); \
+ }
+
+
#define COPY_PZVAL_TO_ZVAL(zv, pzv) \
(zv) = *(pzv); \
if ((pzv)->refcount>1) { \
#define SEPARATE_ON_READ_OBJECT(obj, _type) \
-if ((obj) && ((_type) == BP_VAR_R) && ((*(obj))->type == IS_OBJECT) && (!(*(obj))->is_ref)) { \
- SEPARATE_ZVAL((obj)); \
+if ((obj) && ((_type) == BP_VAR_R) && ((*(obj))->type == IS_OBJECT)) { \
+ SEPARATE_ZVAL_IF_NOT_REF((obj)); \
(*(obj))->is_ref = 1; \
}
convert_to_long(&tmp);
offset = &tmp;
}
- if (!container->is_ref && type!=BP_VAR_R && type!=BP_VAR_IS) {
- SEPARATE_ZVAL(container_ptr);
+ if (type!=BP_VAR_R && type!=BP_VAR_IS) {
+ SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
}
container = *container_ptr;
Ts[result->u.var].EA.str = container;
case ZEND_FETCH_UNSET:
zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
if (Ts[opline->result.u.var].var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
- SEPARATE_ZVAL(Ts[opline->result.u.var].var.ptr_ptr);
+ SEPARATE_ZVAL_IF_NOT_REF(Ts[opline->result.u.var].var.ptr_ptr);
}
NEXT_OPCODE();
case ZEND_FETCH_IS:
*/
zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
if (Ts[opline->result.u.var].var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
- SEPARATE_ZVAL(Ts[opline->result.u.var].var.ptr_ptr);
+ SEPARATE_ZVAL_IF_NOT_REF(Ts[opline->result.u.var].var.ptr_ptr);
}
NEXT_OPCODE();
case ZEND_FETCH_OBJ_R:
case ZEND_FETCH_OBJ_UNSET:
zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
if (Ts[opline->result.u.var].var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
- SEPARATE_ZVAL(Ts[opline->result.u.var].var.ptr_ptr);
+ SEPARATE_ZVAL_IF_NOT_REF(Ts[opline->result.u.var].var.ptr_ptr);
}
NEXT_OPCODE();
case ZEND_FETCH_DIM_TMP_VAR: