details: https://hg.nginx.org/njs/rev/2d098d2a1c85 branches: changeset: 2333:2d098d2a1c85 user: Dmitry Volyntsev <xei...@nginx.com> date: Tue May 21 23:41:10 2024 -0700 description: Removed code for byte strings in built-in functions.
diffstat: src/njs_array.c | 52 ++++++++------------------------------ src/njs_iterator.c | 2 +- src/njs_json.c | 9 +----- src/njs_object.c | 4 +- src/njs_regexp.c | 16 +++-------- src/njs_string.c | 65 +++++++++++++++++------------------------------ src/njs_string.h | 20 ++----------- src/njs_vmcode.c | 9 ------ src/test/njs_unit_test.c | 30 +--------------------- 9 files changed, 49 insertions(+), 158 deletions(-) diffs (596 lines): diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_array.c --- a/src/njs_array.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_array.c Tue May 21 23:41:10 2024 -0700 @@ -826,29 +826,15 @@ njs_array_prototype_slice_copy(njs_vm_t src = string.start; end = src + string.size; - if (string.length == 0) { - /* Byte string. */ - do { - value = &array->start[n++]; - dst = njs_string_short_start(value); - *dst = *src++; - njs_string_short_set(value, 1, 0); - - length--; - } while (length != 0); - - } else { - /* UTF-8 or ASCII string. */ - do { - value = &array->start[n++]; - dst = njs_string_short_start(value); - dst = njs_utf8_copy(dst, &src, end); - size = dst - njs_string_short_start(value); - njs_string_short_set(value, size, 1); - - length--; - } while (length != 0); - } + do { + value = &array->start[n++]; + dst = njs_string_short_start(value); + dst = njs_utf8_copy(dst, &src, end); + size = dst - njs_string_short_start(value); + njs_string_short_set(value, size, 1); + + length--; + } while (length != 0); } else if (njs_is_object(this)) { @@ -1647,11 +1633,10 @@ static njs_int_t njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval) { - u_char *p, *last; + u_char *p; int64_t i, size, len, length; njs_int_t ret; njs_chb_t chain; - njs_utf8_t utf8; njs_value_t *value, *this, entry; njs_string_prop_t separator, string; @@ -1684,7 +1669,6 @@ njs_array_prototype_join(njs_vm_t *vm, n } length = 0; - utf8 = njs_is_byte_string(&separator) ? NJS_STRING_BYTE : NJS_STRING_UTF8; ret = njs_object_length(vm, this, &len); if (njs_slow_path(ret == NJS_ERROR)) { @@ -1708,29 +1692,15 @@ njs_array_prototype_join(njs_vm_t *vm, n if (!njs_is_null_or_undefined(value)) { if (!njs_is_string(value)) { - last = njs_chb_current(&chain); - ret = njs_value_to_chain(vm, &chain, value); if (njs_slow_path(ret < NJS_OK)) { return ret; } - if (last != njs_chb_current(&chain) && ret == 0) { - /* - * Appended values was a byte string. - */ - utf8 = NJS_STRING_BYTE; - } - length += ret; } else { (void) njs_string_prop(&string, value); - - if (njs_is_byte_string(&string)) { - utf8 = NJS_STRING_BYTE; - } - length += string.length; njs_chb_append(&chain, string.start, string.size); } @@ -1755,7 +1725,7 @@ njs_array_prototype_join(njs_vm_t *vm, n length -= separator.length; - p = njs_string_alloc(vm, retval, size, utf8 ? length : 0); + p = njs_string_alloc(vm, retval, size, length); if (njs_slow_path(p == NULL)) { return NJS_ERROR; } diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_iterator.c --- a/src/njs_iterator.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_iterator.c Tue May 21 23:41:10 2024 -0700 @@ -355,7 +355,7 @@ njs_object_iterate(njs_vm_t *vm, njs_ite end = p + string_prop.size; if ((size_t) length == string_prop.size) { - /* Byte or ASCII string. */ + /* ASCII string. */ for (i = from; i < to; i++) { /* This cannot fail. */ diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_json.c --- a/src/njs_json.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_json.c Tue May 21 23:41:10 2024 -0700 @@ -226,13 +226,6 @@ njs_json_stringify(njs_vm_t *vm, njs_val switch (space->type) { case NJS_STRING: length = njs_string_prop(&prop, space); - - if (njs_is_byte_string(&prop)) { - njs_internal_error(vm, "space argument cannot be" - " a byte string"); - return NJS_ERROR; - } - p = njs_string_offset(&prop, njs_min(length, 10)); stringify->space.start = prop.start; @@ -1552,7 +1545,7 @@ njs_json_append_string(njs_chb_t *chain, dst = njs_utf8_copy(dst, &p, end); } else { - /* Byte or ASCII string. */ + /* ASCII string. */ *dst++ = *p++; } diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_object.c --- a/src/njs_object.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_object.c Tue May 21 23:41:10 2024 -0700 @@ -741,7 +741,7 @@ njs_object_enumerate_string(njs_vm_t *vm case NJS_ENUM_VALUES: if (str_prop.size == (size_t) len) { - /* Byte or ASCII string. */ + /* ASCII string. */ for (i = 0; i < len; i++) { begin = njs_string_short_start(item); @@ -774,7 +774,7 @@ njs_object_enumerate_string(njs_vm_t *vm case NJS_ENUM_BOTH: if (str_prop.size == (size_t) len) { - /* Byte or ASCII string. */ + /* ASCII string. */ for (i = 0; i < len; i++) { diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_regexp.c --- a/src/njs_regexp.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_regexp.c Tue May 21 23:41:10 2024 -0700 @@ -748,12 +748,6 @@ njs_regexp_prototype_to_string(njs_vm_t size = source_string.size + flags_string.size + njs_length("//"); length = source_string.length + flags_string.length + njs_length("//"); - if (njs_is_byte_string(&source_string) - || njs_is_byte_string(&flags_string)) - { - length = 0; - } - p = njs_string_alloc(vm, retval, size, length); if (njs_slow_path(p == NULL)) { return NJS_ERROR; @@ -908,13 +902,13 @@ njs_regexp_builtin_exec(njs_vm_t *vm, nj goto not_found; } - utf8 = NJS_STRING_BYTE; + utf8 = NJS_STRING_ASCII; type = NJS_REGEXP_BYTE; if (string.length != 0) { type = NJS_REGEXP_UTF8; - if (string.length != string.size) { + if (!njs_is_ascii_string(&string)) { utf8 = NJS_STRING_UTF8; } } @@ -1693,7 +1687,7 @@ njs_regexp_prototype_symbol_split(njs_vm arguments[0] = *rx; if (!sticky) { - length = njs_is_byte_string(&s) ? 0 : s.length + 1; + length = s.length + 1; dst = njs_string_alloc(vm, &arguments[1], s.size + 1, length); if (njs_slow_path(dst == NULL)) { @@ -1749,9 +1743,9 @@ njs_regexp_prototype_symbol_split(njs_vm goto single; } - utf8 = NJS_STRING_BYTE; + utf8 = NJS_STRING_ASCII; - if (!njs_is_byte_or_ascii_string(&s)) { + if (!njs_is_ascii_string(&s)) { utf8 = NJS_STRING_UTF8; } diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_string.c --- a/src/njs_string.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_string.c Tue May 21 23:41:10 2024 -0700 @@ -186,6 +186,8 @@ njs_string_new(njs_vm_t *vm, njs_value_t { u_char *p; + njs_assert((size == 0 && length == 0) || (size != 0 && length != 0)); + p = njs_string_alloc(vm, value, size, length); if (njs_fast_path(p != NULL)) { @@ -880,10 +882,6 @@ njs_string_prototype_concat(njs_vm_t *vm size += string.size; length += string.length; - - if (njs_is_byte_string(&string)) { - mask = 0; - } } length &= mask; @@ -1238,15 +1236,10 @@ njs_string_slice_string_prop(njs_string_ start = string->start; if (string->size == slice->string_length) { - /* Byte or ASCII string. */ + /* ASCII string. */ start += slice->start; size = slice->length; - if (string->length == 0) { - /* Byte string. */ - length = 0; - } - } else { /* UTF-8 string. */ end = start + string->size; @@ -1327,7 +1320,7 @@ njs_string_prototype_char_code_at(njs_vm } if (length == string.size) { - /* Byte or ASCII string. */ + /* ASCII string. */ code = string.start[index]; } else { @@ -1715,20 +1708,20 @@ njs_string_index_of(njs_string_prop_t *s size_t index, length, search_length; const u_char *p, *end; - length = (string->length == 0) ? string->size : string->length; - - if (njs_slow_path(search->size == 0)) { + length = string->length; + + if (njs_slow_path(search->length == 0)) { return (from < length) ? from : length; } index = from; - search_length = (search->length == 0) ? search->size : search->length; + search_length = search->length; if (length - index >= search_length) { end = string->start + string->size; if (string->size == length) { - /* Byte or ASCII string. */ + /* ASCII string. */ end -= (search->size - 1); @@ -1863,7 +1856,7 @@ njs_string_prototype_last_index_of(njs_v end = string.start + string.size; if (string.size == (size_t) length) { - /* Byte or ASCII string. */ + /* ASCII string. */ p = &string.start[index]; @@ -2209,7 +2202,7 @@ njs_string_prototype_to_lower_case(njs_v (void) njs_string_prop(&string, njs_argument(args, 0)); - if (njs_is_byte_or_ascii_string(&string)) { + if (njs_is_ascii_string(&string)) { p = njs_string_alloc(vm, retval, string.size, string.length); if (njs_slow_path(p == NULL)) { @@ -2280,7 +2273,7 @@ njs_string_prototype_to_upper_case(njs_v (void) njs_string_prop(&string, njs_argument(args, 0)); - if (njs_is_byte_or_ascii_string(&string)) { + if (njs_is_ascii_string(&string)) { p = njs_string_alloc(vm, retval, string.size, string.length); if (njs_slow_path(p == NULL)) { @@ -2343,7 +2336,7 @@ njs_string_trim(const njs_value_t *value start = string->start; end = string->start + string->size; - if (njs_is_byte_or_ascii_string(string)) { + if (njs_is_ascii_string(string)) { if (mode & NJS_TRIM_START) { for ( ;; ) { @@ -2831,14 +2824,13 @@ njs_string_match_multiple(njs_vm_t *vm, (void) njs_string_prop(&string, &args[0]); - utf8 = NJS_STRING_BYTE; + utf8 = NJS_STRING_ASCII; type = NJS_REGEXP_BYTE; if (string.length != 0) { - utf8 = NJS_STRING_ASCII; type = NJS_REGEXP_UTF8; - if (string.length != string.size) { + if (!njs_is_ascii_string(&string)) { utf8 = NJS_STRING_UTF8; } } @@ -2877,7 +2869,7 @@ njs_string_match_multiple(njs_vm_t *vm, if (c1 == 0) { if (start < end) { - p = (utf8 != NJS_STRING_BYTE) ? njs_utf8_next(start, end) + p = (utf8 == NJS_STRING_UTF8) ? njs_utf8_next(start, end) : start + 1; string.size = end - p; @@ -3006,12 +2998,10 @@ njs_string_prototype_split(njs_vm_t *vm, goto done; } - utf8 = NJS_STRING_BYTE; + utf8 = NJS_STRING_ASCII; if (string.length != 0) { - utf8 = NJS_STRING_ASCII; - - if (string.length != string.size) { + if (!njs_is_ascii_string(&string)) { utf8 = NJS_STRING_UTF8; } } @@ -3037,7 +3027,7 @@ found: /* Empty split string. */ if (p == next) { - p = (utf8 != NJS_STRING_BYTE) ? njs_utf8_next(p, end) + p = (utf8 == NJS_STRING_UTF8) ? njs_utf8_next(p, end) : p + 1; next = p; } @@ -3241,7 +3231,7 @@ njs_string_prototype_replace(njs_vm_t *v njs_int_t ret; njs_str_t str; njs_chb_t chain; - njs_bool_t is_byte_or_ascii_string; + njs_bool_t is_ascii_string; njs_value_t *this, *search, *replace; njs_value_t search_lvalue, replace_lvalue, replacer, value, arguments[3]; @@ -3372,13 +3362,6 @@ njs_string_prototype_replace(njs_vm_t *v size = string.size + ret_string.size - s.size; length = string.length + ret_string.length - s.length; - if (njs_is_byte_string(&string) - || njs_is_byte_string(&s) - || njs_is_byte_string(&ret_string)) - { - length = 0; - } - r = njs_string_alloc(vm, retval, size, length); if (njs_slow_path(r == NULL)) { return NJS_ERROR; @@ -3395,7 +3378,7 @@ njs_string_prototype_replace(njs_vm_t *v p_start = string.start; increment = s.length != 0 ? s.length : 1; - is_byte_or_ascii_string = njs_is_byte_or_ascii_string(&string); + is_ascii_string = njs_is_ascii_string(&string); do { if (func_replace == NULL) { @@ -3422,7 +3405,7 @@ njs_string_prototype_replace(njs_vm_t *v } } - if (is_byte_or_ascii_string) { + if (is_ascii_string) { p = string.start + pos; } else { @@ -3815,7 +3798,7 @@ njs_string_encode_uri(njs_vm_t *vm, njs_ src = string.start; end = src + string.size; - if (njs_is_byte_or_ascii_string(&string)) { + if (njs_is_ascii_string(&string)) { while (src < end) { byte = *src++; @@ -3871,7 +3854,7 @@ njs_string_encode_uri(njs_vm_t *vm, njs_ src = string.start; - if (njs_is_byte_or_ascii_string(&string)) { + if (njs_is_ascii_string(&string)) { (void) njs_string_encode(escape, string.size, src, dst); return NJS_OK; } diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_string.h --- a/src/njs_string.h Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_string.h Tue May 21 23:41:10 2024 -0700 @@ -91,8 +91,7 @@ typedef struct { typedef enum { - NJS_STRING_BYTE = 0, - NJS_STRING_ASCII, + NJS_STRING_ASCII = 0, NJS_STRING_UTF8, } njs_utf8_t; @@ -179,16 +178,9 @@ njs_int_t njs_string_get_substitution(nj njs_inline njs_bool_t -njs_is_byte_string(njs_string_prop_t *string) +njs_is_ascii_string(njs_string_prop_t *string) { - return (string->length == 0 && string->size != 0); -} - - -njs_inline njs_bool_t -njs_is_byte_or_ascii_string(njs_string_prop_t *string) -{ - return (string->length == 0 || string->length == string->size); + return string->length == string->size; } @@ -198,10 +190,6 @@ njs_string_calc_length(njs_utf8_t utf8, ssize_t length; switch (utf8) { - - case NJS_STRING_BYTE: - return 0; - case NJS_STRING_ASCII: return size; @@ -251,7 +239,7 @@ njs_string_encode(const uint32_t *escape njs_inline const u_char * njs_string_offset(njs_string_prop_t *string, int64_t index) { - if (njs_is_byte_or_ascii_string(string)) { + if (njs_is_ascii_string(string)) { return string->start + index; } diff -r 27da19960b72 -r 2d098d2a1c85 src/njs_vmcode.c --- a/src/njs_vmcode.c Tue May 21 23:38:19 2024 -0700 +++ b/src/njs_vmcode.c Tue May 21 23:41:10 2024 -0700 @@ -2318,15 +2318,6 @@ njs_string_concat(njs_vm_t *vm, njs_valu (void) njs_string_prop(&string2, val2); length = string1.length + string2.length; - - /* - * A result of concatenation of Byte and ASCII or UTF-8 strings - * is a Byte string. - */ - if (njs_is_byte_string(&string1) || njs_is_byte_string(&string2)) { - length = 0; - } - size = string1.size + string2.size; start = njs_string_alloc(vm, retval, size, length); diff -r 27da19960b72 -r 2d098d2a1c85 src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Tue May 21 23:38:19 2024 -0700 +++ b/src/test/njs_unit_test.c Tue May 21 23:41:10 2024 -0700 @@ -4372,10 +4372,9 @@ static njs_unit_test_t njs_test[] = { njs_str("[" " 'α'.repeat(33)," - " $262.byteString(Array(16).fill(0x9d))," "]" ".map(v=>{var out = ['β', 'γ'].join(v); return out.length})"), - njs_str("35,20") }, + njs_str("35") }, { njs_str("[" " []," @@ -4393,9 +4392,6 @@ static njs_unit_test_t njs_test[] = { njs_str("var a = ['β','γ']; a.join('').length"), njs_str("2") }, - { njs_str("var a = ['β', $262.byteString([0x9d]),'γ']; a.join('').length"), - njs_str("5") }, - { njs_str("var a = []; a[5] = 5; a.join()"), njs_str(",,,,,5") }, @@ -4764,9 +4760,6 @@ static njs_unit_test_t njs_test[] = { njs_str("Array.prototype.slice.call('αβZγ')"), njs_str("α,β,Z,γ") }, - { 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)"), njs_str("β,Z,γ") }, @@ -9941,10 +9934,6 @@ static njs_unit_test_t njs_test[] = { njs_str("'abc'.padEnd(10, Symbol())"), njs_str("TypeError: Cannot convert a Symbol value to a string") }, - { njs_str("[undefined, null, Symbol()]" - ".every(v=> { try {$262.byteString(v);} catch(e) {return e.name == 'TypeError'} })"), - njs_str("true") }, - { njs_str("encodeURI.name"), njs_str("encodeURI")}, @@ -11796,10 +11785,6 @@ static njs_unit_test_t njs_test[] = njs_str("3 БВ бв 2 /бв/gi") }, #endif - { njs_str("var r = /_/g; var index = r.exec($262.byteString([255,149,15,97,95])).index;" - "[index, r.lastIndex]"), - njs_str("4,5") }, - { njs_str("var descs = Object.getOwnPropertyDescriptors(RegExp('a'));" "Object.keys(descs)"), njs_str("lastIndex") }, @@ -12103,13 +12088,6 @@ static njs_unit_test_t njs_test[] = { njs_str("Error('e').name + ': ' + Error('e').message"), njs_str("Error: e") }, - { njs_str("Error($262.byteString(Array(1).fill(0x9d))).toString().length"), - njs_str("8") }, - - { njs_str("var e = Error('α'); e.name = $262.byteString(Array(1).fill(0x9d)); " - "e.toString().length"), - njs_str("5") }, - { njs_str("Error(1)"), njs_str("Error: 1") }, @@ -18565,9 +18543,6 @@ static njs_unit_test_t njs_test[] = { njs_str("JSON.stringify('абв'.repeat(100)).length"), njs_str("302") }, - { njs_str("JSON.stringify($262.byteString([0xCE, 0xB1, 0xC2, 0xB6]))"), - njs_str("\"α¶\"") }, - /* Optional arguments. */ { njs_str("JSON.stringify(undefined, undefined, 1)"), @@ -18601,9 +18576,6 @@ static njs_unit_test_t njs_test[] = { njs_str("JSON.stringify([1], null, '!!βββββββββββββββββ').length"), njs_str("15") }, - { njs_str("JSON.stringify([1], null, $262.byteString([0x9d])).length"), - njs_str("InternalError: space argument cannot be a byte string") }, - { njs_str("JSON.stringify([1], null, 11)"), njs_str("[\n 1\n]") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel