@@ -72,6 +72,7 @@ zend_class_entry *dom_namespace_node_class_entry;
7272/* }}} */
7373
7474zend_object_handlers dom_object_handlers ;
75+ zend_object_handlers dom_nnodemap_object_handlers ;
7576
7677static HashTable classes ;
7778/* {{{ prop handler tables */
@@ -668,6 +669,10 @@ PHP_MINIT_FUNCTION(dom)
668669 dom_object_handlers .has_property = dom_property_exists ;
669670 dom_object_handlers .get_debug_info = dom_get_debug_info ;
670671
672+ memcpy (& dom_nnodemap_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
673+ dom_nnodemap_object_handlers .read_dimension = dom_nodelist_read_dimension ;
674+ dom_nnodemap_object_handlers .has_dimension = dom_nodelist_has_dimension ;
675+
671676 zend_hash_init (& classes , 0 , NULL , NULL , 1 );
672677
673678 INIT_CLASS_ENTRY (ce , "DOMException" , php_dom_domexception_class_functions );
@@ -1297,7 +1302,7 @@ zend_object_value dom_nnodemap_objects_new(zend_class_entry *class_type TSRMLS_D
12971302
12981303 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 );
12991304 intern -> handle = retval .handle ;
1300- retval .handlers = dom_get_obj_handlers ( TSRMLS_C ) ;
1305+ retval .handlers = & dom_nnodemap_object_handlers ;
13011306
13021307 return retval ;
13031308}
@@ -1674,6 +1679,83 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
16741679}
16751680/* }}} end dom_get_nsdecl */
16761681
1682+ static int dom_nodelist_fetch_dimension (xmlNodePtr * itemnode , zval * offset , dom_nnodemap_object * objmap , zval * rv TSRMLS_DC ) /* {{{ */
1683+ {
1684+ convert_to_long (offset );
1685+ long index = Z_LVAL_P (offset );
1686+ HashTable * nodeht ;
1687+ zval * * entry ;
1688+ int ret = 0 ;
1689+
1690+ if (objmap -> ht ) {
1691+ * itemnode = dom_nodelist_xml_item (objmap , index );
1692+ } else {
1693+ if (objmap -> nodetype == DOM_NODESET ) {
1694+ nodeht = HASH_OF (objmap -> baseobjptr );
1695+ if (zend_hash_index_find (nodeht , index , (void * * ) & entry ) == SUCCESS ) {
1696+ if (itemnode != NULL && rv != NULL ) {
1697+ /* Passed by read_dimension */
1698+ MAKE_COPY_ZVAL (entry , rv );
1699+ }
1700+ ret = 1 ;
1701+ }
1702+ } else if (objmap -> baseobj ) {
1703+ if (itemnode == NULL && rv == NULL ) {
1704+ /* Passed by has_dimension */
1705+ if (dom_nodelist_baseobj_item (objmap , index )) {
1706+ ret = 1 ;
1707+ }
1708+ } else {
1709+ * itemnode = dom_nodelist_baseobj_item (objmap , index );
1710+ }
1711+ }
1712+ }
1713+
1714+ if (rv != NULL && itemnode != NULL ) {
1715+ if (* itemnode ) {
1716+ ret = 1 ;
1717+ }
1718+ }
1719+
1720+ return ret ;
1721+ } /* }}} end dom_nodelist_fetch_dimension */
1722+
1723+ zval * dom_nodelist_read_dimension (zval * object , zval * offset , int type TSRMLS_DC ) /* {{{ */
1724+ {
1725+ dom_object * intern ;
1726+ xmlNodePtr itemnode = NULL ;
1727+ dom_nnodemap_object * objmap ;
1728+ zval * rv ;
1729+ int found ;
1730+
1731+ ALLOC_INIT_ZVAL (rv );
1732+
1733+ intern = (dom_object * ) zend_object_store_get_object (object TSRMLS_CC );
1734+
1735+ objmap = (dom_nnodemap_object * )intern -> ptr ;
1736+
1737+ if (dom_nodelist_fetch_dimension (& itemnode , offset , objmap , rv TSRMLS_CC )) {
1738+ if (itemnode ) {
1739+ php_dom_create_object (itemnode , & found , rv , objmap -> baseobj TSRMLS_CC );
1740+ }
1741+ }
1742+
1743+ Z_DELREF_P (rv );
1744+
1745+ return rv ;
1746+ } /* }}} end dom_nodelist_read_dimension */
1747+
1748+ int dom_nodelist_has_dimension (zval * object , zval * member , int check_empty TSRMLS_DC )
1749+ {
1750+ dom_object * intern ;
1751+ dom_nnodemap_object * objmap ;
1752+
1753+ intern = (dom_object * ) zend_object_store_get_object (object TSRMLS_CC );
1754+ objmap = (dom_nnodemap_object * )intern -> ptr ;
1755+
1756+ return dom_nodelist_fetch_dimension (NULL , member , objmap , NULL TSRMLS_CC );
1757+ } /* }}} end dom_nodelist_has_dimension */
1758+
16771759#endif /* HAVE_DOM */
16781760
16791761/*
0 commit comments