summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-10-09 12:51:05 +0200
committerNikita Popov <nikic@php.net>2014-10-09 12:51:05 +0200
commit43f1c94ddace679cac008b674ef983199a951542 (patch)
tree69030b975c55d5e7ce67fa365e2ca4d342996253
parente919caca86d78a25d4de10d2df2e1c4357ac4408 (diff)
downloadphp-git-43f1c94ddace679cac008b674ef983199a951542.tar.gz
Review a few more SEPARATE_ZVAL_IF_NOT_REF usages
-rw-r--r--Zend/zend_execute_API.c4
-rw-r--r--Zend/zend_types.h1
-rw-r--r--ext/filter/filter.c3
-rw-r--r--ext/filter/tests/filter_var_array_with_ref.phpt23
-rw-r--r--ext/mbstring/php_mbregex.c3
-rw-r--r--ext/session/session.c5
-rw-r--r--ext/spl/spl_array.c2
7 files changed, 31 insertions, 10 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index f6bd9d1ca7..cd2cc98b42 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -521,7 +521,7 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_bool inline_change, zend_clas
} else if (Z_TYPE_P(p) == IS_CONSTANT) {
int refcount;
- SEPARATE_ZVAL_IF_NOT_REF(p);
+ SEPARATE_ZVAL_NOREF(p);
MARK_CONSTANT_VISITED(p);
refcount = Z_REFCOUNTED_P(p) ? Z_REFCOUNT_P(p) : 1;
const_value = zend_get_constant_ex(Z_STR_P(p), scope, Z_CONST_FLAGS_P(p) TSRMLS_CC);
@@ -599,7 +599,7 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_bool inline_change, zend_clas
if (Z_REFCOUNTED_P(p)) Z_SET_REFCOUNT_P(p, refcount);
} else if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
zval tmp;
- SEPARATE_ZVAL_IF_NOT_REF(p);
+ SEPARATE_ZVAL_NOREF(p);
zend_ast_evaluate(&tmp, Z_ASTVAL_P(p), scope TSRMLS_CC);
if (inline_change) {
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index b7e806804f..811133a275 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -783,6 +783,7 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
#define SEPARATE_ZVAL_NOREF(zv) do { \
zval *_zv = (zv); \
+ ZEND_ASSERT(Z_TYPE_P(_zv) != IS_REFERENCE); \
if (Z_COPYABLE_P(_zv) || \
Z_IMMUTABLE_P(_zv)) { \
if (Z_REFCOUNT_P(_zv) > 1) { \
diff --git a/ext/filter/filter.c b/ext/filter/filter.c
index 7ef65bc196..ec3c007afd 100644
--- a/ext/filter/filter.c
+++ b/ext/filter/filter.c
@@ -491,7 +491,8 @@ static void php_zval_filter_recursive(zval *value, zend_long filter, zend_long f
}
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(value), element) {
- SEPARATE_ZVAL_IF_NOT_REF(element);
+ ZVAL_DEREF(element);
+ SEPARATE_ZVAL_NOREF(element);
if (Z_TYPE_P(element) == IS_ARRAY) {
Z_ARRVAL_P(element)->u.v.nApplyCount++;
php_zval_filter_recursive(element, filter, flags, options, charset, copy TSRMLS_CC);
diff --git a/ext/filter/tests/filter_var_array_with_ref.phpt b/ext/filter/tests/filter_var_array_with_ref.phpt
new file mode 100644
index 0000000000..cd202edf4d
--- /dev/null
+++ b/ext/filter/tests/filter_var_array_with_ref.phpt
@@ -0,0 +1,23 @@
+--TEST--
+filter_var_array() on array with reference
+--FILE--
+<?php
+
+$array = ["123foo"];
+$array2 = [&$array];
+var_dump(filter_var_array($array2, FILTER_VALIDATE_INT));
+var_dump($array);
+
+?>
+--EXPECTF--
+array(1) {
+ [0]=>
+ &array(1) {
+ [0]=>
+ bool(false)
+ }
+}
+array(1) {
+ [0]=>
+ bool(false)
+}
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index de0bc768ad..8be88c3fee 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -1343,8 +1343,7 @@ PHP_FUNCTION(mb_ereg_search_init)
zval_ptr_dtor(&MBREX(search_str));
}
- ZVAL_COPY(&MBREX(search_str), arg_str);
- SEPARATE_ZVAL_IF_NOT_REF(&MBREX(search_str));
+ ZVAL_DUP(&MBREX(search_str), arg_str);
MBREX(search_pos) = 0;
diff --git a/ext/session/session.c b/ext/session/session.c
index 63bb00e06a..dae965b048 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -2105,10 +2105,7 @@ static PHP_FUNCTION(session_unset)
}
IF_SESSION_VARS() {
- HashTable *ht_sess_var;
-
- SEPARATE_ZVAL_IF_NOT_REF(&PS(http_session_vars));
- ht_sess_var = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars)));
+ HashTable *ht_sess_var = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars)));
/* Clean $_SESSION. */
zend_hash_clean(ht_sess_var);
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 211180a08d..8aab4c49bf 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -1144,7 +1144,7 @@ static void spl_array_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, int just_array TSRMLS_DC) {
if (Z_TYPE_P(array) == IS_ARRAY) {
- SEPARATE_ZVAL_IF_NOT_REF(array);
+ SEPARATE_ARRAY(array);
}
if (Z_TYPE_P(array) == IS_OBJECT && (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject || Z_OBJ_HT_P(array) == &spl_handler_ArrayIterator)) {