com php-src: Fixed bug parameter is casted to string of array_column: ext/standard/array.c ext/standard/tests /array/array_column_object_cast.phpt
| From: | Xinchen Hui | Date: | Mon, 01 Apr 2013 11:11:45 +0000 |
| Subject: | com php-src: Fixed bug parameter is casted to string of array_column: ext/standard/array.c ext/standard/tests /array/array_column_object_cast.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-71822@lists.php.net to get a copy of this message | ||
Commit: d8a5f41a606a19efea7fe4df34bb24e66d3d3762
Author: Xinchen Hui <laruence@php.net> Mon, 1 Apr 2013 19:11:45 +0800
Parents: 3b504a371734cec343a5b17adc019b54f474b2a9
Branches: PHP-5.5
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=d8a5f41a606a19efea7fe4df34bb24e66d3d3762
Log:
Fixed bug parameter is casted to string of array_column
Changed paths:
M ext/standard/array.c
A ext/standard/tests/array/array_column_object_cast.phpt
Diff:
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 226bfef..9a64cf4 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2529,32 +2529,32 @@ PHP_FUNCTION(array_count_values)
value_key and optionally indexed by the index_key */
PHP_FUNCTION(array_column)
{
- zval *zarray, *zcolumn, *zkey = NULL, **data, **zcolval, **zkeyval;
+ zval *zarray, **zcolumn, **zkey = NULL, **data, **zcolval, **zkeyval;
HashTable *arr_hash;
HashPosition pointer;
ulong column_idx = 0, key_idx = 0;
char *column = NULL, *key = NULL, *keyval = NULL;
int column_len = 0, key_len = 0, keyval_idx = -1;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "az|z", &zarray, &zcolumn,
&zkey) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aZ|Z", &zarray, &zcolumn,
&zkey) == FAILURE) {
return;
}
- switch (Z_TYPE_P(zcolumn)) {
+ switch (Z_TYPE_PP(zcolumn)) {
case IS_NULL:
column_idx = 0;
break;
case IS_LONG:
- column_idx = Z_LVAL_P(zcolumn);
+ column_idx = Z_LVAL_PP(zcolumn);
break;
case IS_STRING:
- column = Z_STRVAL_P(zcolumn);
- column_len = Z_STRLEN_P(zcolumn);
+ column = Z_STRVAL_PP(zcolumn);
+ column_len = Z_STRLEN_PP(zcolumn);
break;
case IS_OBJECT:
- convert_to_string(zcolumn);
- column = Z_STRVAL_P(zcolumn);
- column_len = Z_STRLEN_P(zcolumn);
+ convert_to_string_ex(zcolumn);
+ column = Z_STRVAL_PP(zcolumn);
+ column_len = Z_STRLEN_PP(zcolumn);
break;
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The column key should be either a string or an
integer");
@@ -2562,21 +2562,21 @@ PHP_FUNCTION(array_column)
}
if (zkey) {
- switch (Z_TYPE_P(zkey)) {
+ switch (Z_TYPE_PP(zkey)) {
case IS_NULL:
key_idx = 0;
break;
case IS_LONG:
- key_idx = Z_LVAL_P(zkey);
+ key_idx = Z_LVAL_PP(zkey);
break;
case IS_STRING:
- key = Z_STRVAL_P(zkey);
- key_len = Z_STRLEN_P(zkey);
+ key = Z_STRVAL_PP(zkey);
+ key_len = Z_STRLEN_PP(zkey);
break;
case IS_OBJECT:
- convert_to_string(zkey);
- key = Z_STRVAL_P(zkey);
- key_len = Z_STRLEN_P(zkey);
+ convert_to_string_ex(zkey);
+ key = Z_STRVAL_PP(zkey);
+ key_len = Z_STRLEN_PP(zkey);
break;
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The index key should be either a string or an
integer");
@@ -2592,6 +2592,8 @@ PHP_FUNCTION(array_column)
zend_hash_move_forward_ex(arr_hash, &pointer)) {
if (Z_TYPE_PP(data) == IS_ARRAY) {
+ zval *strkey = NULL;
+
if (column && zend_hash_find(Z_ARRVAL_PP(data), column, column_len + 1,
(void**)&zcolval) == FAILURE) {
continue;
} else if (!column && zend_hash_index_find(Z_ARRVAL_PP(data), column_idx,
(void**)&zcolval) == FAILURE) {
@@ -2617,8 +2619,12 @@ PHP_FUNCTION(array_column)
keyval = Z_STRVAL_PP(zkeyval);
break;
case IS_OBJECT:
- convert_to_string(*zkeyval);
- keyval = Z_STRVAL_PP(zkeyval);
+ {
+ MAKE_STD_ZVAL(strkey);
+ MAKE_COPY_ZVAL(zkeyval, strkey);
+ convert_to_string(strkey);
+ keyval = Z_STRVAL_P(strkey);
+ }
break;
default:
keyval_idx = -1;
@@ -2628,6 +2634,9 @@ PHP_FUNCTION(array_column)
if (keyval) {
add_assoc_zval(return_value, keyval, *zcolval);
+ if (strkey) {
+ zval_ptr_dtor(&strkey);
+ }
} else if (keyval_idx != -1) {
add_index_zval(return_value, keyval_idx, *zcolval);
} else {
diff --git a/ext/standard/tests/array/array_column_object_cast.phpt
b/ext/standard/tests/array/array_column_object_cast.phpt
new file mode 100644
index 0000000..762aaa8
--- /dev/null
+++ b/ext/standard/tests/array/array_column_object_cast.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Test array_column() function: basic functionality
+--FILE--
+<?php
+class ColumnKeyClass {
+ function __toString() { return 'first_name'; }
+}
+
+class IndexKeyClass {
+ function __toString() { return 'id'; }
+}
+
+class ValueClass {
+ function __toString() { return '2135'; }
+}
+
+
+$column_key = new ColumnKeyClass();
+$index_key = new IndexKeyClass();
+$value = new ValueClass();
+
+
+// Array representing a possible record set returned from a database
+$records = array(
+ array(
+ 'id' => $value,
+ 'first_name' => 'John',
+ 'last_name' => 'XXX'
+ ),
+ array(
+ 'id' => 3245,
+ 'first_name' => 'Sally',
+ 'last_name' => 'Smith'
+ ),
+);
+$firstNames = array_column($records, $column_key, $index_key);
+print_r($firstNames);
+var_dump($column_key);
+var_dump($index_key);
+var_dump($value);
+--EXPECTF--
+Array
+(
+ [2135] => John
+ [3245] => Sally
+)
+object(ColumnKeyClass)#%d (0) {
+}
+object(IndexKeyClass)#%d (0) {
+}
+object(ValueClass)#%d (0) {
+}