]> granicus.if.org Git - php/commitdiff
- Really allow SXE being shared by not using anything from it directly in SPL
authorMarcus Boerger <helly@php.net>
Mon, 3 Oct 2005 16:04:50 +0000 (16:04 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 3 Oct 2005 16:04:50 +0000 (16:04 +0000)
ext/simplexml/php_simplexml_exports.h
ext/simplexml/simplexml.c
ext/spl/spl_sxe.c

index 0b296df54e35ed7bebcbcf06b3424ec250493371..db97da074e1c3c9993986f42ab091f35e12b15a3 100755 (executable)
@@ -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 */
 
 /**
index 2338c4f7d632b2c6ac4ac4d28a99672e7fdfbfeb..f4318c6c6d75cace3cdbea421dd2b8b61131c662 100644 (file)
@@ -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;
index 3f5ff4fa8c2fe7ff5c9f990bf024b92fc08202a4..f4c7f7b13fe40f1acdf934f7fb13a3ae84cfd96c 100755 (executable)
@@ -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;