Skip to content

Commit 4ef7539

Browse files
committed
Split off private data from the ns mapper
1 parent 85b7181 commit 4ef7539

File tree

9 files changed

+83
-56
lines changed

9 files changed

+83
-56
lines changed

ext/dom/domimplementation.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ PHP_METHOD(Dom_Implementation, createDocument)
266266

267267
xmlDocPtr document = NULL;
268268
xmlChar *localname = NULL, *prefix = NULL;
269-
php_dom_libxml_ns_mapper *ns_mapper = php_dom_libxml_ns_mapper_create();
269+
php_dom_private_data *private_data = php_dom_private_data_create();
270+
php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
270271

271272
/* 1. Let document be a new XMLDocument. */
272273
document = xmlNewDoc(BAD_CAST "1.0");
@@ -307,7 +308,7 @@ PHP_METHOD(Dom_Implementation, createDocument)
307308
NULL
308309
);
309310
dom_set_xml_class(intern->document);
310-
intern->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
311+
intern->document->private_data = php_dom_libxml_private_data_header(private_data);
311312

312313
/* 4. If doctype is non-null, append doctype to document. */
313314
if (doctype != NULL) {
@@ -337,7 +338,7 @@ PHP_METHOD(Dom_Implementation, createDocument)
337338
xmlFree(localname);
338339
xmlFree(prefix);
339340
xmlFreeDoc(document);
340-
php_dom_libxml_ns_mapper_destroy(ns_mapper);
341+
php_dom_private_data_destroy(private_data);
341342
RETURN_THROWS();
342343
}
343344
/* }}} end dom_domimplementation_create_document */
@@ -366,7 +367,8 @@ PHP_METHOD(Dom_Implementation, createHTMLDocument)
366367
/* 3. Append a new doctype, with "html" as its name and with its node document set to doc, to doc. */
367368
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", NULL, NULL);
368369

369-
php_dom_libxml_ns_mapper *ns_mapper = php_dom_libxml_ns_mapper_create();
370+
php_dom_private_data *private_data = php_dom_private_data_create();
371+
php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
370372
xmlNsPtr html_ns = php_dom_libxml_ns_mapper_ensure_html_ns(ns_mapper);
371373

372374
/* 4. Append the result of creating an element given doc, html, and the HTML namespace, to doc. */
@@ -396,7 +398,7 @@ PHP_METHOD(Dom_Implementation, createHTMLDocument)
396398
if (UNEXPECTED(dtd == NULL || html_element == NULL || head_element == NULL || (title != NULL && title_element == NULL) || body_element == NULL)) {
397399
php_dom_throw_error(INVALID_STATE_ERR, true);
398400
xmlFreeDoc(doc);
399-
php_dom_libxml_ns_mapper_destroy(ns_mapper);
401+
php_dom_private_data_destroy(private_data);
400402
RETURN_THROWS();
401403
}
402404

@@ -408,7 +410,7 @@ PHP_METHOD(Dom_Implementation, createHTMLDocument)
408410
NULL
409411
);
410412
dom_set_xml_class(intern->document);
411-
intern->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
413+
intern->document->private_data = php_dom_libxml_private_data_header(private_data);
412414
}
413415
/* }}} */
414416

ext/dom/html_document.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ PHP_METHOD(Dom_HTMLDocument, createEmpty)
757757
NULL
758758
);
759759
dom_set_xml_class(intern->document);
760-
intern->document->private_data = php_dom_libxml_ns_mapper_header(php_dom_libxml_ns_mapper_create());
760+
intern->document->private_data = php_dom_libxml_private_data_header(php_dom_private_data_create());
761761
return;
762762

763763
oom:
@@ -878,7 +878,8 @@ PHP_METHOD(Dom_HTMLDocument, createFromString)
878878
goto fail_oom;
879879
}
880880

881-
php_dom_libxml_ns_mapper *ns_mapper = php_dom_libxml_ns_mapper_create();
881+
php_dom_private_data *private_data = php_dom_private_data_create();
882+
php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
882883

883884
xmlDocPtr lxml_doc;
884885
lexbor_libxml2_bridge_status bridge_status = lexbor_libxml2_bridge_convert_document(
@@ -890,7 +891,7 @@ PHP_METHOD(Dom_HTMLDocument, createFromString)
890891
);
891892
lexbor_libxml2_bridge_copy_observations(parser->tree, &ctx.observations);
892893
if (UNEXPECTED(bridge_status != LEXBOR_LIBXML2_BRIDGE_STATUS_OK)) {
893-
php_dom_libxml_ns_mapper_destroy(ns_mapper);
894+
php_dom_private_data_destroy(private_data);
894895
php_libxml_ctx_error(
895896
NULL,
896897
"%s in %s",
@@ -918,7 +919,7 @@ PHP_METHOD(Dom_HTMLDocument, createFromString)
918919
);
919920
dom_set_xml_class(intern->document);
920921
intern->document->quirks_mode = ctx.observations.quirks_mode;
921-
intern->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
922+
intern->document->private_data = php_dom_libxml_private_data_header(private_data);
922923
return;
923924

924925
fail_oom:
@@ -930,7 +931,7 @@ PHP_METHOD(Dom_HTMLDocument, createFromString)
930931
PHP_METHOD(Dom_HTMLDocument, createFromFile)
931932
{
932933
const char *filename, *override_encoding = NULL;
933-
php_dom_libxml_ns_mapper *ns_mapper = NULL;
934+
php_dom_private_data *private_data = NULL;
934935
size_t filename_len, override_encoding_len;
935936
zend_long options = 0;
936937
php_stream *stream = NULL;
@@ -1069,7 +1070,8 @@ PHP_METHOD(Dom_HTMLDocument, createFromFile)
10691070
goto fail_oom;
10701071
}
10711072

1072-
ns_mapper = php_dom_libxml_ns_mapper_create();
1073+
private_data = php_dom_private_data_create();
1074+
php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
10731075

10741076
xmlDocPtr lxml_doc;
10751077
lexbor_libxml2_bridge_status bridge_status = lexbor_libxml2_bridge_convert_document(
@@ -1139,14 +1141,14 @@ PHP_METHOD(Dom_HTMLDocument, createFromFile)
11391141
);
11401142
dom_set_xml_class(intern->document);
11411143
intern->document->quirks_mode = ctx.observations.quirks_mode;
1142-
intern->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
1144+
intern->document->private_data = php_dom_libxml_private_data_header(private_data);
11431145
return;
11441146

11451147
fail_oom:
11461148
php_dom_throw_error(INVALID_STATE_ERR, true);
11471149
fail_general:
1148-
if (ns_mapper != NULL) {
1149-
php_dom_libxml_ns_mapper_destroy(ns_mapper);
1150+
if (private_data != NULL) {
1151+
php_dom_private_data_destroy(private_data);
11501152
}
11511153
lxb_html_document_destroy(document);
11521154
php_stream_close(stream);

ext/dom/namespace_compat.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@ PHP_DOM_EXPORT const php_dom_ns_magic_token *php_dom_ns_is_xml_magic_token = (co
3232
PHP_DOM_EXPORT const php_dom_ns_magic_token *php_dom_ns_is_xmlns_magic_token = (const php_dom_ns_magic_token *) DOM_XMLNS_NS_URI;
3333

3434
struct php_dom_libxml_ns_mapper {
35-
php_libxml_private_data_header header;
3635
/* This is used almost all the time for HTML documents, so it makes sense to cache this. */
3736
xmlNsPtr html_ns;
3837
/* Used for every prefixless namespace declaration in XML, so also very common. */
3938
xmlNsPtr prefixless_xmlns_ns;
4039
HashTable uri_to_prefix_map;
4140
};
4241

42+
typedef struct php_dom_private_data {
43+
php_libxml_private_data_header header;
44+
struct php_dom_libxml_ns_mapper ns_mapper;
45+
} php_dom_private_data;
46+
4347
static void php_dom_libxml_ns_mapper_prefix_map_element_dtor(zval *zv)
4448
{
4549
if (DOM_Z_IS_OWNED(zv)) {
@@ -69,25 +73,25 @@ static HashTable *php_dom_libxml_ns_mapper_ensure_prefix_map(php_dom_libxml_ns_m
6973
return prefix_map;
7074
}
7175

72-
static void php_dom_libxml_ns_mapper_header_destroy(php_libxml_private_data_header *header)
76+
static void php_dom_libxml_private_data_destroy(php_libxml_private_data_header *header)
7377
{
74-
php_dom_libxml_ns_mapper_destroy((php_dom_libxml_ns_mapper *) header);
78+
php_dom_private_data_destroy((php_dom_private_data *) header);
7579
}
7680

77-
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_libxml_ns_mapper_create(void)
81+
PHP_DOM_EXPORT php_dom_private_data *php_dom_private_data_create(void)
7882
{
79-
php_dom_libxml_ns_mapper *mapper = emalloc(sizeof(*mapper));
80-
mapper->header.dtor = php_dom_libxml_ns_mapper_header_destroy;
81-
mapper->html_ns = NULL;
82-
mapper->prefixless_xmlns_ns = NULL;
83-
zend_hash_init(&mapper->uri_to_prefix_map, 0, NULL, ZVAL_PTR_DTOR, false);
83+
php_dom_private_data *mapper = emalloc(sizeof(*mapper));
84+
mapper->header.dtor = php_dom_libxml_private_data_destroy;
85+
mapper->ns_mapper.html_ns = NULL;
86+
mapper->ns_mapper.prefixless_xmlns_ns = NULL;
87+
zend_hash_init(&mapper->ns_mapper.uri_to_prefix_map, 0, NULL, ZVAL_PTR_DTOR, false);
8488
return mapper;
8589
}
8690

87-
void php_dom_libxml_ns_mapper_destroy(php_dom_libxml_ns_mapper *mapper)
91+
void php_dom_private_data_destroy(php_dom_private_data *data)
8892
{
89-
zend_hash_destroy(&mapper->uri_to_prefix_map);
90-
efree(mapper);
93+
zend_hash_destroy(&data->ns_mapper.uri_to_prefix_map);
94+
efree(data);
9195
}
9296

9397
static xmlNsPtr php_dom_libxml_ns_mapper_ensure_cached_ns(php_dom_libxml_ns_mapper *mapper, xmlNsPtr *ptr, const char *uri, size_t length, const php_dom_ns_magic_token *token)
@@ -229,9 +233,19 @@ static xmlNsPtr php_dom_libxml_ns_mapper_store_and_normalize_parsed_ns(php_dom_l
229233
return ns;
230234
}
231235

232-
PHP_DOM_EXPORT php_libxml_private_data_header *php_dom_libxml_ns_mapper_header(php_dom_libxml_ns_mapper *mapper)
236+
PHP_DOM_EXPORT php_libxml_private_data_header *php_dom_libxml_private_data_header(php_dom_private_data *private_data)
237+
{
238+
return private_data == NULL ? NULL : &private_data->header;
239+
}
240+
241+
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_ns_mapper_from_private(php_dom_private_data *private_data)
242+
{
243+
return private_data == NULL ? NULL : &private_data->ns_mapper;
244+
}
245+
246+
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_get_ns_mapper(dom_object *object)
233247
{
234-
return mapper == NULL ? NULL : &mapper->header;
248+
return &php_dom_get_private_data(object)->ns_mapper;
235249
}
236250

237251
typedef struct {

ext/dom/namespace_compat.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,28 +33,33 @@ typedef struct php_dom_ns_magic_token php_dom_ns_magic_token;
3333
struct php_dom_libxml_ns_mapper;
3434
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
3535

36+
struct php_dom_private_data;
37+
typedef struct php_dom_private_data php_dom_private_data;
38+
39+
typedef struct php_libxml_private_data_header php_libxml_private_data_header;
40+
struct php_libxml_private_data_header;
41+
3642
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_html_magic_token;
3743
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_mathml_magic_token;
3844
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_svg_magic_token;
3945
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_xlink_magic_token;
4046
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_xml_magic_token;
4147
PHP_DOM_EXPORT extern const php_dom_ns_magic_token *php_dom_ns_is_xmlns_magic_token;
4248

43-
typedef struct php_libxml_private_data_header php_libxml_private_data_header;
44-
struct php_libxml_private_data_header;
45-
4649
/* These functions make it possible to make a namespace declaration also visible as an attribute by
4750
* creating an equivalent attribute node. */
4851

49-
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_libxml_ns_mapper_create(void);
50-
PHP_DOM_EXPORT void php_dom_libxml_ns_mapper_destroy(php_dom_libxml_ns_mapper *mapper);
52+
PHP_DOM_EXPORT php_dom_private_data *php_dom_private_data_create(void);
53+
PHP_DOM_EXPORT void php_dom_private_data_destroy(php_dom_private_data *data);
5154
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_ensure_html_ns(php_dom_libxml_ns_mapper *mapper);
5255
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_ensure_prefixless_xmlns_ns(php_dom_libxml_ns_mapper *mapper);
5356
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_get_ns(php_dom_libxml_ns_mapper *mapper, zend_string *prefix, zend_string *uri);
5457
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_get_ns_raw_prefix_string(php_dom_libxml_ns_mapper *mapper, const xmlChar *prefix, size_t prefix_len, zend_string *uri);
5558
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_get_ns_raw_strings_nullsafe(php_dom_libxml_ns_mapper *mapper, const char *prefix, const char *uri);
5659

57-
PHP_DOM_EXPORT php_libxml_private_data_header *php_dom_libxml_ns_mapper_header(php_dom_libxml_ns_mapper *mapper);
60+
PHP_DOM_EXPORT php_libxml_private_data_header *php_dom_libxml_private_data_header(php_dom_private_data *private_data);
61+
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_get_ns_mapper(dom_object *object);
62+
PHP_DOM_EXPORT php_dom_libxml_ns_mapper *php_dom_ns_mapper_from_private(php_dom_private_data *private_data);
5863
PHP_DOM_EXPORT void php_dom_ns_compat_mark_attribute_list(php_dom_libxml_ns_mapper *mapper, xmlNodePtr node);
5964
PHP_DOM_EXPORT void php_dom_libxml_reconcile_modern(php_dom_libxml_ns_mapper *ns_mapper, xmlNodePtr node);
6065
PHP_DOM_EXPORT void php_dom_reconcile_attribute_namespace_after_insertion(xmlAttrPtr attrp);

ext/dom/node.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,29 +1444,29 @@ PHP_METHOD(DOMNode, cloneNode)
14441444

14451445
DOM_GET_OBJ(n, id, xmlNodePtr, intern);
14461446

1447-
php_dom_libxml_ns_mapper *ns_mapper = NULL;
1447+
php_dom_private_data *private_data = NULL;
14481448
bool clone_document = n->type == XML_DOCUMENT_NODE || n->type == XML_HTML_DOCUMENT_NODE;
14491449
if (php_dom_follow_spec_intern(intern)) {
14501450
if (clone_document) {
1451-
ns_mapper = php_dom_libxml_ns_mapper_create();
1451+
private_data = php_dom_private_data_create();
14521452
} else {
1453-
ns_mapper = php_dom_get_ns_mapper(intern);
1453+
private_data = php_dom_get_private_data(intern);
14541454
}
14551455
}
14561456

1457-
node = dom_clone_node(ns_mapper, n, n->doc, recursive);
1457+
node = dom_clone_node(php_dom_ns_mapper_from_private(private_data), n, n->doc, recursive);
14581458

14591459
if (!node) {
1460-
if (clone_document && ns_mapper != NULL) {
1461-
php_dom_libxml_ns_mapper_destroy(ns_mapper);
1460+
if (clone_document && private_data != NULL) {
1461+
php_dom_private_data_destroy(private_data);
14621462
}
14631463
RETURN_FALSE;
14641464
}
14651465

14661466
/* If document cloned we want a new document proxy */
14671467
if (clone_document) {
14681468
dom_object *new_intern;
1469-
if (ns_mapper) {
1469+
if (private_data) {
14701470
/* We have the issue here that we can't create a modern node without an intern.
14711471
* Fortunately, it's impossible to have a custom document class for the modern DOM (final base class),
14721472
* so we can solve this by invoking the instantiation helper directly. */
@@ -1478,7 +1478,7 @@ PHP_METHOD(DOMNode, cloneNode)
14781478
}
14791479
php_dom_update_document_after_clone(intern, n, new_intern, node);
14801480
ZEND_ASSERT(new_intern->document->private_data == NULL);
1481-
new_intern->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
1481+
new_intern->document->private_data = php_dom_libxml_private_data_header(private_data);
14821482
} else {
14831483
if (node->type == XML_ATTRIBUTE_NODE && n->ns != NULL && node->ns == NULL) {
14841484
/* Let reconciliation deal with this. The lifetime of the namespace poses no problem

ext/dom/php_dom.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -593,21 +593,21 @@ static zend_object *dom_objects_store_clone_obj(zend_object *zobject) /* {{{ */
593593
if (instanceof_function(intern->std.ce, dom_node_class_entry) || instanceof_function(intern->std.ce, dom_modern_node_class_entry)) {
594594
xmlNodePtr node = (xmlNodePtr)dom_object_get_node(intern);
595595
if (node != NULL) {
596-
php_dom_libxml_ns_mapper *ns_mapper = NULL;
596+
php_dom_private_data *private_data = NULL;
597597
if (php_dom_follow_spec_intern(intern)) {
598598
if (node->type == XML_DOCUMENT_NODE || node->type == XML_HTML_DOCUMENT_NODE) {
599-
ns_mapper = php_dom_libxml_ns_mapper_create();
599+
private_data = php_dom_private_data_create();
600600
} else {
601-
ns_mapper = php_dom_get_ns_mapper(intern);
601+
private_data = php_dom_get_private_data(intern);
602602
}
603603
}
604604

605-
xmlNodePtr cloned_node = dom_clone_node(ns_mapper, node, node->doc, true);
605+
xmlNodePtr cloned_node = dom_clone_node(php_dom_ns_mapper_from_private(private_data), node, node->doc, true);
606606
if (cloned_node != NULL) {
607607
dom_update_refcount_after_clone(intern, node, clone, cloned_node);
608608
}
609-
if (ns_mapper != NULL) {
610-
clone->document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
609+
if (private_data != NULL) {
610+
clone->document->private_data = php_dom_libxml_private_data_header(private_data);
611611
}
612612
}
613613
}

ext/dom/php_dom.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ typedef enum dom_iterator_type {
114114
DOM_HTMLCOLLECTION,
115115
} dom_iterator_type;
116116

117+
struct php_dom_libxml_ns_mapper;
118+
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
119+
117120
static inline dom_object_namespace_node *php_dom_namespace_node_obj_from_obj(zend_object *obj) {
118121
return (dom_object_namespace_node*)((char*)(obj) - XtOffsetOf(dom_object_namespace_node, dom.std));
119122
}

ext/dom/xml_common.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ PHP_DOM_EXPORT xmlNodePtr dom_object_get_node(dom_object *obj);
8080
__id = ZEND_THIS; \
8181
DOM_GET_OBJ(__ptr, __id, __prtype, __intern);
8282

83-
struct php_dom_libxml_ns_mapper;
84-
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
83+
struct php_dom_private_data;
84+
typedef struct php_dom_private_data php_dom_private_data;
8585

86-
static zend_always_inline php_dom_libxml_ns_mapper *php_dom_get_ns_mapper(dom_object *intern)
86+
static zend_always_inline php_dom_private_data *php_dom_get_private_data(dom_object *intern)
8787
{
8888
ZEND_ASSERT(intern->document != NULL);
89-
return (php_dom_libxml_ns_mapper *) intern->document->private_data;
89+
return (php_dom_private_data *) intern->document->private_data;
9090
}
9191

9292
static zend_always_inline xmlNodePtr php_dom_next_in_tree_order(const xmlNode *nodep, const xmlNode *basep)

ext/dom/xml_document.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ PHP_METHOD(Dom_XMLDocument, createEmpty)
122122
NULL
123123
);
124124
dom_set_xml_class(intern->document);
125-
intern->document->private_data = php_dom_libxml_ns_mapper_header(php_dom_libxml_ns_mapper_create());
125+
intern->document->private_data = php_dom_libxml_private_data_header(php_dom_private_data_create());
126126
return;
127127

128128
oom:
@@ -236,8 +236,9 @@ static void load_from_helper(INTERNAL_FUNCTION_PARAMETERS, int mode)
236236

237237
void dom_document_convert_to_modern(php_libxml_ref_obj *document, xmlDocPtr lxml_doc)
238238
{
239-
php_dom_libxml_ns_mapper *ns_mapper = php_dom_libxml_ns_mapper_create();
240-
document->private_data = php_dom_libxml_ns_mapper_header(ns_mapper);
239+
php_dom_private_data *private_data = php_dom_private_data_create();
240+
php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
241+
document->private_data = php_dom_libxml_private_data_header(private_data);
241242
dom_mark_namespaces_as_attributes_too(ns_mapper, lxml_doc);
242243
}
243244

0 commit comments

Comments
 (0)