Skip to content

Commit 4546f48

Browse files
committed
Don't use the obj_map cache for attributes
Doing so will cause inconsistencies. This was revealed to be inconsistent after decoupling the nodemap and nodelist code.
1 parent ff0a2cf commit 4546f48

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

ext/dom/obj_map.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,24 @@ static xmlNodePtr dom_map_get_attr_start(xmlNodePtr node)
204204
return (xmlNodePtr) node->properties;
205205
}
206206

207-
static void dom_map_get_chain_item(dom_nnodemap_object *map, zend_long index, zval *return_value, xmlNodePtr (*get_start)(xmlNodePtr))
207+
static void dom_map_get_attributes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
208+
{
209+
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
210+
xmlNodePtr itemnode = NULL;
211+
if (nodep && index >= 0) {
212+
itemnode = dom_map_get_attr_start(nodep);
213+
for (; index > 0 && itemnode; itemnode = itemnode->next, index--);
214+
}
215+
dom_ret_node_to_zobj(map, itemnode, return_value);
216+
}
217+
218+
static void dom_map_get_nodes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
208219
{
209220
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
210221
xmlNodePtr itemnode = NULL;
211222
if (nodep && index >= 0) {
212223
dom_node_idx_pair start_point = dom_obj_map_get_start_point(map, nodep, index);
213-
itemnode = start_point.node ? start_point.node : get_start(nodep);
224+
itemnode = start_point.node ? start_point.node : dom_nodelist_iter_start_first_child(nodep);
214225
for (; start_point.index > 0 && itemnode; itemnode = itemnode->next, start_point.index--);
215226
}
216227
dom_ret_node_to_zobj(map, itemnode, return_value);
@@ -219,16 +230,6 @@ static void dom_map_get_chain_item(dom_nnodemap_object *map, zend_long index, zv
219230
}
220231
}
221232

222-
static void dom_map_get_attributes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
223-
{
224-
dom_map_get_chain_item(map, index, return_value, dom_map_get_attr_start);
225-
}
226-
227-
static void dom_map_get_nodes_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
228-
{
229-
dom_map_get_chain_item(map, index, return_value, dom_nodelist_iter_start_first_child);
230-
}
231-
232233
static void dom_map_get_by_tag_name_item(dom_nnodemap_object *map, zend_long index, zval *return_value)
233234
{
234235
xmlNodePtr nodep = dom_object_get_node(map->baseobj);
@@ -352,7 +353,7 @@ const php_dom_obj_map_handler php_dom_obj_map_attributes = {
352353
.get_item = dom_map_get_attributes_item,
353354
.get_named_item = dom_map_get_named_item_prop,
354355
.has_named_item = dom_map_has_named_item_prop,
355-
.use_cache = true,
356+
.use_cache = false,
356357
.nameless = false,
357358
};
358359

0 commit comments

Comments
 (0)