summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/phar/phar_object.c6
-rw-r--r--ext/spl/spl_observer.c23
-rw-r--r--ext/standard/array.c9
-rw-r--r--ext/standard/php_array.h4
4 files changed, 32 insertions, 10 deletions
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index 99907f86dd..407edda0fb 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -1934,10 +1934,12 @@ PHP_METHOD(Phar, buildFromIterator)
*/
PHP_METHOD(Phar, count)
{
+ /* mode can be ignored, maximum depth is 1 */
+ long mode;
PHAR_ARCHIVE_OBJECT();
- if (zend_parse_parameters_none() == FAILURE) {
- return;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &mode) == FAILURE) {
+ RETURN_FALSE;
}
RETURN_LONG(zend_hash_num_elements(&phar_obj->arc.archive->manifest));
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 1a706f7642..91830ab000 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -26,6 +26,7 @@
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
+#include "ext/standard/php_array.h"
#include "ext/standard/php_var.h"
#include "ext/standard/php_smart_str.h"
#include "zend_interfaces.h"
@@ -621,11 +622,27 @@ SPL_METHOD(SplObjectStorage, contains)
SPL_METHOD(SplObjectStorage, count)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
- if (zend_parse_parameters_none() == FAILURE) {
+ long mode = COUNT_NORMAL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &mode) == FAILURE) {
return;
}
-
+
+ if (mode == COUNT_RECURSIVE) {
+ long ret = zend_hash_num_elements(&intern->storage);
+ HashPosition position;
+ zval *element;
+
+ for (zend_hash_internal_pointer_reset_ex(&intern->storage, &position);
+ zend_hash_get_current_data_ex(&intern->storage, (void**) &element, &position) == SUCCESS;
+ zend_hash_move_forward_ex(&intern->storage, &position)) {
+ ret += php_count_recursive(element, mode TSRMLS_CC);
+ }
+
+ RETURN_LONG(ret);
+ return;
+ }
+
RETURN_LONG(zend_hash_num_elements(&intern->storage));
} /* }}} */
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 34057e34c8..4f98331035 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -64,9 +64,6 @@
#define CASE_LOWER 0
#define CASE_UPPER 1
-#define COUNT_NORMAL 0
-#define COUNT_RECURSIVE 1
-
#define DIFF_NORMAL 1
#define DIFF_KEY 2
#define DIFF_ASSOC 6
@@ -274,7 +271,7 @@ PHP_FUNCTION(ksort)
}
/* }}} */
-static int php_count_recursive(zval *array, long mode TSRMLS_DC) /* {{{ */
+PHPAPI int php_count_recursive(zval *array, long mode TSRMLS_DC) /* {{{ */
{
long cnt = 0;
zval **element;
@@ -338,13 +335,15 @@ PHP_FUNCTION(count)
if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
zval *mode_zv;
MAKE_STD_ZVAL(mode_zv);
- Z_LVAL_P(mode_zv) = mode;
+ ZVAL_LONG(mode_zv, mode);
zend_call_method_with_1_params(&array, NULL, NULL, "count", &retval, mode_zv);
if (retval) {
convert_to_long_ex(&retval);
RETVAL_LONG(Z_LVAL_P(retval));
zval_ptr_dtor(&retval);
}
+ zval_dtor(mode_zv);
+ efree(mode_zv);
return;
}
#endif
diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h
index deddeb4871..1b30e34787 100644
--- a/ext/standard/php_array.h
+++ b/ext/standard/php_array.h
@@ -107,6 +107,7 @@ PHPAPI void php_splice(HashTable *ht, zend_uint offset, zend_uint length, zval *
PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS_DC);
PHPAPI int php_array_replace_recursive(HashTable *dest, HashTable *src TSRMLS_DC);
PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC);
+PHPAPI int php_count_recursive(zval *array, long mode TSRMLS_DC);
#define PHP_SORT_REGULAR 0
#define PHP_SORT_NUMERIC 1
@@ -117,6 +118,9 @@ PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC);
#define PHP_SORT_NATURAL 6
#define PHP_SORT_FLAG_CASE 8
+#define COUNT_NORMAL 0
+#define COUNT_RECURSIVE 1
+
#define ARRAY_FILTER_USE_BOTH 1
#define ARRAY_FILTER_USE_KEY 2