From: Marcus Boerger Date: Mon, 3 Oct 2005 16:04:50 +0000 (+0000) Subject: - Really allow SXE being shared by not using anything from it directly in SPL X-Git-Tag: RELEASE_0_9_0~25 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0674235e3c97d5ba2ca9131ea1adc51b9b50fbe;p=php - Really allow SXE being shared by not using anything from it directly in SPL --- diff --git a/ext/simplexml/php_simplexml_exports.h b/ext/simplexml/php_simplexml_exports.h index 0b296df54e..db97da074e 100755 --- a/ext/simplexml/php_simplexml_exports.h +++ b/ext/simplexml/php_simplexml_exports.h @@ -52,6 +52,11 @@ php_sxe_fetch_object(zval *object TSRMLS_DC) ZEND_API void php_sxe_reset_iterator(php_sxe_object *sxe TSRMLS_DC); ZEND_API void php_sxe_move_forward_iterator(php_sxe_object *sxe TSRMLS_DC); +typedef struct { + zend_object_iterator intern; + php_sxe_object *sxe; +} php_sxe_iterator; + #endif /* PHP_SIMPLEXML_EXPORTS_H */ /** diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 2338c4f7d6..f4318c6c6d 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1401,11 +1401,6 @@ SXE_METHOD(__construct) /* }}} */ -typedef struct { - zend_object_iterator intern; - php_sxe_object *sxe; -} php_sxe_iterator; - static void php_sxe_iterator_dtor(zend_object_iterator *iter TSRMLS_DC); static int php_sxe_iterator_valid(zend_object_iterator *iter TSRMLS_DC); static void php_sxe_iterator_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC); @@ -1731,6 +1726,7 @@ PHP_MINIT_FUNCTION(simplexml) sxe.create_object = sxe_object_new; sxe_class_entry = zend_register_internal_class(&sxe TSRMLS_CC); sxe_class_entry->get_iterator = php_sxe_get_iterator; + sxe_class_entry->iterator_funcs.funcs = &php_sxe_iterator_funcs; zend_class_implements(sxe_class_entry TSRMLS_CC, 1, zend_ce_traversable); sxe_object_handlers.get_method = zend_get_std_object_handlers()->get_method; sxe_object_handlers.get_constructor = zend_get_std_object_handlers()->get_constructor; diff --git a/ext/spl/spl_sxe.c b/ext/spl/spl_sxe.c index 3f5ff4fa8c..f4c7f7b13f 100755 --- a/ext/spl/spl_sxe.c +++ b/ext/spl/spl_sxe.c @@ -34,6 +34,7 @@ #include "spl_sxe.h" zend_class_entry *spl_ce_SimpleXMLIterator = NULL; +zend_class_entry *spl_ce_SimpleXMLElement; #if HAVE_LIBXML && HAVE_SIMPLEXML @@ -41,9 +42,10 @@ zend_class_entry *spl_ce_SimpleXMLIterator = NULL; SPL_METHOD(SimpleXMLIterator, rewind) /* {{{ */ { - php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + php_sxe_iterator iter; - php_sxe_reset_iterator(sxe TSRMLS_CC); + iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + spl_ce_SimpleXMLElement->iterator_funcs.funcs->rewind((zend_object_iterator*)&iter TSRMLS_CC); } /* }}} */ @@ -89,9 +91,10 @@ SPL_METHOD(SimpleXMLIterator, key) /* {{{ */ SPL_METHOD(SimpleXMLIterator, next) /* {{{ */ { - php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + php_sxe_iterator iter; - php_sxe_move_forward_iterator(sxe TSRMLS_CC); + iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + spl_ce_SimpleXMLElement->iterator_funcs.funcs->move_forward((zend_object_iterator*)&iter TSRMLS_CC); } /* }}} */ @@ -146,16 +149,17 @@ static zend_function_entry spl_funcs_SimpleXMLIterator[] = { SPL_API PHP_MINIT_FUNCTION(spl_sxe) /* {{{ */ { - zend_class_entry **pce, *spl_ce_SimpleXMLElement; + zend_class_entry **pce; if (zend_hash_find(CG(class_table), "simplexmlelement", sizeof("SimpleXMLElement"), (void **) &pce) == FAILURE) { + spl_ce_SimpleXMLElement = NULL; spl_ce_SimpleXMLIterator = NULL; return SUCCESS; /* SimpleXML must be initialized before */ } spl_ce_SimpleXMLElement = *pce; - REGISTER_SPL_SUB_CLASS_EX(SimpleXMLIterator, SimpleXMLElement, sxe_object_new, spl_funcs_SimpleXMLIterator); + REGISTER_SPL_SUB_CLASS_EX(SimpleXMLIterator, SimpleXMLElement, spl_ce_SimpleXMLElement->create_object, spl_funcs_SimpleXMLIterator); REGISTER_SPL_IMPLEMENTS(SimpleXMLIterator, RecursiveIterator); return SUCCESS;