@@ -96,11 +96,11 @@ static njs_int_t njs_xml_node_ext_text(njs_vm_t *vm, njs_object_prop_t *prop,
9696
9797static 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
106106static 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 );
111111static 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 );
115115static void njs_xml_node_cleanup (void * data );
116116static 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
775774error :
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
11451144static 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
11841181static 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
12301229static 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
13431344error :
13441345
@@ -1512,9 +1513,12 @@ njs_xml_encode_special_chars(njs_vm_t *vm, njs_str_t *src, njs_str_t *out)
15121513
15131514
15141515static 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 );
0 commit comments