Skip to content

Commit 9b6df10

Browse files
authored
Don't use the obj_map cache for attributes (#18895)
1 parent 479e9be commit 9b6df10

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

ext/dom/obj_map.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,25 @@ static void dom_map_cache_obj(dom_nnodemap_object *map, xmlNodePtr itemnode, zen
196196
map->cached_obj = cached_obj;
197197
}
198198

199-
static xmlNodePtr dom_map_get_attr_start(xmlNodePtr node)
199+
static void dom_map_get_attributes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
200200
{
201-
ZEND_ASSERT(node->type == XML_ELEMENT_NODE);
202-
return (xmlNodePtr) node->properties;
201+
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
202+
xmlNodePtr itemnode = NULL;
203+
if (nodep && index >= 0) {
204+
ZEND_ASSERT(nodep->type == XML_ELEMENT_NODE);
205+
itemnode = (xmlNodePtr) nodep->properties;
206+
for (; index > 0 && itemnode; itemnode = itemnode->next, index--);
207+
}
208+
dom_ret_node_to_zobj(map, itemnode, return_value);
203209
}
204210

205-
static void dom_map_get_chain_item(dom_nnodemap_object *map, zend_long index, zval *return_value, xmlNodePtr (*get_start)(xmlNodePtr))
211+
static void dom_map_get_nodes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
206212
{
207213
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
208214
xmlNodePtr itemnode = NULL;
209215
if (nodep && index >= 0) {
210216
dom_node_idx_pair start_point = dom_obj_map_get_start_point(map, nodep, index);
211-
itemnode = start_point.node ? start_point.node : get_start(nodep);
217+
itemnode = start_point.node ? start_point.node : dom_nodelist_iter_start_first_child(nodep);
212218
for (; start_point.index > 0 && itemnode; itemnode = itemnode->next, start_point.index--);
213219
}
214220
dom_ret_node_to_zobj(map, itemnode, return_value);
@@ -217,16 +223,6 @@ static void dom_map_get_chain_item(dom_nnodemap_object *map, zend_long index, zv
217223
}
218224
}
219225

220-
static void dom_map_get_attributes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
221-
{
222-
dom_map_get_chain_item(map, index, return_value, dom_map_get_attr_start);
223-
}
224-
225-
static void dom_map_get_nodes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
226-
{
227-
dom_map_get_chain_item(map, index, return_value, dom_nodelist_iter_start_first_child);
228-
}
229-
230226
static void dom_map_get_by_tag_name_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
231227
{
232228
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
@@ -411,7 +407,7 @@ const php_dom_obj_map_handler php_dom_obj_map_attributes = {
411407
.get_item = dom_map_get_attributes_item,
412408
.get_named_item = dom_map_get_named_item_prop,
413409
.has_named_item = dom_map_has_named_item_prop,
414-
.use_cache = true,
410+
.use_cache = false,
415411
.nameless = false,
416412
};
417413

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Attribute named node map cache
3+
--EXTENSIONS--
4+
dom
5+
--FILE--
6+
<?php
7+
8+
$dom = Dom\XMLDocument::createFromString('<root a="1" b="2" c="3"/>');
9+
$attrs = $dom->documentElement->attributes;
10+
var_dump($attrs[1]->nodeName);
11+
$dom->documentElement->removeAttribute('b');
12+
var_dump($attrs[1]->nodeName);
13+
14+
?>
15+
--EXPECT--
16+
string(1) "b"
17+
string(1) "c"

0 commit comments

Comments
 (0)