Skip to content

Commit b784ed0

Browse files
committed
[wip] getDescendantNamespaces
1 parent 2da5d10 commit b784ed0

File tree

3 files changed

+65
-18
lines changed

3 files changed

+65
-18
lines changed

ext/dom/element.c

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
18121852
PHP_METHOD(DOM_Element, rename)
18131853
{
18141854
zend_string *namespace_uri, *qualified_name;

ext/dom/php_dom.stub.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,6 +1379,9 @@ public function replaceChildren(Node|string ...$nodes): void {}
13791379
/** @return list<NamespaceInfo> */
13801380
public function getInScopeNamespaces(): array {}
13811381

1382+
/** @return list<NamespaceInfo> */
1383+
public function getDescendantNamespaces(): array {}
1384+
13821385
public function rename(?string $namespaceURI, string $qualifiedName): void {}
13831386
}
13841387

ext/dom/php_dom_arginfo.h

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)