@@ -1742,20 +1742,8 @@ zend_result dom_modern_element_substituted_node_value_write(dom_object *obj, zva
17421742 return SUCCESS ;
17431743}
17441744
1745- PHP_METHOD ( DOM_Element , getInScopeNamespaces )
1745+ static void dom_element_get_in_scope_namespace_info ( php_dom_libxml_ns_mapper * ns_mapper , HashTable * result , xmlNodePtr nodep , dom_object * intern )
17461746{
1747- zval * id ;
1748- xmlNode * nodep ;
1749- dom_object * intern ;
1750-
1751- if (zend_parse_parameters_none () != SUCCESS ) {
1752- RETURN_THROWS ();
1753- }
1754-
1755- DOM_GET_THIS_OBJ (nodep , id , xmlNodePtr , intern );
1756-
1757- php_dom_libxml_ns_mapper * ns_mapper = php_dom_get_ns_mapper (intern );
1758-
17591747 HashTable prefix_to_ns_table ;
17601748 zend_hash_init (& prefix_to_ns_table , 0 , NULL , NULL , false);
17611749 zend_hash_real_init_mixed (& prefix_to_ns_table );
@@ -1775,8 +1763,6 @@ PHP_METHOD(DOM_Element, getInScopeNamespaces)
17751763 }
17761764 }
17771765
1778- array_init_size (return_value , zend_hash_num_elements (& prefix_to_ns_table ));
1779-
17801766 xmlNsPtr ns ;
17811767 zend_string * prefix ;
17821768 ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& prefix_to_ns_table , prefix , ns ) {
@@ -1801,14 +1787,68 @@ PHP_METHOD(DOM_Element, getInScopeNamespaces)
18011787 ZVAL_NULL (OBJ_PROP_NUM (obj , 1 ));
18021788 }
18031789
1804- ZVAL_OBJ_COPY ( OBJ_PROP_NUM (obj , 2 ), & intern -> std );
1790+ php_dom_create_object ( nodep , OBJ_PROP_NUM (obj , 2 ), intern );
18051791
1806- zend_hash_next_index_insert_new (Z_ARRVAL_P ( return_value ) , & zv );
1792+ zend_hash_next_index_insert_new (result , & zv );
18071793 } ZEND_HASH_FOREACH_END ();
18081794
18091795 zend_hash_destroy (& prefix_to_ns_table );
18101796}
18111797
1798+ PHP_METHOD (DOM_Element , getInScopeNamespaces )
1799+ {
1800+ zval * id ;
1801+ xmlNode * nodep ;
1802+ dom_object * intern ;
1803+
1804+ if (zend_parse_parameters_none () != SUCCESS ) {
1805+ RETURN_THROWS ();
1806+ }
1807+
1808+ DOM_GET_THIS_OBJ (nodep , id , xmlNodePtr , intern );
1809+
1810+ php_dom_libxml_ns_mapper * ns_mapper = php_dom_get_ns_mapper (intern );
1811+
1812+ array_init (return_value );
1813+ HashTable * result = Z_ARRVAL_P (return_value );
1814+
1815+ dom_element_get_in_scope_namespace_info (ns_mapper , result , nodep , intern );
1816+ }
1817+
1818+ PHP_METHOD (DOM_Element , getDescendantNamespaces )
1819+ {
1820+ zval * id ;
1821+ xmlNode * nodep ;
1822+ dom_object * intern ;
1823+
1824+ if (zend_parse_parameters_none () != SUCCESS ) {
1825+ RETURN_THROWS ();
1826+ }
1827+
1828+ DOM_GET_THIS_OBJ (nodep , id , xmlNodePtr , intern );
1829+
1830+ php_dom_libxml_ns_mapper * ns_mapper = php_dom_get_ns_mapper (intern );
1831+
1832+ array_init (return_value );
1833+ HashTable * result = Z_ARRVAL_P (return_value );
1834+
1835+ xmlNodePtr cur = nodep -> children ;
1836+ while (cur != NULL ) {
1837+ if (cur -> type == XML_ELEMENT_NODE ) {
1838+ /* TODO: this could be more optimized by updating the same HashTable repeatedly
1839+ * instead of recreating it on every node. */
1840+ dom_element_get_in_scope_namespace_info (ns_mapper , result , cur , intern );
1841+
1842+ if (cur -> children ) {
1843+ cur = cur -> children ;
1844+ continue ;
1845+ }
1846+ }
1847+
1848+ cur = php_dom_next_in_tree_order (cur , nodep );
1849+ }
1850+ }
1851+
18121852PHP_METHOD (DOM_Element , rename )
18131853{
18141854 zend_string * namespace_uri , * qualified_name ;
0 commit comments