]> git.kaiwu.me - njs.git/commitdiff
Fixed Array.prototype.join() with "undefined" argument.
authorAlexander Borisov <alexander.borisov@nginx.com>
Wed, 30 Oct 2019 13:43:12 +0000 (16:43 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Wed, 30 Oct 2019 13:43:12 +0000 (16:43 +0300)
This closes #232 issue on GitHub.

src/njs_array.c
src/test/njs_unit_test.c

index f340b7ac4064a74caa2f248d5bcccd8f4e734761..d6415aec17fbdc0ad6c80291c5970afc7114747b 100644 (file)
@@ -1144,13 +1144,22 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         return ret;
     }
 
-    if (nargs > 1 && !njs_is_string(&args[1])) {
-        ret = njs_value_to_string(vm, &args[1], &args[1]);
-        if (njs_slow_path(ret != NJS_OK)) {
-            return ret;
+    value = njs_arg(args, nargs, 1);
+
+    if (njs_slow_path(!njs_is_string(value))) {
+        if (njs_is_undefined(value)) {
+            value = njs_value_arg(&njs_string_comma);
+
+        } else {
+            ret = njs_value_to_string(vm, value, value);
+            if (njs_slow_path(ret != NJS_OK)) {
+                return ret;
+            }
         }
     }
 
+    (void) njs_string_prop(&separator, value);
+
     if (!njs_is_array(&args[0]) || njs_array_len(&args[0]) == 0) {
         vm->retval = njs_string_empty;
         return NJS_OK;
@@ -1232,15 +1241,6 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
     }
 
-    if (nargs > 1) {
-        value = &args[1];
-
-    } else {
-        value = njs_value_arg(&njs_string_comma);
-    }
-
-    (void) njs_string_prop(&separator, value);
-
     size += separator.size * (array->length - 1);
     length += separator.length * (array->length - 1);
 
index 6b27725f990654e4827500add40eaafba7cff0e7..8d1c3966b35d60178f9a5fbfd20560068eadcf8f 100644 (file)
@@ -7756,6 +7756,9 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("[].join.call()"),
       njs_str("TypeError: cannot convert null or undefined to object") },
 
+    { njs_str("[1,2,3].join(undefined)"),
+      njs_str("1,2,3") },
+
     { njs_str("[].slice.call()"),
       njs_str("TypeError: cannot convert null or undefined to object") },