summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-09-03 15:16:32 +0200
committerNikita Popov <nikic@php.net>2014-09-03 15:18:06 +0200
commit9e753531842f524a1a147ca0244c041e59ecd117 (patch)
tree77f1dbf101b5012bb986f178cdd5379f67b84ec0
parentc52511c30703d2921f813ccf1557bc042a7cd9d2 (diff)
downloadphp-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.c7
-rw-r--r--Zend/zend_compile.c5
-rw-r--r--Zend/zend_execute.c1
-rw-r--r--Zend/zend_execute.h14
-rw-r--r--Zend/zend_opcode.c2
-rw-r--r--Zend/zend_variables.h8
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