int64_t k, len, length;
njs_int_t ret;
njs_uint_t i;
- njs_value_t this, retval, *value, *e;
+ njs_value_t this, retval, *e;
njs_array_t *array, *keys;
ret = njs_value_to_object(vm, &args[0]);
return NJS_ERROR;
}
- if (njs_is_fast_array(&this) && njs_is_fast_array(e)
- && (length + len) <= NJS_ARRAY_LARGE_OBJECT_LENGTH)
- {
+ if (njs_is_fast_array(e)) {
for (k = 0; k < len; k++, length++) {
- value = &njs_array_start(e)[k];
-
- if (njs_slow_path(!njs_is_valid(value))) {
- ret = njs_value_property_i64(vm, e, k, &retval);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
-
- if (ret == NJS_DECLINED) {
- njs_set_invalid(&retval);
+ ret = njs_value_property_i64(vm, e, k, &retval);
+ if (njs_slow_path(ret != NJS_OK)) {
+ if (ret == NJS_ERROR) {
+ return NJS_ERROR;
}
- value = &retval;
+ njs_set_invalid(&retval);
}
- ret = njs_array_add(vm, array, value);
+ ret = njs_array_add(vm, array, &retval);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
continue;
}
- if (njs_fast_object(len)) {
- for (k = 0; k < len; k++, length++) {
- ret = njs_value_property_i64(vm, e, k, &retval);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
-
- if (ret != NJS_OK) {
- continue;
- }
-
- ret = njs_value_property_i64_set(vm, &this, length,
- &retval);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
- }
-
- continue;
- }
-
keys = njs_array_indices(vm, e);
if (njs_slow_path(keys == NULL)) {
return NJS_ERROR;
return ret;
}
- idx = njs_string_to_index(&keys->start[k]) + length;
-
if (ret == NJS_OK) {
+ idx = njs_string_to_index(&keys->start[k]) + length;
+
ret = njs_value_property_i64_set(vm, &this, idx, &retval);
if (njs_slow_path(ret == NJS_ERROR)) {
njs_array_destroy(vm, keys);
return NJS_ERROR;
}
- if (njs_is_fast_array(&this)) {
- ret = njs_array_add(vm, array, e);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- } else {
- ret = njs_value_property_i64_set(vm, &this, length, e);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
+ ret = njs_value_property_i64_set(vm, &this, length, e);
+ if (njs_slow_path(ret == NJS_ERROR)) {
+ return ret;
}
length++;
"Object.getOwnPropertyDescriptor(o, Symbol.isConcatSpreadable).value"),
njs_str("true") },
+ { njs_str("var a = [1];"
+ "var b = [2, /**/, 4, 5];"
+ "Object.defineProperty(b.__proto__, 1, {"
+ " get: () => {"
+ " b.length = 10**6;"
+ " return 3;"
+ " }"
+ "});"
+ "a.concat(b)"),
+ njs_str("1,2,3,4,5") },
+
{ njs_str("var o = {}, n = 5381 /* NJS_DJB_HASH_INIT */;"
"while(n--) o[Symbol()] = 'test'; o[''];"),
njs_str("undefined") },