]> git.kaiwu.me - njs.git/commitdiff
XML: retain QuickJS tag sources during copy
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 10 Sep 2026 03:26:26 +0000 (20:26 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Fri, 11 Sep 2026 01:29:10 +0000 (18:29 -0700)
external/qjs_xml_module.c
test/xml/xml.t.mjs

index ae21cedfe4f0582f97357ef269d18e379504a49d..67c85859c4c3419279f76d12e40b0fbe48b6a618 100644 (file)
@@ -869,17 +869,19 @@ qjs_xml_node_tags_modify(JSContext *cx, JSValue obj, njs_str_t *name,
         }
 
         node = qjs_xml_node(cx, v, NULL);
-        JS_FreeValue(cx, v);
         if (node == NULL) {
+            JS_FreeValue(cx, v);
             goto error;
         }
 
         if (qjs_xml_tree_has_namespaces(node)) {
+            JS_FreeValue(cx, v);
             JS_ThrowTypeError(cx, "setval[%u] has namespaces", i);
             goto error;
         }
 
         node = xmlDocCopyNode(node, current->doc->doc, 1);
+        JS_FreeValue(cx, v);
         if (node == NULL) {
             JS_ThrowInternalError(cx, "xmlDocCopyNode() failed");
             goto error;
index db52f0ff5371ab2e9d0985cd503862308fa76cde..438c736cb4facd5e3c243fe85115bad02f9e8c93 100644 (file)
@@ -592,6 +592,20 @@ let modify_tsuite = {
             return xml.serializeToString(doc);
           },
           expected: `<root><child>value</child></root>` },
+        { doc: `<root></root>`,
+          skip: () => !has_quickjs(),
+          get: (doc) => {
+            let values = [];
+
+            Object.defineProperty(values, '0', {
+                get: () => xml.parse(`<child>value</child>`),
+            });
+            Object.defineProperty(values, 'length', {value: 1});
+
+            doc.root.$tags = values;
+            return xml.serializeToString(doc);
+          },
+          expected: `<root><child>value</child></root>` },
         { doc: `<root><target><old>value</old></target></root>`,
           skip: () => !has_quickjs(),
           get: (doc) => {