diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4e092e0861..e9312d9743 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -64,18 +64,6 @@ static void zend_extension_fcall_end_handler(const zend_extension *extension, ze #define RETURN_VALUE_USED(opline) (!((opline)->result_type & EXT_TYPE_UNUSED)) -#define TEMP_VAR_STACK_LIMIT 2000 - -static zend_always_inline void zend_pzval_unlock_func(zval *z, zend_free_op *should_free) -{ - should_free->var = NULL; - if (Z_REFCOUNTED_P(z) && !Z_DELREF_P(z)) { - Z_SET_REFCOUNT_P(z, 1); - should_free->var = z; - /* should_free->is_var = 1; */ - } -} - static ZEND_FUNCTION(pass) { } @@ -97,10 +85,12 @@ static const zend_internal_function zend_pass_function = { #define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC TSRMLS_CC) #define zval_ptr_dtor_nogc(zv) i_zval_ptr_dtor_nogc(zv ZEND_FILE_LINE_CC TSRMLS_CC) -#define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f) #define PZVAL_LOCK(z) if (Z_REFCOUNTED_P(z)) Z_ADDREF_P((z)) #define SELECTIVE_PZVAL_LOCK(pzv, opline) if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(pzv); } +#define READY_TO_DESTROY(zv) \ + (zv && Z_REFCOUNTED_P(zv) && Z_REFCOUNT_P(zv) == 1) + #define EXTRACT_ZVAL_PTR(zv) do { \ zval *__zv = (zv); \ if (Z_TYPE_P(__zv) == IS_INDIRECT) { \ @@ -439,11 +429,12 @@ static zend_always_inline zval *_get_zval_ptr_ptr_var(uint32_t var, const zend_e if (EXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) { should_free->var = NULL; return Z_INDIRECT_P(ret); - } else if (!Z_REFCOUNTED_P(ret)) { - should_free->var = ret; //??? + } else if (!Z_REFCOUNTED_P(ret) || Z_REFCOUNT_P(ret) == 1) { + should_free->var = ret; return ret; } else { - PZVAL_UNLOCK(ret, should_free); + Z_DELREF_P(ret); + should_free->var = NULL; return ret; } } |