colder Wed Jul 9 21:27:28 2008 UTC
Added files: (Branch: PHP_5_3)
/php-src/ext/simplexml/tests 036.phpt
Modified files:
/php-src/ext/spl spl_sxe.c
/php-src/ext/simplexml php_simplexml.h simplexml.c
Log:
MFH: Move SXI::count to SXE::count and make it user-friendly
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_sxe.c?r1=1.8.2.5.2.2.2.2&r2=1.8.2.5.2.2.2.3&diff_format=u
Index: php-src/ext/spl/spl_sxe.c
diff -u php-src/ext/spl/spl_sxe.c:1.8.2.5.2.2.2.2
php-src/ext/spl/spl_sxe.c:1.8.2.5.2.2.2.3
--- php-src/ext/spl/spl_sxe.c:1.8.2.5.2.2.2.2 Mon Dec 31 07:17:14 2007
+++ php-src/ext/spl/spl_sxe.c Wed Jul 9 21:27:28 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_sxe.c,v 1.8.2.5.2.2.2.2 2007/12/31 07:17:14 sebastian Exp $ */
+/* $Id: spl_sxe.c,v 1.8.2.5.2.2.2.3 2008/07/09 21:27:28 colder Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -145,17 +145,6 @@
RETURN_ZVAL(sxe->iter.data, 1, 0);
}
-/* {{{ proto int SimpleXMLIterator::count()
- Get number of child elements */
-SPL_METHOD(SimpleXMLIterator, count)
-{
- long count = 0;
-
- Z_OBJ_HANDLER_P(getThis(), count_elements)(getThis(), &count TSRMLS_CC);
-
- RETURN_LONG(count);
-}
-
static const zend_function_entry spl_funcs_SimpleXMLIterator[] = {
SPL_ME(SimpleXMLIterator, rewind, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SimpleXMLIterator, valid, NULL, ZEND_ACC_PUBLIC)
@@ -164,7 +153,6 @@
SPL_ME(SimpleXMLIterator, next, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SimpleXMLIterator, hasChildren, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SimpleXMLIterator, getChildren, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(SimpleXMLIterator, count, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/simplexml/php_simplexml.h?r1=1.20.2.2.2.3.2.2&r2=1.20.2.2.2.3.2.3&diff_format=u
Index: php-src/ext/simplexml/php_simplexml.h
diff -u php-src/ext/simplexml/php_simplexml.h:1.20.2.2.2.3.2.2
php-src/ext/simplexml/php_simplexml.h:1.20.2.2.2.3.2.3
--- php-src/ext/simplexml/php_simplexml.h:1.20.2.2.2.3.2.2 Thu Jan 3
16:20:33 2008
+++ php-src/ext/simplexml/php_simplexml.h Wed Jul 9 21:27:28 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_simplexml.h,v 1.20.2.2.2.3.2.2 2008/01/03 16:20:33 nlopess Exp $ */
+/* $Id: php_simplexml.h,v 1.20.2.2.2.3.2.3 2008/07/09 21:27:28 colder Exp $ */
#ifndef PHP_SIMPLEXML_H
#define PHP_SIMPLEXML_H
@@ -68,6 +68,7 @@
zval *data;
} iter;
zval *tmp;
+ zend_function *fptr_count;
} php_sxe_object;
#ifdef ZTS
http://cvs.php.net/viewvc.cgi/php-src/ext/simplexml/simplexml.c?r1=1.151.2.22.2.35.2.15&r2=1.151.2.22.2.35.2.16&diff_format=u
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.15
php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.16
--- php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.15 Fri Jun 27
15:46:44 2008
+++ php-src/ext/simplexml/simplexml.c Wed Jul 9 21:27:28 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: simplexml.c,v 1.151.2.22.2.35.2.15 2008/06/27 15:46:44 felipe Exp $ */
+/* $Id: simplexml.c,v 1.151.2.22.2.35.2.16 2008/07/09 21:27:28 colder Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1811,14 +1811,12 @@
}
/* }}} */
-static int sxe_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
+static int php_sxe_count_elements_helper(php_sxe_object *sxe, long *count
TSRMLS_DC) /* {{{ */
{
- php_sxe_object *sxe;
xmlNodePtr node;
zval *data;
*count = 0;
- sxe = php_sxe_fetch_object(object TSRMLS_CC);
data = sxe->iter.data;
sxe->iter.data = NULL;
@@ -1840,6 +1838,42 @@
}
/* }}} */
+static int sxe_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
+{
+ php_sxe_object *intern;
+ intern = php_sxe_fetch_object(object TSRMLS_CC);
+ if (intern->fptr_count) {
+ zval *rv;
+ zend_call_method_with_0_params(&object, intern->zo.ce,
&intern->fptr_count, "count", &rv);
+ if (rv) {
+ if (intern->tmp) {
+ zval_ptr_dtor(&intern->tmp);
+ }
+ MAKE_STD_ZVAL(intern->tmp);
+ ZVAL_ZVAL(intern->tmp, rv, 1, 1);
+ convert_to_long(intern->tmp);
+ *count = (long) Z_LVAL_P(intern->tmp);
+ return SUCCESS;
+ }
+ return FAILURE;
+ }
+ return php_sxe_count_elements_helper(intern, count TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ proto int SimpleXMLIterator::count()
+ Get number of child elements */
+SXE_METHOD(count)
+{
+ long count = 0;
+ php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
+
+ php_sxe_count_elements_helper(sxe, &count TSRMLS_CC);
+
+ RETURN_LONG(count);
+}
+/* }}} */
+
static zval *sxe_get_value(zval *z TSRMLS_DC) /* {{{ */
{
zval *retval;
@@ -1990,12 +2024,15 @@
static php_sxe_object* php_sxe_object_new(zend_class_entry *ce TSRMLS_DC)
{
php_sxe_object *intern;
+ zend_class_entry *parent = ce;
+ int inherited = 0;
intern = ecalloc(1, sizeof(php_sxe_object));
intern->iter.type = SXE_ITER_NONE;
intern->iter.nsprefix = NULL;
intern->iter.name = NULL;
+ intern->fptr_count = NULL;
#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION >
2) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION >
5)
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
@@ -2007,6 +2044,22 @@
intern->zo.guards = NULL;
#endif
+ while (parent) {
+ if (parent == sxe_class_entry) {
+ break;
+ }
+
+ parent = parent->parent;
+ inherited = 1;
+ }
+
+ if (inherited) {
+ zend_hash_find(&ce->function_table, "count",
sizeof("count"),(void **) &intern->fptr_count);
+ if (intern->fptr_count->common.scope == parent) {
+ intern->fptr_count = NULL;
+ }
+ }
+
return intern;
}
/* }}} */
@@ -2456,6 +2509,7 @@
SXE_ME(addChild, NULL, ZEND_ACC_PUBLIC)
SXE_ME(addAttribute, NULL, ZEND_ACC_PUBLIC)
SXE_ME(__toString, NULL, ZEND_ACC_PUBLIC)
+ SXE_ME(count, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
@@ -2504,7 +2558,7 @@
{
php_info_print_table_start();
php_info_print_table_header(2, "Simplexml support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision:
1.151.2.22.2.35.2.15 $");
+ php_info_print_table_row(2, "Revision", "$Revision:
1.151.2.22.2.35.2.16 $");
php_info_print_table_row(2, "Schema support",
#ifdef LIBXML_SCHEMAS_ENABLED
"enabled");
http://cvs.php.net/viewvc.cgi/php-src/ext/simplexml/tests/036.phpt?view=markup&rev=1.1
Index: php-src/ext/simplexml/tests/036.phpt
+++ php-src/ext/simplexml/tests/036.phpt
--TEST--
SimpleXML: overriden count() method
--SKIPIF--
<?php if (!extension_loaded("simplexml")) print "skip"; ?>
--FILE--
<?php
class SXE extends SimpleXmlElement {
public function count() {
echo "Called Count!\n";
return parent::count();
}
}
$str = '<xml><c>asdf</c><c>ghjk</c></xml>';
$sxe = new SXE($str);
var_dump(count($sxe));
?>
==Done==
--EXPECT--
Called Count!
int(2)
==Done==
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php