@@ -1742,20 +1742,8 @@ zend_result dom_modern_element_substituted_node_value_write(dom_object *obj, zva
1742
1742
return SUCCESS ;
1743
1743
}
1744
1744
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 )
1746
1746
{
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
-
1759
1747
HashTable prefix_to_ns_table ;
1760
1748
zend_hash_init (& prefix_to_ns_table , 0 , NULL , NULL , false);
1761
1749
zend_hash_real_init_mixed (& prefix_to_ns_table );
@@ -1775,8 +1763,6 @@ PHP_METHOD(DOM_Element, getInScopeNamespaces)
1775
1763
}
1776
1764
}
1777
1765
1778
- array_init_size (return_value , zend_hash_num_elements (& prefix_to_ns_table ));
1779
-
1780
1766
xmlNsPtr ns ;
1781
1767
zend_string * prefix ;
1782
1768
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& prefix_to_ns_table , prefix , ns ) {
@@ -1801,14 +1787,68 @@ PHP_METHOD(DOM_Element, getInScopeNamespaces)
1801
1787
ZVAL_NULL (OBJ_PROP_NUM (obj , 1 ));
1802
1788
}
1803
1789
1804
- ZVAL_OBJ_COPY ( OBJ_PROP_NUM (obj , 2 ), & intern -> std );
1790
+ php_dom_create_object ( nodep , OBJ_PROP_NUM (obj , 2 ), intern );
1805
1791
1806
- zend_hash_next_index_insert_new (Z_ARRVAL_P ( return_value ) , & zv );
1792
+ zend_hash_next_index_insert_new (result , & zv );
1807
1793
} ZEND_HASH_FOREACH_END ();
1808
1794
1809
1795
zend_hash_destroy (& prefix_to_ns_table );
1810
1796
}
1811
1797
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
+
1812
1852
PHP_METHOD (DOM_Element , rename )
1813
1853
{
1814
1854
zend_string * namespace_uri , * qualified_name ;
0 commit comments