diff options
author | Nikita Popov <nikic@php.net> | 2014-09-03 15:16:32 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2014-09-03 15:18:06 +0200 |
commit | 9e753531842f524a1a147ca0244c041e59ecd117 (patch) | |
tree | 77f1dbf101b5012bb986f178cdd5379f67b84ec0 | |
parent | c52511c30703d2921f813ccf1557bc042a7cd9d2 (diff) | |
download | php-git-9e753531842f524a1a147ca0244c041e59ecd117.tar.gz |
Use zval_ptr_dtor_nogc to destroy literals
Also move the definition of zval_ptr_dtor_nogc to zend_variables.h
(from zend_execute.h/.c) as it's used in a few places.
-rw-r--r-- | Zend/zend_ast.c | 7 | ||||
-rw-r--r-- | Zend/zend_compile.c | 5 | ||||
-rw-r--r-- | Zend/zend_execute.c | 1 | ||||
-rw-r--r-- | Zend/zend_execute.h | 14 | ||||
-rw-r--r-- | Zend/zend_opcode.c | 2 | ||||
-rw-r--r-- | Zend/zend_variables.h | 8 |
6 files changed, 13 insertions, 24 deletions
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 2f7c9fd87d..8c9607fcff 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -382,16 +382,11 @@ static void zend_ast_destroy_ex(zend_ast *ast, zend_bool free) { switch (ast->kind) { case ZEND_AST_ZVAL: - { /* Destroy value without using GC: When opcache moves arrays into SHM it will * free the zend_array structure, so references to it from outside the op array * become invalid. GC would cause such a reference in the root buffer. */ - zval *zv = zend_ast_get_zval(ast); - if (Z_REFCOUNTED_P(zv) && !Z_DELREF_P(zv)) { - _zval_dtor_func_for_ptr(Z_COUNTED_P(zv) ZEND_FILE_LINE_CC); - } + zval_ptr_dtor_nogc(zend_ast_get_zval(ast)); break; - } case ZEND_AST_FUNC_DECL: case ZEND_AST_CLOSURE: case ZEND_AST_METHOD: diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0b42f9597b..a5a32298d5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -600,10 +600,7 @@ void zend_do_free(znode *op1 TSRMLS_DC) /* {{{ */ /* Destroy value without using GC: When opcache moves arrays into SHM it will * free the zend_array structure, so references to it from outside the op array * become invalid. GC would cause such a reference in the root buffer. */ - zval *zv = &op1->u.constant; - if (Z_REFCOUNTED_P(zv) && !Z_DELREF_P(zv)) { - _zval_dtor_func_for_ptr(Z_COUNTED_P(zv) ZEND_FILE_LINE_CC); - } + zval_ptr_dtor_nogc(&op1->u.constant); } } /* }}} */ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9237e97415..d981773b45 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -83,7 +83,6 @@ static const zend_internal_function zend_pass_function = { #undef zval_ptr_dtor #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_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); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ed905ff8cf..77e6a9e59a 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -63,16 +63,6 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC } } -static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) -{ - if (Z_REFCOUNTED_P(zval_ptr)) { - if (!Z_DELREF_P(zval_ptr)) { - ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); - _zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC); - } - } -} - static zend_always_inline int i_zend_is_true(zval *op TSRMLS_DC) { int result; @@ -237,7 +227,7 @@ static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data * zval *p = end + (call->num_args - first_extra_arg); do { p--; - i_zval_ptr_dtor_nogc(p ZEND_FILE_LINE_CC TSRMLS_CC); + zval_ptr_dtor_nogc(p); } while (p != end); } } @@ -252,7 +242,7 @@ static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call T do { p--; - i_zval_ptr_dtor_nogc(p ZEND_FILE_LINE_CC TSRMLS_CC); + zval_ptr_dtor_nogc(p); } while (p != end); } } diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index d5c4693b7f..db1f1cf9cc 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -343,7 +343,7 @@ ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC) if (literal) { end = literal + op_array->last_literal; while (literal < end) { - zval_dtor(literal); + zval_ptr_dtor_nogc(literal); literal++; } efree(op_array->literals); diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h index c55ce233a5..538d2a5566 100644 --- a/Zend/zend_variables.h +++ b/Zend/zend_variables.h @@ -36,6 +36,13 @@ static zend_always_inline void _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC) _zval_dtor_func(Z_COUNTED_P(zvalue) ZEND_FILE_LINE_RELAY_CC); } +static zend_always_inline void _zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC) +{ + if (Z_REFCOUNTED_P(zval_ptr) && !Z_DELREF_P(zval_ptr)) { + _zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC); + } +} + ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC); #define zval_copy_ctor_func(zv) _zval_copy_ctor_func(zv ZEND_FILE_LINE_CC) @@ -98,6 +105,7 @@ ZEND_API void _zval_dtor_wrapper(zval *zvalue); #define zval_opt_copy_ctor_no_imm(zvalue) _zval_opt_copy_ctor_no_imm((zvalue) ZEND_FILE_LINE_CC) #define zval_dtor(zvalue) _zval_dtor((zvalue) ZEND_FILE_LINE_CC) #define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC) +#define zval_ptr_dtor_nogc(zval_ptr) _zval_ptr_dtor_nogc((zval_ptr) ZEND_FILE_LINE_CC) #define zval_internal_dtor(zvalue) _zval_internal_dtor((zvalue) ZEND_FILE_LINE_CC) #define zval_internal_ptr_dtor(zvalue) _zval_internal_ptr_dtor((zvalue) ZEND_FILE_LINE_CC) #define zval_dtor_wrapper _zval_dtor_wrapper |