]> git.kaiwu.me - njs.git/commitdiff
Added njs_vm_value_string_create() and njs_vm_value_string_create_chb().
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 21 Jan 2023 04:15:03 +0000 (20:15 -0800)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 21 Jan 2023 04:15:03 +0000 (20:15 -0800)
Unlike njs_vm_value_string_set() the new functions always check the
input string for a valid UTF8 and calculate UTF8 character length by
themselves.

src/njs.h
src/njs_chb.h
src/njs_json.c
src/njs_regexp.c
src/njs_string.c
src/njs_string.h
src/njs_vm.c
src/test/njs_unit_test.c

index e481c1bb968d770d98c43a93776ad21de6280740..95c41259aa63b4b7547611dd2e7b11cc2d181d93 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -411,6 +411,10 @@ NJS_EXPORT njs_int_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value,
     const u_char *start, uint32_t size);
 NJS_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value,
     uint32_t size);
+NJS_EXPORT njs_int_t njs_vm_value_string_create(njs_vm_t *vm,
+    njs_value_t *value, const u_char *start, uint32_t size);
+NJS_EXPORT njs_int_t njs_vm_value_string_create_chb(njs_vm_t *vm,
+    njs_value_t *value, njs_chb_t *chain);
 NJS_EXPORT njs_int_t njs_vm_value_string_copy(njs_vm_t *vm, njs_str_t *retval,
     njs_value_t *value, uintptr_t *next);
 NJS_EXPORT njs_int_t njs_vm_string_compare(const njs_value_t *v1,
index 8e3521f9a3be8186f5c779d92a5c5ddbaf3023c3..d4719f36d77c963a2353f4182d387789a4cea4c7 100644 (file)
@@ -105,7 +105,7 @@ njs_chb_utf8_length(njs_chb_t *chain)
     while (n != NULL) {
         len = njs_utf8_length(n->start, njs_chb_node_size(n));
         if (njs_slow_path(len < 0)) {
-            return 0;
+            return -1;
         }
 
         length += len;
index a8d314a9f55a71bc4bef9a72b6b7f54fcd591be5..0b7d1cb8f51a28ee0af1de70b0cd4ea43480137a 100644 (file)
@@ -1090,8 +1090,7 @@ static njs_int_t
 njs_json_stringify_iterator(njs_vm_t *vm, njs_json_stringify_t *stringify,
     njs_value_t *object)
 {
-    u_char            *p;
-    int64_t           size, length;
+    int64_t           size;
     njs_int_t         ret;
     njs_chb_t         chain;
     njs_value_t       *key, *value, index, wrapper;
@@ -1224,16 +1223,12 @@ done:
         goto release;
     }
 
-    length = njs_chb_utf8_length(&chain);
-
-    p = njs_string_alloc(vm, &vm->retval, size, length);
-    if (njs_slow_path(p == NULL)) {
+    ret = njs_string_create_chb(vm, &vm->retval, &chain);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_chb_destroy(&chain);
         goto memory_error;
     }
 
-    njs_chb_join_to(&chain, p);
-
 release:
 
     njs_chb_destroy(&chain);
index eaff427a4ae3b1e7c72351bb11735535ab24c316..4f7caad2b782592f11066a483a537759b7522ae2 100644 (file)
@@ -1197,8 +1197,7 @@ static njs_int_t
 njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused)
 {
-    u_char             *p;
-    int64_t            n, last_index, ncaptures, pos, next_pos, size, length;
+    int64_t            n, last_index, ncaptures, pos, next_pos, length;
     njs_str_t          rep, m;
     njs_int_t          ret;
     njs_arr_t          results;
@@ -1455,23 +1454,12 @@ njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args,
         njs_chb_append(&chain, &s.start[next_pos], s.size - next_pos);
     }
 
-    size = njs_chb_size(&chain);
-    if (njs_slow_path(size < 0)) {
-        njs_memory_error(vm);
-        ret = NJS_ERROR;
-        goto exception;
-    }
-
-    length = njs_chb_utf8_length(&chain);
-
-    p = njs_string_alloc(vm, &vm->retval, size, length);
-    if (njs_slow_path(p == NULL)) {
+    ret = njs_string_create_chb(vm, &vm->retval, &chain);
+    if (njs_slow_path(ret != NJS_OK)) {
         ret = NJS_ERROR;
         goto exception;
     }
 
-    njs_chb_join_to(&chain, p);
-
     ret = NJS_OK;
 
 exception:
index 3b9bb9aeb70d2eaf8dea36d2bc3be8389c2feff6..3a998973f9d4d6a16321146d559ef3b8a05733d3 100644 (file)
@@ -146,6 +146,35 @@ njs_string_create(njs_vm_t *vm, njs_value_t *value, const char *src,
 }
 
 
+njs_int_t
+njs_string_create_chb(njs_vm_t *vm, njs_value_t *value, njs_chb_t *chain)
+{
+    u_char   *p;
+    ssize_t  size, length;
+
+    size = njs_chb_size(chain);
+    if (njs_slow_path(size < 0)) {
+        njs_memory_error(vm);
+        return NJS_ERROR;
+    }
+
+    length = njs_chb_utf8_length(chain);
+    if (njs_slow_path(length < 0)) {
+        njs_memory_error(vm);
+        return NJS_ERROR;
+    }
+
+    p = njs_string_alloc(vm, value, size, length);
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
+    }
+
+    njs_chb_join_to(chain, p);
+
+    return NJS_OK;
+}
+
+
 njs_int_t
 njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
     uint32_t size, uint32_t length)
@@ -3489,7 +3518,7 @@ njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
     njs_value_t *string, int64_t pos, njs_value_t *captures, int64_t ncaptures,
     njs_value_t *groups, njs_value_t *replacement, njs_value_t *retval)
 {
-    int64_t      tail, size, length, n;
+    int64_t      tail, n;
     u_char       c, c2, *p, *r, *end;
     njs_str_t    rep, m, str, cap;
     njs_int_t    ret;
@@ -3620,23 +3649,12 @@ njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
 
 done:
 
-    size = njs_chb_size(&chain);
-    if (njs_slow_path(size < 0)) {
-        njs_memory_error(vm);
-        ret = NJS_ERROR;
-        goto exception;
-    }
-
-    length = njs_chb_utf8_length(&chain);
-
-    p = njs_string_alloc(vm, retval, size, length);
-    if (njs_slow_path(p == NULL)) {
+    ret = njs_string_create_chb(vm, retval, &chain);
+    if (njs_slow_path(ret != NJS_OK)) {
         ret = NJS_ERROR;
         goto exception;
     }
 
-    njs_chb_join_to(&chain, p);
-
     ret = NJS_OK;
 
 exception:
index 99f9d145869bd3500cc2522840ddf1fe2a98e52f..2ca7e90dae11a7e385d0050a6441fd07f7ec0291 100644 (file)
@@ -200,6 +200,8 @@ njs_int_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
     uint32_t size, uint32_t length);
 njs_int_t njs_string_create(njs_vm_t *vm, njs_value_t *value, const char *src,
     size_t size);
+njs_int_t njs_string_create_chb(njs_vm_t *vm, njs_value_t *value,
+    njs_chb_t *chain);
 
 void njs_encode_hex(njs_str_t *dst, const njs_str_t *src);
 size_t njs_encode_hex_length(const njs_str_t *src, size_t *out_size);
index b3a1697ef2f0cc5e3915c2f6a05c1916b0417175..923177e15ae27cc576b0009cdaae47a1bf27b81e 100644 (file)
@@ -832,6 +832,22 @@ njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size)
 }
 
 
+njs_int_t
+njs_vm_value_string_create(njs_vm_t *vm, njs_value_t *value,
+    const u_char *start, uint32_t size)
+{
+    return njs_string_create(vm, value, (const char *) start, size);
+}
+
+
+njs_int_t
+njs_vm_value_string_create_chb(njs_vm_t *vm, njs_value_t *value,
+    njs_chb_t *chain)
+{
+    return njs_string_create_chb(vm, value, chain);
+}
+
+
 njs_function_t *
 njs_vm_function(njs_vm_t *vm, const njs_str_t *path)
 {
index cf7a5404542d7d7449d256fefed2ee2230a666e7..68b7f6ee94bc9ab85bbdd95ce5004b4a2a2af4b5 100644 (file)
@@ -8984,9 +8984,6 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("'abc'.replace(/b/g, '$0')"),
       njs_str("a$0c") },
 
-    { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"),
-      njs_str("string") },
-
     { njs_str("'abc'.replace(/^/g, '|$&|')"),
       njs_str("||abc") },
 
@@ -9060,12 +9057,6 @@ static njs_unit_test_t  njs_test[] =
               "r[Symbol.replace]('foo', function() {m = arguments[0]}); [m, typeof m]"),
       njs_str("undefined,string") },
 
-    { njs_str("String.bytesFrom([253,242,141,10]).replace(/\\s/g, 'X')[3]"),
-      njs_str("X") },
-
-    { njs_str("String.bytesFrom([255,149,15,97,95]).replace(/_/g, 'X')[4]"),
-      njs_str("X") },
-
     { njs_str("var a = [];"
               "a[2] = '';"
               "var re = /any_regexp/;"
@@ -9271,9 +9262,6 @@ static njs_unit_test_t  njs_test[] =
                  "a +' '+ a.length"),
       njs_str("αα 4") },
 
-    { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"),
-      njs_str("object") },
-
     { njs_str("'abc'.split()"),
       njs_str("abc") },
 
@@ -18082,9 +18070,6 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"),
       njs_str("\"α¶\"") },
 
-    { njs_str("JSON.stringify('µ§±®'.toBytes())"),
-      njs_str("\"\xB5\xA7\xB1\xAE\"") },
-
     /* Optional arguments. */
 
     { njs_str("JSON.stringify(undefined, undefined, 1)"),