diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-03-19 17:00:28 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-03-19 17:00:28 +0400 |
commit | b7938ab1bd765897bd6f08a48a8aea494a961ea9 (patch) | |
tree | 22f8034d42dfac8f03b4bb6d6573e5a7f6361ac8 /Zend/zend_execute.c | |
parent | 2e3e96b24bb1c547362af53b952f823f451e6bce (diff) | |
download | php-git-b7938ab1bd765897bd6f08a48a8aea494a961ea9.tar.gz |
Refactored GC (incomplete)
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5176817041..12c7625744 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -96,9 +96,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) if (Z_REFCOUNTED_P(z)) { if (!Z_DELREF_P(z)) { ZEND_ASSERT(z != &EG(uninitialized_zval)); - GC_REMOVE_ZVAL_FROM_BUFFER(z); zval_dtor(z); - efree(z); } } } @@ -911,11 +909,10 @@ static inline zval* zend_assign_tmp_to_variable(zval *variable_ptr, zval *value GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr); ZVAL_COPY_VALUE(variable_ptr, value); } else { - zval garbage; + zend_refcounted *garbage = Z_COUNTED_P(variable_ptr); - ZVAL_COPY_VALUE(&garbage, variable_ptr); ZVAL_COPY_VALUE(variable_ptr, value); - _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); + _zval_dtor_func(garbage ZEND_FILE_LINE_CC); } return variable_ptr; } @@ -946,21 +943,20 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu zval_copy_ctor(variable_ptr); } } else { - zval garbage; + zend_refcounted *garbage = Z_COUNTED_P(variable_ptr); - ZVAL_COPY_VALUE(&garbage, variable_ptr); ZVAL_COPY_VALUE(variable_ptr, value); if (Z_REFCOUNTED_P(value)) { zval_copy_ctor(variable_ptr); } - _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); + _zval_dtor_func(garbage ZEND_FILE_LINE_CC); } return variable_ptr; } static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC) { - zval garbage; + zend_refcounted *garbage; int is_ref = 0; if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) { @@ -982,7 +978,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC); } else if (EXPECTED(variable_ptr != value)) { if (Z_REFCOUNT_P(variable_ptr)==1) { - ZVAL_COPY_VALUE(&garbage, variable_ptr); + garbage = Z_COUNTED_P(variable_ptr); if (EXPECTED(!Z_ISREF_P(value))) { if (!is_ref) { ZVAL_COPY(variable_ptr, value); @@ -992,15 +988,13 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM } else { if (Z_REFCOUNT_P(value) == 1) { //??? auto dereferencing - zend_reference *ref = Z_REF_P(value); - ZVAL_COPY_VALUE(value, Z_REFVAL_P(value)); + ZVAL_UNREF(value); ZVAL_COPY(variable_ptr, value); - efree(ref); } else { ZVAL_DUP(variable_ptr, Z_REFVAL_P(value)); } } - _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); + _zval_dtor_func(garbage ZEND_FILE_LINE_CC); } else { /* we need to split */ Z_DELREF_P(variable_ptr); GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr); @@ -1015,10 +1009,8 @@ assign_simple: assign_ref: if (Z_REFCOUNT_P(value) == 1) { //??? auto dereferencing - zend_reference *ref = Z_REF_P(value); - ZVAL_COPY_VALUE(value, Z_REFVAL_P(value)); + ZVAL_UNREF(value); ZVAL_COPY(variable_ptr, value); - efree(ref); } else { ZVAL_DUP(variable_ptr, Z_REFVAL_P(value)); } |