summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-03-05 18:17:16 +0800
committerXinchen Hui <laruence@gmail.com>2014-03-05 18:17:16 +0800
commit70b788771243a13bcbdbc930137ae4fd6b446742 (patch)
tree1331d81fa00ff81b06d471f6140152908004e949
parent74c2deecd8a7854e4cb12ab3e48379cde2c0b19c (diff)
downloadphp-git-70b788771243a13bcbdbc930137ae4fd6b446742.tar.gz
Fixed refcounted handling
-rw-r--r--ext/standard/array.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index aefaef1d87..9c741ed613 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -411,6 +411,15 @@ static int php_array_natural_general_compare(const void *a, const void *b, int f
fval = &f->val;
sval = &s->val;
+
+ if (Z_ISREF_P(fval)) {
+ fval = Z_REFVAL_P(fval);
+ }
+
+ if (Z_ISREF_P(sval)) {
+ sval = Z_REFVAL_P(sval);
+ }
+
ZVAL_COPY_VALUE(&first, fval);
ZVAL_COPY_VALUE(&second, sval);
@@ -2605,20 +2614,18 @@ PHP_FUNCTION(array_column)
zkeyval = zend_hash_index_find(ht, Z_LVAL_P(zkey));
}
- if (zkeyval && Z_TYPE_P(zkeyval) == IS_STRING) {
+ if (Z_REFCOUNTED_P(zcolval)) {
Z_ADDREF_P(zcolval);
+ }
+ if (zkeyval && Z_TYPE_P(zkeyval) == IS_STRING) {
add_assoc_zval(return_value, Z_STRVAL_P(zkeyval), zcolval);
} else if (zkeyval && Z_TYPE_P(zkeyval) == IS_LONG) {
add_index_zval(return_value, Z_LVAL_P(zkeyval), zcolval);
} else if (zkeyval && Z_TYPE_P(zkeyval) == IS_OBJECT) {
- Z_ADDREF_P(zcolval);
SEPARATE_ZVAL(zkeyval);
convert_to_string(zkeyval);
add_assoc_zval(return_value, Z_STRVAL_P(zkeyval), zcolval);
} else {
- if (Z_REFCOUNTED_P(zcolval)) {
- Z_ADDREF_P(zcolval);
- }
add_next_index_zval(return_value, zcolval);
}
}