]> git.kaiwu.me - njs.git/commitdiff
njs_vmcode_addition() does not use njs_string_prototype_concat().
authorIgor Sysoev <igor@sysoev.ru>
Fri, 30 Oct 2015 13:22:37 +0000 (16:22 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Fri, 30 Oct 2015 13:22:37 +0000 (16:22 +0300)
njs/njs_string.c
njs/njs_vm.c

index 4d4512fd64b1fe3adb7fd1d1a1218df5b9c72896..6376f4610d778a608d4117a80010e73b83a437bd 100644 (file)
@@ -543,7 +543,8 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_param_t *param)
 
     size = string.size;
     length = string.length;
-    mask = (length != 0) ? -1 : 0;
+
+    mask = (string.length == 0 && string.size != 0) ? 0 : -1;
 
     args = param->args;
 
index b09e3b9b9baeb7890c5b9d65d7628eadb07bf1ba..0fb2163927571aad367a339122ec6139d1a8bf60 100644 (file)
@@ -1369,9 +1369,10 @@ njs_vmcode_unary_negation(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
 njs_ret_t
 njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 {
-    double       num;
-    njs_ret_t    ret;
-    njs_param_t  param;
+    double             num;
+    u_char             *start;
+    size_t             size, length;
+    njs_string_prop_t  string1, string2;
 
     if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
 
@@ -1382,18 +1383,35 @@ njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     }
 
     if (nxt_fast_path(njs_is_string(val1) && njs_is_string(val2))) {
-        param.object = val1;
-        param.args = val2;
-        param.retval = 0;
-        param.nargs = 1;
 
-        ret = njs_string_prototype_concat(vm, &param);
+        (void) njs_string_prop(&string1, val1);
+        (void) njs_string_prop(&string2, val2);
+
+        if ((string1.length != 0 || string1.size == 0)
+            && (string2.length != 0 || string2.size == 0))
+        {
+            length = string1.length + string2.length;
 
-        if (nxt_fast_path(ret >= 0)) {
-            return sizeof(njs_vmcode_3addr_t);
+        } else {
+            length = 0;
         }
 
-        return ret;
+        size = string1.size + string2.size;
+
+        start = njs_string_alloc(vm, &vm->retval, size, length);
+
+        if (nxt_slow_path(start == NULL)) {
+            return NXT_ERROR;
+        }
+
+        (void) memcpy(start, string1.start, string1.size);
+        (void) memcpy(start + string1.size, string2.start, string2.size);
+
+        if (length >= NJS_STRING_MAP_OFFSET && size != length) {
+            njs_string_offset_map_init(start, size);
+        }
+
+        return sizeof(njs_vmcode_3addr_t);
     }
 
     return NJS_TRAP_STRINGS;