summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>1999-10-10 04:38:51 +0000
committerAndi Gutmans <andi@php.net>1999-10-10 04:38:51 +0000
commit274ce69429cf71b8a51f49c623ea52c1dcc87a40 (patch)
tree28ef2bc2b840d3f927a285dae59a61c3fe533c11 /Zend
parentea567a73f1cde72faffe5736027daefefaaad914 (diff)
downloadphp-git-274ce69429cf71b8a51f49c623ea52c1dcc87a40.tar.gz
- Clean up a bit. Separate before the locking so that we can use SEPARATE_ZVAL
macro.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_execute.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index f3d3ba1943..902d75b689 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -75,24 +75,11 @@ static void zend_extension_fcall_end_handler(zend_extension *extension, zend_op_
&& offset<=function_being_called->common.arg_types[0] \
&& function_being_called->common.arg_types[offset]==BYREF_FORCE)
-#define MAKE_REF_ON_READ_OBJECT(s) \
- { \
- zval **ptr_ptr; \
- \
- if ((ptr_ptr = (s)) \
- && ((*ptr_ptr)->type == IS_OBJECT) \
- && (!(*ptr_ptr)->is_ref) \
- && ((*ptr_ptr)->refcount>2)) { /* 2 because it's also locked */ \
- zval *ptr = *ptr_ptr; \
- \
- ptr->refcount -= 2; \
- *(ptr_ptr) = (zval *) emalloc(sizeof(zval)); \
- **(ptr_ptr) = *ptr; \
- zval_copy_ctor(*(ptr_ptr)); \
- (*(ptr_ptr))->refcount=2; \
- (*(ptr_ptr))->is_ref = 1; \
- } \
- }
+#define SEPARATE_ON_READ_OBJECT(obj) \
+if ((obj) && (type == BP_VAR_R) && ((*(obj))->type == IS_OBJECT) && (!(*(obj))->is_ref)) { \
+ SEPARATE_ZVAL((obj)); \
+ (*(obj))->is_ref = 1; \
+ }
static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, int *should_free ELS_DC)
{
@@ -512,7 +499,8 @@ static inline void zend_fetch_var_address(znode *result, znode *op1, znode *op2,
if (varname == &tmp_varname) {
zval_dtor(varname);
}
- Ts[result->u.var].var.ptr_ptr = retval;
+ Ts[result->u.var].var.ptr_ptr = retval;
+ SEPARATE_ON_READ_OBJECT(retval);
SELECTIVE_PZVAL_LOCK(*retval, result);
}
@@ -679,6 +667,7 @@ static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode
} else {
*retval = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, type ELS_CC);
}
+ SEPARATE_ON_READ_OBJECT(*retval);
SELECTIVE_PZVAL_LOCK(**retval, result);
break;
case IS_STRING: {
@@ -855,6 +844,7 @@ static inline void zend_fetch_property_address(znode *result, znode *op1, znode
zendi_zval_copy_ctor(*container);
}
*retval = zend_fetch_property_address_inner(container->value.obj.properties, op2, Ts, type ELS_CC);
+ SEPARATE_ON_READ_OBJECT(*retval);
SELECTIVE_PZVAL_LOCK(**retval, result);
}
@@ -1144,7 +1134,6 @@ binary_assign_op_addr: {
break;
case ZEND_FETCH_R:
zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
- MAKE_REF_ON_READ_OBJECT(Ts[opline->result.u.var].var.ptr_ptr);
AI_USE_PTR(Ts[opline->result.u.var].var);
break;
case ZEND_FETCH_W:
@@ -1172,7 +1161,6 @@ binary_assign_op_addr: {
PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr);
}
zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
- MAKE_REF_ON_READ_OBJECT(Ts[opline->result.u.var].var.ptr_ptr);
AI_USE_PTR(Ts[opline->result.u.var].var);
break;
case ZEND_FETCH_DIM_W:
@@ -1197,7 +1185,6 @@ binary_assign_op_addr: {
break;
case ZEND_FETCH_OBJ_R:
zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC);
- MAKE_REF_ON_READ_OBJECT(Ts[opline->result.u.var].var.ptr_ptr);
AI_USE_PTR(Ts[opline->result.u.var].var);
break;
case ZEND_FETCH_OBJ_W: