[njs] Change: non-compliant deprecated String methods were removed.
Dmitry Volyntsev
xeioex at nginx.com
Sat May 6 03:11:04 UTC 2023
details: https://hg.nginx.org/njs/rev/4df790f42ce7
branches:
changeset: 2106:4df790f42ce7
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Fri May 05 20:08:56 2023 -0700
description:
Change: non-compliant deprecated String methods were removed.
The following methods were removed:
String.bytesFrom(),
String.prototype.fromBytes(),
String.prototype.fromUTF8(),
String.prototype.toBytes(),
String.prototype.toUTF8(),
String.prototype.toString(encoding).
Because String.bytesFrom() was used to test the existing code
which works with byte strings it was replaced with $262.bytesString()
which is only available in unit tests.
diffstat:
src/njs_string.c | 445 +-----------------------------------------
src/test/njs_externals_test.c | 173 ++++++++++++++++
src/test/njs_unit_test.c | 369 ++++++++--------------------------
3 files changed, 265 insertions(+), 722 deletions(-)
diffs (truncated from 1311 to 1000 lines):
diff -r 314a2a9fe9c7 -r 4df790f42ce7 src/njs_string.c
--- a/src/njs_string.c Fri May 05 20:08:55 2023 -0700
+++ b/src/njs_string.c Fri May 05 20:08:56 2023 -0700
@@ -66,13 +66,6 @@ static njs_int_t njs_string_slice_args(n
njs_value_t *args, njs_uint_t nargs);
static njs_int_t njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t is_point, njs_value_t *retval);
-static njs_int_t njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
-static njs_int_t njs_string_bytes_from_array_like(njs_vm_t *vm,
- njs_value_t *value, njs_value_t *retval);
-static njs_int_t njs_string_bytes_from_string(njs_vm_t *vm,
- const njs_value_t *string, const njs_value_t *encoding,
- njs_value_t *retval);
static njs_int_t njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
njs_regexp_pattern_t *pattern, njs_value_t *retval);
@@ -660,8 +653,6 @@ static const njs_object_prop_t njs_stri
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
- NJS_DECLARE_PROP_NATIVE("bytesFrom", njs_string_bytes_from, 0, 0),
-
NJS_DECLARE_PROP_NATIVE("fromCharCode", njs_string_from_char_code, 1, 0),
NJS_DECLARE_PROP_NATIVE("fromCodePoint", njs_string_from_char_code, 1, 1),
@@ -837,58 +828,11 @@ njs_string_prototype_value_of(njs_vm_t *
}
-/*
- * String.prototype.toString([encoding]).
- * Returns the string as is if no additional argument is provided,
- * otherwise converts a string into an encoded string: hex, base64,
- * base64url.
- */
-
static njs_int_t
njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- njs_int_t ret;
- njs_str_t enc, str;
- njs_value_t value;
- njs_string_prop_t string;
-
- ret = njs_string_prototype_value_of(vm, args, nargs, unused, retval);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- if (nargs < 2) {
- return NJS_OK;
- }
-
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- njs_type_error(vm, "encoding must be a string");
- return NJS_ERROR;
- }
-
- njs_value_assign(&value, retval);
-
- (void) njs_string_prop(&string, &value);
-
- njs_string_get(&args[1], &enc);
-
- str.length = string.size;
- str.start = string.start;
-
- if (enc.length == 3 && memcmp(enc.start, "hex", 3) == 0) {
- return njs_string_hex(vm, retval, &str);
-
- } else if (enc.length == 6 && memcmp(enc.start, "base64", 6) == 0) {
- return njs_string_base64(vm, retval, &str);
-
- } else if (enc.length == 9 && memcmp(enc.start, "base64url", 9) == 0) {
- return njs_string_base64url(vm, retval, &str);
- }
-
- njs_type_error(vm, "Unknown encoding: \"%V\"", &enc);
-
- return NJS_ERROR;
+ return njs_string_prototype_value_of(vm, args, nargs, unused, retval);
}
@@ -977,226 +921,6 @@ njs_string_object_validate(njs_vm_t *vm,
}
-/*
- * String.fromUTF8(start[, end]).
- * The method converts an UTF-8 encoded byte string to an Unicode string.
- */
-
-static njs_int_t
-njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
-{
- ssize_t length;
- njs_int_t ret;
- njs_slice_prop_t slice;
- njs_string_prop_t string;
-
- njs_deprecated(vm, "String.prototype.fromUTF8()");
-
- ret = njs_string_object_validate(vm, njs_argument(args, 0));
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- ret = njs_string_slice_prop(vm, &string, &slice, args, nargs);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- if (string.length != 0) {
- /* ASCII or UTF8 string. */
- return njs_string_slice(vm, retval, &string, &slice);
- }
-
- string.start += slice.start;
-
- length = njs_utf8_length(string.start, slice.length);
-
- if (length >= 0) {
- return njs_string_new(vm, retval, string.start, slice.length,
- length);
- }
-
- njs_set_null(retval);
-
- return NJS_OK;
-}
-
-
-/*
- * String.toUTF8(start[, end]).
- * The method serializes Unicode string to an UTF-8 encoded byte string.
- */
-
-static njs_int_t
-njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused, njs_value_t *retval)
-{
- njs_int_t ret;
- njs_slice_prop_t slice;
- njs_string_prop_t string;
-
- njs_deprecated(vm, "String.prototype.toUTF8()");
-
- ret = njs_string_object_validate(vm, njs_argument(args, 0));
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- (void) njs_string_prop(&string, njs_argument(args, 0));
-
- string.length = 0;
- slice.string_length = string.size;
-
- ret = njs_string_slice_args(vm, &slice, args, nargs);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- return njs_string_slice(vm, retval, &string, &slice);
-}
-
-
-/*
- * String.fromBytes(start[, end]).
- * The method converts a byte string to an Unicode string.
- */
-
-static njs_int_t
-njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
-{
- u_char *p, *s, *start, *end;
- size_t size;
- njs_int_t ret;
- njs_slice_prop_t slice;
- njs_string_prop_t string;
-
- njs_deprecated(vm, "String.prototype.fromBytes()");
-
- ret = njs_string_object_validate(vm, njs_argument(args, 0));
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- ret = njs_string_slice_prop(vm, &string, &slice, args, nargs);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- if (string.length != 0) {
- /* ASCII or UTF8 string. */
- return njs_string_slice(vm, retval, &string, &slice);
- }
-
- size = 0;
- string.start += slice.start;
- end = string.start + slice.length;
-
- for (p = string.start; p < end; p++) {
- size += (*p < 0x80) ? 1 : 2;
- }
-
- start = njs_string_alloc(vm, retval, size, slice.length);
-
- if (njs_fast_path(start != NULL)) {
-
- if (size == slice.length) {
- memcpy(start, string.start, size);
-
- } else {
- s = start;
- end = string.start + slice.length;
-
- for (p = string.start; p < end; p++) {
- s = njs_utf8_encode(s, *p);
- }
- }
-
- return NJS_OK;
- }
-
- return NJS_ERROR;
-}
-
-
-/*
- * String.toBytes(start[, end]).
- * The method serializes an Unicode string to a byte string.
- * The method returns null if a character larger than 255 is
- * encountered in the Unicode string.
- */
-
-static njs_int_t
-njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused, njs_value_t *retval)
-{
- u_char *p;
- size_t length;
- uint32_t byte;
- njs_int_t ret;
- const u_char *s, *end;
- njs_slice_prop_t slice;
- njs_string_prop_t string;
- njs_unicode_decode_t ctx;
-
- njs_deprecated(vm, "String.prototype.toBytes()");
-
- ret = njs_string_object_validate(vm, njs_argument(args, 0));
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- ret = njs_string_slice_prop(vm, &string, &slice, args, nargs);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- if (string.length == 0) {
- /* Byte string. */
- return njs_string_slice(vm, retval, &string, &slice);
- }
-
- p = njs_string_alloc(vm, retval, slice.length, 0);
-
- if (njs_fast_path(p != NULL)) {
-
- if (string.length != string.size) {
- /* UTF-8 string. */
- end = string.start + string.size;
-
- s = njs_string_utf8_offset(string.start, end, slice.start);
-
- length = slice.length;
-
- njs_utf8_decode_init(&ctx);
-
- while (length != 0 && s < end) {
- byte = njs_utf8_decode(&ctx, &s, end);
-
- if (njs_slow_path(byte > 0xFF)) {
- njs_release(vm, retval);
- njs_set_null(retval);
-
- return NJS_OK;
- }
-
- *p++ = (u_char) byte;
- length--;
- }
-
- } else {
- /* ASCII string. */
- memcpy(p, string.start + slice.start, slice.length);
- }
-
- return NJS_OK;
- }
-
- return NJS_ERROR;
-}
-
-
static njs_int_t
njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused, njs_value_t *retval)
@@ -1618,165 +1342,6 @@ done:
}
-/*
- * String.bytesFrom(array-like).
- * Converts an array-like object containing octets into a byte string.
- *
- * String.bytesFrom(string[, encoding]).
- * Converts a string using provided encoding: hex, base64, base64url to
- * a byte string.
- */
-
-static njs_int_t
-njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_index_t unused, njs_value_t *retval)
-{
- njs_value_t *value;
-
- njs_deprecated(vm, "String.bytesFrom()");
-
- value = njs_arg(args, nargs, 1);
-
- if (njs_is_string(value)) {
- return njs_string_bytes_from_string(vm, value, njs_arg(args, nargs, 2),
- retval);
-
- } else if (njs_is_object(value)) {
-
- if (njs_is_object_string(value)) {
- value = njs_object_value(value);
- return njs_string_bytes_from_string(vm, value,
- njs_arg(args, nargs, 2),
- retval);
- }
-
- return njs_string_bytes_from_array_like(vm, value, retval);
- }
-
- njs_type_error(vm, "value must be a string or array-like object");
-
- return NJS_ERROR;
-}
-
-
-static njs_int_t
-njs_string_bytes_from_array_like(njs_vm_t *vm, njs_value_t *value,
- njs_value_t *retval)
-{
- u_char *p;
- int64_t length;
- uint32_t u32;
- njs_int_t ret;
- njs_array_t *array;
- njs_value_t *octet, index, prop;
- njs_array_buffer_t *buffer;
-
- array = NULL;
- buffer = NULL;
-
- switch (value->type) {
- case NJS_ARRAY:
- array = njs_array(value);
- length = array->length;
- break;
-
- case NJS_ARRAY_BUFFER:
- case NJS_TYPED_ARRAY:
-
- if (njs_is_typed_array(value)) {
- buffer = njs_typed_array(value)->buffer;
-
- } else {
- buffer = njs_array_buffer(value);
- }
-
- length = buffer->size;
- break;
-
- default:
- ret = njs_object_length(vm, value, &length);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
- }
-
- p = njs_string_alloc(vm, retval, length, 0);
- if (njs_slow_path(p == NULL)) {
- return NJS_ERROR;
- }
-
- if (array != NULL) {
- octet = array->start;
-
- while (length != 0) {
- ret = njs_value_to_uint32(vm, octet, &u32);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- *p++ = (u_char) u32;
- octet++;
- length--;
- }
-
- } else if (buffer != NULL) {
- memcpy(p, buffer->u.u8, length);
-
- } else {
- p += length - 1;
-
- while (length != 0) {
- njs_set_number(&index, length - 1);
-
- ret = njs_value_property(vm, value, &index, &prop);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return ret;
- }
-
- ret = njs_value_to_uint32(vm, &prop, &u32);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
-
- *p-- = (u_char) u32;
- length--;
- }
- }
-
- return NJS_OK;
-}
-
-
-static njs_int_t
-njs_string_bytes_from_string(njs_vm_t *vm, const njs_value_t *string,
- const njs_value_t *encoding, njs_value_t *retval)
-{
- njs_str_t enc, str;
-
- if (!njs_is_string(encoding)) {
- njs_type_error(vm, "\"encoding\" must be a string");
- return NJS_ERROR;
- }
-
- njs_string_get(encoding, &enc);
- njs_string_get(string, &str);
-
- if (enc.length == 3 && memcmp(enc.start, "hex", 3) == 0) {
- return njs_string_decode_hex(vm, retval, &str);
-
- } else if (enc.length == 6 && memcmp(enc.start, "base64", 6) == 0) {
- return njs_string_decode_base64(vm, retval, &str);
-
- } else if (enc.length == 9 && memcmp(enc.start, "base64url", 9) == 0) {
- return njs_string_decode_base64url(vm, retval, &str);
- }
-
- njs_type_error(vm, "Unknown encoding: \"%V\"", &enc);
-
- return NJS_ERROR;
-}
-
-
size_t
njs_decode_hex_length(const njs_str_t *src, size_t *out_size)
{
@@ -4085,14 +3650,6 @@ static const njs_object_prop_t njs_stri
NJS_DECLARE_PROP_NATIVE("concat", njs_string_prototype_concat, 1, 0),
- NJS_DECLARE_PROP_NATIVE("fromUTF8", njs_string_prototype_from_utf8, 0, 0),
-
- NJS_DECLARE_PROP_NATIVE("toUTF8", njs_string_prototype_to_utf8, 0, 0),
-
- NJS_DECLARE_PROP_NATIVE("fromBytes", njs_string_prototype_from_bytes, 0, 0),
-
- NJS_DECLARE_PROP_NATIVE("toBytes", njs_string_prototype_to_bytes, 0, 0),
-
NJS_DECLARE_PROP_NATIVE("slice", njs_string_prototype_slice, 2, 0),
NJS_DECLARE_PROP_NATIVE("substring", njs_string_prototype_substring, 2, 0),
diff -r 314a2a9fe9c7 -r 4df790f42ce7 src/test/njs_externals_test.c
--- a/src/test/njs_externals_test.c Fri May 05 20:08:55 2023 -0700
+++ b/src/test/njs_externals_test.c Fri May 05 20:08:56 2023 -0700
@@ -570,6 +570,168 @@ njs_262_detach_array_buffer(njs_vm_t *vm
}
+static njs_int_t
+njs_262_bytes_from_array_like(njs_vm_t *vm, njs_value_t *value,
+ njs_value_t *retval)
+{
+ u_char *p;
+ int64_t length;
+ uint32_t u32;
+ njs_int_t ret;
+ njs_array_t *array;
+ njs_value_t *octet, index, prop;
+ njs_array_buffer_t *buffer;
+
+ array = NULL;
+ buffer = NULL;
+
+ switch (value->type) {
+ case NJS_ARRAY:
+ array = njs_array(value);
+ length = array->length;
+ break;
+
+ case NJS_ARRAY_BUFFER:
+ case NJS_TYPED_ARRAY:
+
+ if (njs_is_typed_array(value)) {
+ buffer = njs_typed_array(value)->buffer;
+
+ } else {
+ buffer = njs_array_buffer(value);
+ }
+
+ length = buffer->size;
+ break;
+
+ default:
+ ret = njs_object_length(vm, value, &length);
+ if (njs_slow_path(ret == NJS_ERROR)) {
+ return ret;
+ }
+ }
+
+ p = njs_string_alloc(vm, retval, length, 0);
+ if (njs_slow_path(p == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (array != NULL) {
+ octet = array->start;
+
+ while (length != 0) {
+ ret = njs_value_to_uint32(vm, octet, &u32);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+
+ *p++ = (u_char) u32;
+ octet++;
+ length--;
+ }
+
+ } else if (buffer != NULL) {
+ memcpy(p, buffer->u.u8, length);
+
+ } else {
+ p += length - 1;
+
+ while (length != 0) {
+ njs_set_number(&index, length - 1);
+
+ ret = njs_value_property(vm, value, &index, &prop);
+ if (njs_slow_path(ret == NJS_ERROR)) {
+ return ret;
+ }
+
+ ret = njs_value_to_uint32(vm, &prop, &u32);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+
+ *p-- = (u_char) u32;
+ length--;
+ }
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_262_bytes_from_string(njs_vm_t *vm, const njs_value_t *string,
+ const njs_value_t *encoding, njs_value_t *retval)
+{
+ njs_str_t enc, str;
+
+ if (!njs_is_string(encoding)) {
+ njs_type_error(vm, "\"encoding\" must be a string");
+ return NJS_ERROR;
+ }
+
+ njs_string_get(encoding, &enc);
+ njs_string_get(string, &str);
+
+ if (enc.length == 3 && memcmp(enc.start, "hex", 3) == 0) {
+ return njs_string_decode_hex(vm, retval, &str);
+
+ } else if (enc.length == 6 && memcmp(enc.start, "base64", 6) == 0) {
+ return njs_string_decode_base64(vm, retval, &str);
+
+ } else if (enc.length == 9 && memcmp(enc.start, "base64url", 9) == 0) {
+ return njs_string_decode_base64url(vm, retval, &str);
+ }
+
+ njs_type_error(vm, "Unknown encoding: \"%V\"", &enc);
+
+ return NJS_ERROR;
+}
+
+
+/*
+ * $262.byteString(array-like).
+ * Converts an array-like object containing octets into a byte string.
+ *
+ * $262.byteString(string[, encoding]).
+ * Converts a string using provided encoding: hex, base64, base64url to
+ * a byte string.
+ *
+ * Note: the function produces a byte string, and byte strings are deprecated.
+ * The function is provided for testing of existing code which works with
+ * byte strings. When code working with byte strings is removed
+ * the function will be removed as well.
+ */
+
+static njs_int_t
+njs_262_byte_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused, njs_value_t *retval)
+{
+ njs_value_t *value;
+
+ value = njs_arg(args, nargs, 1);
+
+ if (njs_is_string(value)) {
+ return njs_262_bytes_from_string(vm, value, njs_arg(args, nargs, 2),
+ retval);
+
+ } else if (njs_is_object(value)) {
+
+ if (njs_is_object_string(value)) {
+ value = njs_object_value(value);
+ return njs_262_bytes_from_string(vm, value,
+ njs_arg(args, nargs, 2),
+ retval);
+ }
+
+ return njs_262_bytes_from_array_like(vm, value, retval);
+ }
+
+ njs_type_error(vm, "value must be a string or array-like object");
+
+ return NJS_ERROR;
+}
+
+
static njs_external_t njs_unit_test_262_external[] = {
{
@@ -591,6 +753,17 @@ static njs_external_t njs_unit_test_262
}
},
+ {
+ .flags = NJS_EXTERN_METHOD,
+ .name.string = njs_str("byteString"),
+ .writable = 1,
+ .configurable = 1,
+ .enumerable = 1,
+ .u.method = {
+ .native = njs_262_byte_string,
+ }
+ },
+
};
diff -r 314a2a9fe9c7 -r 4df790f42ce7 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Fri May 05 20:08:55 2023 -0700
+++ b/src/test/njs_unit_test.c Fri May 05 20:08:56 2023 -0700
@@ -1047,56 +1047,9 @@ static njs_unit_test_t njs_test[] =
{ njs_str("undefined - undefined"),
njs_str("NaN") },
- /* String.toString() method. */
-
{ njs_str("'A'.toString()"),
njs_str("A") },
- { njs_str("'A'.toBytes().toString('latin1')"),
- njs_str("TypeError: Unknown encoding: \"latin1\"") },
-
- { njs_str("'ABCD'.toBytes().toString('hex')"),
- njs_str("41424344") },
-
- { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('hex')"),
- njs_str("00aabbff") },
-
- { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64')"),
- njs_str("AKq7/w==") },
-
- { njs_str("'ABCD'.toBytes().toString('base64')"),
- njs_str("QUJDRA==") },
-
- { njs_str("'ABC'.toBytes().toString('base64')"),
- njs_str("QUJD") },
-
- { njs_str("'AB'.toBytes().toString('base64')"),
- njs_str("QUI=") },
-
- { njs_str("'A'.toBytes().toString('base64')"),
- njs_str("QQ==") },
-
- { njs_str("''.toBytes().toString('base64')"),
- njs_str("") },
-
- { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64url')"),
- njs_str("AKq7_w") },
-
- { njs_str("'ABCD'.toBytes().toString('base64url')"),
- njs_str("QUJDRA") },
-
- { njs_str("'ABC'.toBytes().toString('base64url')"),
- njs_str("QUJD") },
-
- { njs_str("'AB'.toBytes().toString('base64url')"),
- njs_str("QUI") },
-
- { njs_str("'A'.toBytes().toString('base64url')"),
- njs_str("QQ") },
-
- { njs_str("''.toBytes().toString('base64url')"),
- njs_str("") },
-
/* Assignment. */
{ njs_str("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
@@ -4348,7 +4301,7 @@ static njs_unit_test_t njs_test[] =
{ njs_str("["
" 'α'.repeat(33),"
- " String.bytesFrom(Array(16).fill(0x9d)),"
+ " $262.byteString(Array(16).fill(0x9d)),"
"]"
".map(v=>{var out = ['β', 'γ'].join(v); return out.length})"),
njs_str("35,20") },
@@ -4369,7 +4322,7 @@ static njs_unit_test_t njs_test[] =
{ njs_str("var a = ['β','γ']; a.join('').length"),
njs_str("2") },
- { njs_str("var a = ['β', String.bytesFrom([0x9d]),'γ']; a.join('').length"),
+ { njs_str("var a = ['β', $262.byteString([0x9d]),'γ']; a.join('').length"),
njs_str("5") },
{ njs_str("var a = []; a[5] = 5; a.join()"),
@@ -4708,7 +4661,7 @@ static njs_unit_test_t njs_test[] =
{ njs_str("Array.prototype.slice.call('αβZγ')"),
njs_str("α,β,Z,γ") },
- { njs_str("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
+ { njs_str("Array.prototype.slice.call($262.byteString(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
njs_str("157") },
{ njs_str("Array.prototype.slice.call('αβZγ', 1)"),
@@ -7809,37 +7762,34 @@ static njs_unit_test_t njs_test[] =
{ njs_str("(new String('abc')).hasOwnProperty('length')"),
njs_str("true") },
- { njs_str("'abc'.toUTF8().length"),
- njs_str("3") },
-
{ njs_str("'абв'.length"),
njs_str("3") },
- { njs_str("'абв'.toUTF8().length"),
+ { njs_str("(new TextEncoder()).encode('абв').length"),
njs_str("6") },
{ njs_str("'αβγ'.length"),
njs_str("3") },
- { njs_str("'αβγ'.toUTF8().length"),
+ { njs_str("(new TextEncoder()).encode('αβγ').length"),
njs_str("6") },
{ njs_str("'絵文字'.length"),
njs_str("3") },
- { njs_str("'絵文字'.toUTF8().length"),
+ { njs_str("(new TextEncoder()).encode('絵文字').length"),
njs_str("9") },
{ njs_str("'えもじ'.length"),
njs_str("3") },
- { njs_str("'えもじ'.toUTF8().length"),
+ { njs_str("(new TextEncoder()).encode('えもじ').length"),
njs_str("9") },
{ njs_str("'囲碁織'.length"),
njs_str("3") },
- { njs_str("'囲碁織'.toUTF8().length"),
+ { njs_str("(new TextEncoder()).encode('囲碁織').length"),
njs_str("9") },
{ njs_str("var a = 'abc'; a.length"),
@@ -7995,76 +7945,12 @@ static njs_unit_test_t njs_test[] =
"var a = 'abc'; a.concat('абв', s)"),
njs_str("abcабв123") },
- { njs_str("'\\u00CE\\u00B1'.toBytes() == 'α'"),
- njs_str("true") },
-
- { njs_str("'\\u00CE\\u00B1'.toBytes() === 'α'"),
- njs_str("true") },
-
- { njs_str("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
- "b.length +' '+ b +' '+ u.length +' '+ u"),
- njs_str("2 ¶ 1 ¶") },
-
- { njs_str("'α'.toBytes()"),
- njs_str("null") },
-
- { njs_str("'α'.toUTF8()[0]"),
- njs_str("\xCE") },
-
{ njs_str("var r = /^\\x80$/; r.source + r.source.length"),
njs_str("^\\x80$6") },
{ njs_str("var r = /^\\\\x80$/; r.source + r.source.length"),
njs_str("^\\\\x80$7") },
- { njs_str("/^\\x80$/.test('\\x80'.toBytes())"),
- njs_str("true") },
-
- { njs_str("/^\\xC2\\x80$/.test('\\x80'.toUTF8())"),
- njs_str("true") },
-
- { njs_str("'α'.toUTF8().toBytes()"),
- njs_str("α") },
-
- { njs_str("var a = 'a'.toBytes() + 'α'; a + a.length"),
- njs_str("aα3") },
-
- { njs_str("var a = 'µ§±®'.toBytes(); a"),
- njs_str("\xB5\xA7\xB1\xAE") },
-
- { njs_str("var a = 'µ§±®'.toBytes(2); a"),
- njs_str("\xB1\xAE") },
-
- { njs_str("var a = 'µ§±®'.toBytes(1,3); a"),
- njs_str("\xA7\xB1") },
-
- { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
- njs_str("µ§±®") },
-
- { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
- njs_str("±®") },
-
- { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
- njs_str("§±") },
-
- { njs_str("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
- njs_str("true") },
-
- { njs_str("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
- njs_str("true") },
-
- { njs_str("'A'.repeat(38).toBytes(-5) === 'AAAAA'"),
- njs_str("true") },
-
- { njs_str("('α' + 'A'.repeat(32)).toBytes()"),
- njs_str("null") },
-
- { njs_str("('α' + 'A'.repeat(32)).toBytes(1) === 'A'.repeat(32)"),
- njs_str("true") },
-
- { njs_str("('α' + 'A'.repeat(40)).toBytes(-3,-1)"),
- njs_str("AA") },
-
{ njs_str("var s = 'x'.repeat(2**10).repeat(2**14);"
"var a = Array(200).fill(s);"
"String.prototype.concat.apply(s, a.slice(1))"),
@@ -8160,9 +8046,6 @@ static njs_unit_test_t njs_test[] =
{ njs_str("String.prototype.slice(1, 5)"),
njs_str("") },
- { njs_str("String.prototype.toBytes(1, 5)"),
- njs_str("") },
-
{ njs_str("'abc'.charAt(1 + 1)"),
njs_str("c") },
@@ -8461,9 +8344,6 @@ static njs_unit_test_t njs_test[] =
{ njs_str("var r = new String('undefined').indexOf(x); var x; r"),
njs_str("0") },
- { njs_str("'a a'.toUTF8().indexOf('a', 1)"),
- njs_str("2") },
-
{ njs_str("'aaa'.lastIndexOf()"),
njs_str("-1") },
@@ -8658,9 +8538,6 @@ static njs_unit_test_t njs_test[] =
{ njs_str("'\x00абвгдеёжз'.toUpperCase().length"),
njs_str("10") },
- { njs_str("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
- njs_str("2,3,3,2") },
-
#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long tests under MSAN */
{ njs_str("var a = [], code;"
"for (code = 0; code <= 1114111; code++) {"
@@ -8863,16 +8740,6 @@ static njs_unit_test_t njs_test[] =
{ njs_str("var r = 'αβγ'.replaceAll('', 'X'); [r, r.length]"),
njs_str("XαXβXγX,7") },
- { njs_str("var s = 'αz'.toUTF8();"
- "var r = s.replace('z', 'β');"
- "r.length"),
- njs_str("4") },
-
- { njs_str("var s = 'αzz'.toUTF8();"
- "var r = s.replaceAll('z', 'β');"
- "r.length"),
- njs_str("3") },
-
{ njs_str("'abc'.replace('b', (m, o, s) => `|${s}|${o}|${m}|`)"),
njs_str("a|abc|1|b|c") },
@@ -9648,10 +9515,6 @@ static njs_unit_test_t njs_test[] =
{ njs_str("('β' + 'α'.repeat(33) +'β').match(/α+/g)[0][32]"),
njs_str("α") },
- { njs_str("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
- "a +' '+ a.length"),
- njs_str("αα 4") },
-
{ njs_str("'abc'.split()"),
njs_str("abc") },
@@ -9915,92 +9778,8 @@ static njs_unit_test_t njs_test[] =
njs_str("TypeError: Cannot convert a Symbol value to a string") },
{ njs_str("[undefined, null, Symbol()]"
- ".every(v=> { try {String.bytesFrom(v);} catch(e) {return e.name == 'TypeError'} })"),
- njs_str("true") },
-
- { njs_str("String.bytesFrom({}).length"),
- njs_str("0") },
-
- { njs_str("String.bytesFrom({length:5, 0:'A'.charCodeAt(0), 2:'X', 3:NaN,4:0xfd}).toString('hex')"),
- njs_str("41000000fd") },
-
- { njs_str("String.bytesFrom([1, 2, 0.23, '5', 'A']).toString('hex')"),
- njs_str("0102000500") },
-
- { njs_str("String.bytesFrom([NaN, Infinity]).toString('hex')"),
- njs_str("0000") },
-
- { njs_str("String.bytesFrom(new Uint8Array([0xff,0xde,0xba])).toString('hex')"),
- njs_str("ffdeba") },
-
- { njs_str("String.bytesFrom((new Uint8Array([0xff,0xde,0xba])).buffer).toString('hex')"),
- njs_str("ffdeba") },
-
- { njs_str("String.bytesFrom('', 'hex')"),
- njs_str("") },
-
- { njs_str("String.bytesFrom('00aabbcc', 'hex').toString('hex')"),
- njs_str("00aabbcc") },
-
- { njs_str("String.bytesFrom(new String('00aabbcc'), 'hex').toString('hex')"),
- njs_str("00aabbcc") },
-
- { njs_str("String.bytesFrom('deadBEEF##', 'hex').toString('hex')"),
- njs_str("deadbeef") },
-
- { njs_str("String.bytesFrom('aa0', 'hex').toString('hex')"),
- njs_str("aa") },
-
- { njs_str("String.bytesFrom('', 'base64')"),
- njs_str("") },
-
- { njs_str("String.bytesFrom('#', 'base64')"),
- njs_str("") },
-
- { njs_str("String.bytesFrom('QQ==', 'base64')"),
- njs_str("A") },
-
- { njs_str("String.bytesFrom('QQ=', 'base64')"),
- njs_str("A") },
More information about the nginx-devel
mailing list