diff options
author | Etienne Kneuss <colder@php.net> | 2008-07-09 21:29:39 +0000 |
---|---|---|
committer | Etienne Kneuss <colder@php.net> | 2008-07-09 21:29:39 +0000 |
commit | cecf208c3f39d5a62535d420c7fdf059d64bd347 (patch) | |
tree | 5c38525fc87a7b7a807e66d3f59efc783d142eba | |
parent | 6d0c676a592d4fcf402c2268d47d849b5d040532 (diff) | |
download | php-git-cecf208c3f39d5a62535d420c7fdf059d64bd347.tar.gz |
Fix resolution rule of count vs. handler
-rw-r--r-- | ext/standard/array.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index ccfd772c2a..6737445dd5 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -325,9 +325,17 @@ PHP_FUNCTION(count) break; case IS_OBJECT: { #ifdef HAVE_SPL - /* it the object implements Countable we call its count() method */ zval *retval; - +#endif + /* first, we check if an handler is defined */ + if (Z_OBJ_HT_P(array)->count_elements) { + RETVAL_LONG(1); + if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) { + return; + } + } +#ifdef HAVE_SPL + /* if not and the object implements Countable we call its count() method */ if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) { zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval); if (retval) { @@ -338,13 +346,6 @@ PHP_FUNCTION(count) return; } #endif - /* if not we return the number of properties (not taking visibility into account) */ - if (Z_OBJ_HT_P(array)->count_elements) { - RETVAL_LONG(1); - if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) { - return; - } - } } default: RETURN_LONG(1); |