]> granicus.if.org Git - php/commitdiff
add dtor to cleanup iterator related data
authorRob Richards <rrichards@php.net>
Tue, 17 Feb 2004 19:57:48 +0000 (19:57 +0000)
committerRob Richards <rrichards@php.net>
Tue, 17 Feb 2004 19:57:48 +0000 (19:57 +0000)
ext/dom/php_dom.c

index 137dd2c0442dd53a479330ec83a17b0d5d9a6cc9..30bd8b818e0c0cb5f5c0df7cc991c7e5db962391 100644 (file)
@@ -879,14 +879,15 @@ zend_object_value dom_xpath_objects_new(zend_class_entry *class_type TSRMLS_DC)
 /* }}} */
 #endif
 
-void dom_nnodemap_objects_free_storage(void *object TSRMLS_DC)
+static void dom_nnodemap_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
 {
-       dom_nnodemap_object *objmap;
        zval *baseobj;
-       dom_object *intern = (dom_object *)object;
+       dom_object *intern;
+       dom_nnodemap_object *objmap;
 
-       php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
+       intern = (dom_object *)object;
        objmap = (dom_nnodemap_object *)intern->ptr;
+
        if (objmap) {
                if (objmap->local) {
                        xmlFree(objmap->local);
@@ -899,8 +900,18 @@ void dom_nnodemap_objects_free_storage(void *object TSRMLS_DC)
                        zval_ptr_dtor((zval **)&baseobj);
                }
                efree(objmap);
+               intern->ptr = NULL;
        }
 
+
+}
+
+void dom_nnodemap_objects_free_storage(void *object TSRMLS_DC)
+{
+       dom_object *intern = (dom_object *)object;
+
+       php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
+
        zend_hash_destroy(intern->std.properties);
        FREE_HASHTABLE(intern->std.properties);
 
@@ -923,7 +934,7 @@ zend_object_value dom_nnodemap_objects_new(zend_class_entry *class_type TSRMLS_D
        objmap->local = NULL;
        objmap->ns = NULL;
 
-       retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t)dom_nnodemap_objects_free_storage, dom_objects_clone TSRMLS_CC);
+       retval.handle = zend_objects_store_put(intern, dom_nnodemap_object_dtor, (zend_objects_free_object_storage_t)dom_nnodemap_objects_free_storage, dom_objects_clone TSRMLS_CC);
        intern->handle = retval.handle;
        retval.handlers = &dom_object_handlers;