com php-src: Review a few more SEPARATE_ZVAL_IF_NOT_REF usages: Zend/zend_execute_API.c Zend/zend_type s.h ext/filter/filter.c
ext/filter/tests/filter_var _array_with_ref.phpt ext/mbstring/php_mbregex.c ext/session/session.c ext/spl/spl_array.c
| From: | Nikita Popov | Date: | Thu, 09 Oct 2014 10:51:05 +0000 |
| Subject: | com php-src: Review a few more SEPARATE_ZVAL_IF_NOT_REF usages: Zend/zend_execute_API.c Zend/zend_type s.h ext/filter/filter.c ext/filter/tests/filter_var _array_with_ref.phpt ext/mbstring/php_mbregex.c ext/session/session.c ext/spl/spl_array.c |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-82209@lists.php.net to get a copy of this message | ||
Commit: 43f1c94ddace679cac008b674ef983199a951542
Author: Nikita Popov <nikic@php.net> Thu, 9 Oct 2014 12:51:05 +0200
Parents: e919caca86d78a25d4de10d2df2e1c4357ac4408
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=43f1c94ddace679cac008b674ef983199a951542
Log:
Review a few more SEPARATE_ZVAL_IF_NOT_REF usages
Changed paths:
M Zend/zend_execute_API.c
M Zend/zend_types.h
M ext/filter/filter.c
A ext/filter/tests/filter_var_array_with_ref.phpt
M ext/mbstring/php_mbregex.c
M ext/session/session..c
M ext/spl/spl_array.c
Diff:
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index f6bd9d1..cd2cc98 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 b7e8068..811133a 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 7ef65bc..ec3c007 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 0000000..cd202ed
--- /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 de0bc76..8be88c3 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 63bb00e..dae965b 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 211180a..8aab4c4 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)) {