Skip to content

Commit 3e1eadf

Browse files
committed
Move common code, update internals upgrading note with the new functions
1 parent 737f8be commit 3e1eadf

File tree

7 files changed

+34
-36
lines changed

7 files changed

+34
-36
lines changed

UPGRADING.INTERNALS

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,15 @@ PHP 8.3 INTERNALS UPGRADE NOTES
125125
This means that the length and the last requested item are not recalculated
126126
when the node list is iterated over multiple times.
127127
If you do not use the internal PHP dom APIs to modify the document, you need to
128-
manually invalidate the cache using php_dom_invalidate_node_list_cache().
128+
manually invalidate the cache using php_libxml_invalidate_node_list_cache_from_doc().
129+
Furthermore, the following internal APIs were added to handle the cache:
130+
. php_dom_is_cache_tag_stale_from_doc_ptr()
131+
. php_dom_is_cache_tag_stale_from_node()
132+
. php_dom_mark_cache_tag_up_to_date_from_node()
133+
134+
g. ext/libxml
135+
- Two new functions: php_libxml_invalidate_node_list_cache_from_doc() and
136+
php_libxml_invalidate_node_list_cache() were added to invalidate the cache of a node list.
129137

130138
========================
131139
4. OpCode changes

ext/dom/document.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ PHP_METHOD(DOMDocument, importNode)
847847
}
848848
}
849849

850-
php_dom_invalidate_node_list_cache(docp);
850+
php_libxml_invalidate_node_list_cache_from_doc(docp);
851851

852852
DOM_RET_OBJ((xmlNodePtr) retnodep, &ret, intern);
853853
}
@@ -1072,7 +1072,7 @@ PHP_METHOD(DOMDocument, normalizeDocument)
10721072

10731073
DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
10741074

1075-
php_dom_invalidate_node_list_cache(docp);
1075+
php_libxml_invalidate_node_list_cache_from_doc(docp);
10761076

10771077
dom_normalize((xmlNodePtr) docp);
10781078
}
@@ -1577,7 +1577,7 @@ PHP_METHOD(DOMDocument, xinclude)
15771577
php_dom_remove_xinclude_nodes(root);
15781578
}
15791579

1580-
php_dom_invalidate_node_list_cache(docp);
1580+
php_libxml_invalidate_node_list_cache_from_doc(docp);
15811581

15821582
if (err) {
15831583
RETVAL_LONG(err);

ext/dom/node.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ int dom_node_text_content_write(dom_object *obj, zval *newval)
769769
return FAILURE;
770770
}
771771

772-
php_dom_invalidate_node_list_cache(nodep->doc);
772+
php_libxml_invalidate_node_list_cache_from_doc(nodep->doc);
773773

774774
const xmlChar *xmlChars = (const xmlChar *) ZSTR_VAL(str);
775775
int type = nodep->type;
@@ -899,7 +899,7 @@ PHP_METHOD(DOMNode, insertBefore)
899899
php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
900900
}
901901

902-
php_dom_invalidate_node_list_cache(parentp->doc);
902+
php_libxml_invalidate_node_list_cache_from_doc(parentp->doc);
903903

904904
if (ref != NULL) {
905905
DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj);
@@ -1090,7 +1090,7 @@ PHP_METHOD(DOMNode, replaceChild)
10901090
nodep->doc->intSubset = (xmlDtd *) newchild;
10911091
}
10921092
}
1093-
php_dom_invalidate_node_list_cache(nodep->doc);
1093+
php_libxml_invalidate_node_list_cache_from_doc(nodep->doc);
10941094
DOM_RET_OBJ(oldchild, &ret, intern);
10951095
}
10961096
/* }}} end dom_node_replace_child */
@@ -1132,7 +1132,7 @@ PHP_METHOD(DOMNode, removeChild)
11321132
}
11331133

11341134
xmlUnlinkNode(child);
1135-
php_dom_invalidate_node_list_cache(nodep->doc);
1135+
php_libxml_invalidate_node_list_cache_from_doc(nodep->doc);
11361136
DOM_RET_OBJ(child, &ret, intern);
11371137
}
11381138
/* }}} end dom_node_remove_child */
@@ -1236,7 +1236,7 @@ PHP_METHOD(DOMNode, appendChild)
12361236

12371237
dom_reconcile_ns(nodep->doc, new_child);
12381238

1239-
php_dom_invalidate_node_list_cache(nodep->doc);
1239+
php_libxml_invalidate_node_list_cache_from_doc(nodep->doc);
12401240

12411241
DOM_RET_OBJ(new_child, &ret, intern);
12421242
}
@@ -1347,7 +1347,7 @@ PHP_METHOD(DOMNode, normalize)
13471347

13481348
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
13491349

1350-
php_dom_invalidate_node_list_cache(nodep->doc);
1350+
php_libxml_invalidate_node_list_cache_from_doc(nodep->doc);
13511351

13521352
dom_normalize(nodep);
13531353

@@ -1581,7 +1581,7 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{
15811581
RETURN_THROWS();
15821582
}
15831583

1584-
php_dom_invalidate_node_list_cache(docp);
1584+
php_libxml_invalidate_node_list_cache_from_doc(docp);
15851585

15861586
if (xpath_array == NULL) {
15871587
if (nodep->type != XML_DOCUMENT_NODE) {

ext/dom/parentnode.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void dom_parent_node_append(dom_object *context, zval *nodes, int nodesc)
280280
return;
281281
}
282282

283-
php_dom_invalidate_node_list_cache(parentNode->doc);
283+
php_libxml_invalidate_node_list_cache_from_doc(parentNode->doc);
284284

285285
xmlNode *fragment = dom_zvals_to_fragment(context->document, parentNode, nodes, nodesc);
286286

@@ -324,7 +324,7 @@ void dom_parent_node_prepend(dom_object *context, zval *nodes, int nodesc)
324324
return;
325325
}
326326

327-
php_dom_invalidate_node_list_cache(parentNode->doc);
327+
php_libxml_invalidate_node_list_cache_from_doc(parentNode->doc);
328328

329329
xmlNodePtr newchild, nextsib;
330330
xmlNode *fragment = dom_zvals_to_fragment(context->document, parentNode, nodes, nodesc);
@@ -406,7 +406,7 @@ void dom_parent_node_after(dom_object *context, zval *nodes, int nodesc)
406406

407407
doc = prevsib->doc;
408408

409-
php_dom_invalidate_node_list_cache(doc);
409+
php_libxml_invalidate_node_list_cache_from_doc(doc);
410410

411411
/* Spec step 4: convert nodes into fragment */
412412
fragment = dom_zvals_to_fragment(context->document, parentNode, nodes, nodesc);
@@ -457,7 +457,7 @@ void dom_parent_node_before(dom_object *context, zval *nodes, int nodesc)
457457

458458
doc = nextsib->doc;
459459

460-
php_dom_invalidate_node_list_cache(doc);
460+
php_libxml_invalidate_node_list_cache_from_doc(doc);
461461

462462
/* Spec step 4: convert nodes into fragment */
463463
fragment = dom_zvals_to_fragment(context->document, parentNode, nodes, nodesc);
@@ -514,7 +514,7 @@ void dom_child_node_remove(dom_object *context)
514514
return;
515515
}
516516

517-
php_dom_invalidate_node_list_cache(context->document->ptr);
517+
php_libxml_invalidate_node_list_cache_from_doc(context->document->ptr);
518518

519519
while (children) {
520520
if (children == child) {

ext/dom/php_dom.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,6 @@ void dom_child_node_remove(dom_object *context);
158158
#define DOM_NODELIST 0
159159
#define DOM_NAMEDNODEMAP 1
160160

161-
static zend_always_inline void php_dom_invalidate_node_list_cache(xmlDocPtr docp)
162-
{
163-
if (docp && docp->_private) { /* not all elements have an associated document (e.g. invalid hierarchy) */
164-
php_libxml_invalidate_node_list_cache(docp->_private);
165-
}
166-
}
167-
168161
static zend_always_inline bool php_dom_is_cache_tag_stale_from_doc_ptr(const php_libxml_cache_tag *cache_tag, const php_libxml_doc_ptr *doc_ptr)
169162
{
170163
ZEND_ASSERT(cache_tag != NULL);

ext/libxml/php_libxml.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ static zend_always_inline void php_libxml_invalidate_node_list_cache(php_libxml_
105105
#endif
106106
}
107107

108+
static zend_always_inline void php_libxml_invalidate_node_list_cache_from_doc(xmlDocPtr docp)
109+
{
110+
if (docp && docp->_private) { /* docp is NULL for detached nodes */
111+
php_libxml_invalidate_node_list_cache(docp->_private);
112+
}
113+
}
114+
108115
#define Z_LIBXML_NODE_P(zv) php_libxml_node_fetch_object(Z_OBJ_P((zv)))
109116

110117
typedef void * (*php_libxml_export_node) (zval *object);

ext/simplexml/simplexml.c

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ PHP_SXE_API zend_class_entry *sxe_get_element_class_entry(void) /* {{{ */
4343
}
4444
/* }}} */
4545

46-
/* Similar to php_dom_invalidate_node_list_cache(), but SimpleXML shouldn't depend on ext/dom. */
47-
static zend_always_inline void php_sxe_invalidate_node_list_cache(xmlNodePtr node)
48-
{
49-
ZEND_ASSERT(node != NULL);
50-
xmlDocPtr docp = node->doc;
51-
if (docp && docp->_private) {
52-
php_libxml_invalidate_node_list_cache(docp->_private);
53-
}
54-
}
55-
5646
static php_sxe_object* php_sxe_object_new(zend_class_entry *ce, zend_function *fptr_count);
5747
static xmlNodePtr php_sxe_reset_iterator(php_sxe_object *sxe, int use_data);
5848
static xmlNodePtr php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node, int use_data);
@@ -452,7 +442,7 @@ static zval *sxe_prop_dim_write(zend_object *object, zval *member, zval *value,
452442

453443
GET_NODE(sxe, node);
454444

455-
php_sxe_invalidate_node_list_cache(node);
445+
php_libxml_invalidate_node_list_cache_from_doc(node->doc);
456446

457447
if (sxe->iter.type == SXE_ITER_ATTRLIST) {
458448
attribs = 1;
@@ -825,7 +815,7 @@ static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements
825815

826816
GET_NODE(sxe, node);
827817

828-
php_sxe_invalidate_node_list_cache(node);
818+
php_libxml_invalidate_node_list_cache_from_doc(node->doc);
829819

830820
if (Z_TYPE_P(member) == IS_LONG) {
831821
if (sxe->iter.type != SXE_ITER_ATTRLIST) {
@@ -1700,7 +1690,7 @@ PHP_METHOD(SimpleXMLElement, addChild)
17001690
sxe = Z_SXEOBJ_P(ZEND_THIS);
17011691
GET_NODE(sxe, node);
17021692

1703-
php_sxe_invalidate_node_list_cache(node);
1693+
php_libxml_invalidate_node_list_cache_from_doc(node->doc);
17041694

17051695
if (sxe->iter.type == SXE_ITER_ATTRLIST) {
17061696
php_error_docref(NULL, E_WARNING, "Cannot add element to attributes");

0 commit comments

Comments
 (0)