Skip to content

Commit bd04119

Browse files
committed
XML: fixed XMLNode update.
1 parent 0dec770 commit bd04119

File tree

3 files changed

+64
-31
lines changed

3 files changed

+64
-31
lines changed

external/njs_xml_module.c

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ static njs_int_t njs_xml_node_ext_text(njs_vm_t *vm, njs_object_prop_t *prop,
9696

9797
static njs_int_t njs_xml_node_attr_handler(njs_vm_t *vm, xmlNode *current,
9898
njs_str_t *name, njs_value_t *setval, njs_value_t *retval);
99-
static njs_int_t njs_xml_node_tag_remove(njs_vm_t *vm, xmlNode *current,
99+
static njs_int_t njs_xml_node_tag_remove(njs_vm_t *vm, njs_value_t *value,
100100
njs_str_t *name);
101-
static njs_int_t njs_xml_node_tag_handler(njs_vm_t *vm, xmlNode *current,
101+
static njs_int_t njs_xml_node_tag_handler(njs_vm_t *vm, njs_value_t *value,
102102
njs_str_t *name, njs_value_t *setval, njs_value_t *retval);
103-
static njs_int_t njs_xml_node_tags_handler(njs_vm_t *vm, xmlNode *current,
103+
static njs_int_t njs_xml_node_tags_handler(njs_vm_t *vm, njs_value_t *value,
104104
njs_str_t *name, njs_value_t *setval, njs_value_t *retval);
105105

106106
static xmlNode *njs_xml_external_node(njs_vm_t *vm, njs_value_t *value);
@@ -110,7 +110,7 @@ static const u_char *njs_xml_value_to_c_string(njs_vm_t *vm, njs_value_t *value,
110110
u_char *dst, size_t size);
111111
static njs_int_t njs_xml_encode_special_chars(njs_vm_t *vm, njs_str_t *src,
112112
njs_str_t *out);
113-
static njs_int_t njs_xml_replace_node(njs_vm_t *vm, xmlNode *old,
113+
static njs_int_t njs_xml_replace_node(njs_vm_t *vm, njs_value_t *value,
114114
xmlNode *current);
115115
static void njs_xml_node_cleanup(void *data);
116116
static void njs_xml_doc_cleanup(void *data);
@@ -706,7 +706,7 @@ njs_xml_node_ext_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop,
706706
name.length -= njs_length("$tag$");
707707
name.start += njs_length("$tag$");
708708

709-
return njs_xml_node_tag_handler(vm, current, &name, setval, retval);
709+
return njs_xml_node_tag_handler(vm, value, &name, setval, retval);
710710
}
711711

712712
if (name.length >= njs_length("$tags$")
@@ -715,12 +715,11 @@ njs_xml_node_ext_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop,
715715
name.length -= njs_length("$tags$");
716716
name.start += njs_length("$tags$");
717717

718-
return njs_xml_node_tags_handler(vm, current, &name, setval,
719-
retval);
718+
return njs_xml_node_tags_handler(vm, value, &name, setval, retval);
720719
}
721720
}
722721

723-
return njs_xml_node_tag_handler(vm, current, &name, setval, retval);
722+
return njs_xml_node_tag_handler(vm, value, &name, setval, retval);
724723
}
725724

726725

@@ -770,7 +769,7 @@ njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
770769

771770
njs_value_undefined_set(retval);
772771

773-
return njs_xml_replace_node(vm, current, copy);
772+
return njs_xml_replace_node(vm, njs_argument(args, 0), copy);
774773

775774
error:
776775

@@ -909,7 +908,7 @@ njs_xml_node_ext_remove_children(njs_vm_t *vm, njs_value_t *args,
909908

910909
njs_value_string_get(vm, selector, &name);
911910

912-
return njs_xml_node_tag_remove(vm, current, &name);
911+
return njs_xml_node_tag_remove(vm, njs_argument(args, 0), &name);
913912
}
914913

915914
/* all. */
@@ -925,7 +924,7 @@ njs_xml_node_ext_remove_children(njs_vm_t *vm, njs_value_t *args,
925924
copy->children = NULL;
926925
}
927926

928-
return njs_xml_replace_node(vm, current, copy);
927+
return njs_xml_replace_node(vm, njs_argument(args, 0), copy);
929928
}
930929

931930

@@ -990,7 +989,7 @@ njs_xml_node_ext_tags(njs_vm_t *vm, njs_object_prop_t *prop, uint32_t unused,
990989
name.start = NULL;
991990
name.length = 0;
992991

993-
return njs_xml_node_tags_handler(vm, current, &name, setval, retval);
992+
return njs_xml_node_tags_handler(vm, value, &name, setval, retval);
994993
}
995994

996995

@@ -1051,7 +1050,7 @@ njs_xml_node_ext_text(njs_vm_t *vm, njs_object_prop_t *unused, uint32_t unused1,
10511050
njs_value_undefined_set(retval);
10521051
}
10531052

1054-
return njs_xml_replace_node(vm, current, copy);
1053+
return njs_xml_replace_node(vm, value, copy);
10551054
}
10561055

10571056

@@ -1143,11 +1142,12 @@ njs_xml_node_attr_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
11431142

11441143

11451144
static njs_int_t
1146-
njs_xml_node_tag_remove(njs_vm_t *vm, xmlNode *current, njs_str_t *name)
1145+
njs_xml_node_tag_remove(njs_vm_t *vm, njs_value_t *value, njs_str_t *name)
11471146
{
11481147
size_t size;
1149-
xmlNode *node, *next, *copy;
1150-
njs_int_t ret;
1148+
xmlNode *current, *node, *next, *copy;
1149+
1150+
current = njs_vm_external(vm, njs_xml_node_proto_id, value);
11511151

11521152
copy = xmlDocCopyNode(current, current->doc, 1);
11531153
if (njs_slow_path(copy == NULL)) {
@@ -1170,23 +1170,22 @@ njs_xml_node_tag_remove(njs_vm_t *vm, xmlNode *current, njs_str_t *name)
11701170
continue;
11711171
}
11721172

1173-
ret = njs_xml_replace_node(vm, node, NULL);
1174-
if (njs_slow_path(ret != NJS_OK)) {
1175-
xmlFreeNode(copy);
1176-
return NJS_ERROR;
1177-
}
1173+
xmlUnlinkNode(node);
1174+
xmlFreeNode(node);
11781175
}
11791176

1180-
return njs_xml_replace_node(vm, current, copy);
1177+
return njs_xml_replace_node(vm, value, copy);
11811178
}
11821179

11831180

11841181
static njs_int_t
1185-
njs_xml_node_tag_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
1182+
njs_xml_node_tag_handler(njs_vm_t *vm, njs_value_t *value, njs_str_t *name,
11861183
njs_value_t *setval, njs_value_t *retval)
11871184
{
11881185
size_t size;
1189-
xmlNode *node;
1186+
xmlNode *current, *node;
1187+
1188+
current = njs_vm_external(vm, njs_xml_node_proto_id, value);
11901189

11911190
if (retval != NULL && setval == NULL) {
11921191

@@ -1223,21 +1222,23 @@ njs_xml_node_tag_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
12231222

12241223
/* delete. */
12251224

1226-
return njs_xml_node_tag_remove(vm, current, name);
1225+
return njs_xml_node_tag_remove(vm, value, name);
12271226
}
12281227

12291228

12301229
static njs_int_t
1231-
njs_xml_node_tags_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
1230+
njs_xml_node_tags_handler(njs_vm_t *vm, njs_value_t *value, njs_str_t *name,
12321231
njs_value_t *setval, njs_value_t *retval)
12331232
{
12341233
size_t size;
12351234
int64_t i, length;
1236-
xmlNode *node, *rnode, *copy;
1235+
xmlNode *current, *node, *rnode, *copy;
12371236
njs_int_t ret;
12381237
njs_value_t *push;
12391238
njs_opaque_value_t *start;
12401239

1240+
current = njs_vm_external(vm, njs_xml_node_proto_id, value);
1241+
12411242
if (retval != NULL && setval == NULL) {
12421243

12431244
/* get. */
@@ -1294,7 +1295,7 @@ njs_xml_node_tags_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
12941295

12951296
if (retval == NULL) {
12961297
/* delete. */
1297-
return njs_xml_replace_node(vm, current, copy);
1298+
return njs_xml_replace_node(vm, value, copy);
12981299
}
12991300

13001301
if (!njs_value_is_array(setval)) {
@@ -1338,7 +1339,7 @@ njs_xml_node_tags_handler(njs_vm_t *vm, xmlNode *current, njs_str_t *name,
13381339

13391340
njs_value_undefined_set(retval);
13401341

1341-
return njs_xml_replace_node(vm, current, copy);
1342+
return njs_xml_replace_node(vm, value, copy);
13421343

13431344
error:
13441345

@@ -1512,9 +1513,12 @@ njs_xml_encode_special_chars(njs_vm_t *vm, njs_str_t *src, njs_str_t *out)
15121513

15131514

15141515
static njs_int_t
1515-
njs_xml_replace_node(njs_vm_t *vm, xmlNode *old, xmlNode *current)
1516+
njs_xml_replace_node(njs_vm_t *vm, njs_value_t *value, xmlNode *current)
15161517
{
1517-
njs_mp_cleanup_t *cln;
1518+
xmlNode *old;
1519+
njs_mp_cleanup_t *cln;
1520+
1521+
old = njs_vm_external(vm, njs_xml_node_proto_id, value);
15181522

15191523
if (current != NULL) {
15201524
old = xmlReplaceNode(old, current);
@@ -1523,6 +1527,8 @@ njs_xml_replace_node(njs_vm_t *vm, xmlNode *old, xmlNode *current)
15231527
xmlUnlinkNode(old);
15241528
}
15251529

1530+
njs_value_external_set(value, current);
1531+
15261532
cln = njs_mp_cleanup_add(njs_vm_memory_pool(vm), 0);
15271533
if (njs_slow_path(cln == NULL)) {
15281534
njs_vm_memory_error(vm);

external/qjs_xml_module.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,6 +2032,8 @@ qjs_xml_replace_node(JSContext *cx, qjs_xml_node_t *node, xmlNode *current)
20322032
xmlUnlinkNode(old);
20332033
}
20342034

2035+
node->node = current;
2036+
20352037
old->next = node->doc->free;
20362038
node->doc->free = old;
20372039
}

test/xml/xml.t.mjs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,25 @@ let modify_tsuite = {
165165
return doc.note.$text;
166166
},
167167
expected: 'WAKA' },
168+
{ get: (doc) => {
169+
doc.note.setText('WAKA');
170+
doc.note.setText('OVERWRITE');
171+
return doc.note.$text;
172+
},
173+
expected: 'OVERWRITE' },
174+
{ get: (doc) => {
175+
let note = doc.note;
176+
note.setText('WAKA');
177+
note.setText('OVERWRITE');
178+
return note.$text;
179+
},
180+
expected: 'OVERWRITE' },
181+
{ get: (doc) => {
182+
let note = doc.note;
183+
note.setText('WAKA');
184+
return doc.note.$text;
185+
},
186+
expected: 'WAKA' },
168187
{ get: (doc) => {
169188
doc.note.setText('WAKA');
170189
return xml.serializeToString(doc);
@@ -321,6 +340,12 @@ let modify_tsuite = {
321340
return xml.serializeToString(doc);
322341
},
323342
expected: `<note><from>Jani</from></note>` },
343+
{ get: (doc) => {
344+
let note = doc.note;
345+
note.removeChildren('to');
346+
return xml.serializeToString(doc);
347+
},
348+
expected: `<note><from>Jani</from></note>` },
324349
{ get: (doc) => {
325350
delete doc.note.$tag$to;
326351
return xml.serializeToString(doc);

0 commit comments

Comments
 (0)