]> git.kaiwu.me - njs.git/commitdiff
Allowing to use custom allocator in njs_chb_t.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 26 Apr 2024 23:27:52 +0000 (16:27 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 26 Apr 2024 23:27:52 +0000 (16:27 -0700)
15 files changed:
external/njs_query_string_module.c
external/njs_xml_module.c
external/njs_zlib_module.c
nginx/ngx_js_fetch.c
src/njs_array.c
src/njs_chb.c
src/njs_chb.h
src/njs_error.c
src/njs_function.c
src/njs_json.c
src/njs_regexp.c
src/njs_string.c
src/njs_typed_array.c
src/njs_vm.c
src/test/njs_unit_test.c

index f97fb223898145622d34c3100154bada8a25f169..f61bb97a041332d3dd3c956f5f04527cfa39d8d2 100644 (file)
@@ -152,7 +152,7 @@ njs_query_string_decode(njs_vm_t *vm, njs_value_t *value, const u_char *start,
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     };
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
     njs_utf8_decode_init(&ctx);
 
     cp = 0;
@@ -749,7 +749,7 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         encode = njs_value_function(val);
     }
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     keys = njs_vm_object_keys(vm, object, njs_value_arg(&value));
     if (njs_slow_path(keys == NULL)) {
@@ -841,7 +841,7 @@ njs_query_string_escape(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     njs_value_string_get(string, &str);
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     ret = njs_query_string_encode(&chain, &str);
     if (njs_slow_path(ret != NJS_OK)) {
index a2be4d7fd3f072e23e3b594ad5d1c5ce6a0b0863..7fbc21a8ffdec7a1d40ea404f9664167bfee229b 100644 (file)
@@ -1788,7 +1788,7 @@ njs_xml_ext_canonicalization(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
     }
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     buf = xmlOutputBufferCreateIO(njs_xml_buf_write_cb, NULL, &chain, NULL);
     if (njs_slow_path(buf == NULL)) {
index 9e35c2e83b39852134f1d27b66d2616d511481e9..7945e646027def4fd6fc7d90c3d957929f780178 100644 (file)
@@ -320,7 +320,7 @@ njs_zlib_ext_deflate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
     }
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     do {
         stream.next_out = njs_chb_reserve(&chain, chunk_size);
@@ -461,7 +461,7 @@ njs_zlib_ext_inflate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
     }
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     while (rc != Z_STREAM_END) {
         stream.next_out = njs_chb_reserve(&chain, chunk_size);
index 6fb723d4b0becb513975b570cf15f5d7429d231b..d943f73cfe9cdfc489ebc37445ec30bae965f5e6 100644 (file)
@@ -740,7 +740,7 @@ ngx_js_ext_fetch(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     http->header_only = njs_strstr_eq(&request.method, &njs_str_value("HEAD"));
 
-    njs_chb_init(&http->chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&http->chain, vm);
 
     njs_chb_append(&http->chain, request.method.start, request.method.length);
     njs_chb_append_literal(&http->chain, " ");
@@ -1051,7 +1051,7 @@ ngx_js_ext_response_constructor(njs_vm_t *vm, njs_value_t *args,
         }
     }
 
-    njs_chb_init(&response->chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&response->chain, vm);
 
     body = njs_arg(args, nargs, 1);
 
@@ -2468,7 +2468,7 @@ ngx_js_http_process_headers(ngx_js_http_t *http)
 
     njs_chb_destroy(&http->chain);
 
-    njs_chb_init(&http->response.chain, njs_vm_memory_pool(http->vm));
+    NJS_CHB_MP_INIT(&http->response.chain, http->vm);
 
     http->process = ngx_js_http_process_body;
 
index e1a85a0d6b5c8c39c074824c8ff13faa55162cf4..ae6270b31ab141189943fd3cd5117e08d8280d25 100644 (file)
@@ -1698,7 +1698,7 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     value = &entry;
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     for (i = 0; i < len; i++) {
         ret = njs_value_property_i64(vm, this, i, value);
index 6c54ec8f3ae9d5cad14b524e221b4a52f41233b5..3ee2800948376b5780b4d6e161226ee7183a53af 100644 (file)
 #define NJS_CHB_MIN_SIZE       256
 
 
+void
+njs_chb_init(njs_chb_t *chain, void *pool, njs_chb_alloc_t alloc,
+    njs_chb_free_t free)
+{
+    chain->error = 0;
+    chain->pool = pool;
+    chain->alloc = alloc;
+    chain->free = free;
+    chain->nodes = NULL;
+    chain->last = NULL;
+}
+
+
 void
 njs_chb_append0(njs_chb_t *chain, const char *msg, size_t len)
 {
@@ -44,7 +57,7 @@ njs_chb_reserve(njs_chb_t *chain, size_t size)
         size = NJS_CHB_MIN_SIZE;
     }
 
-    n = njs_mp_alloc(chain->pool, sizeof(njs_chb_node_t) + size);
+    n = chain->alloc(chain->pool, sizeof(njs_chb_node_t) + size);
     if (njs_slow_path(n == NULL)) {
         chain->error = 1;
         return NULL;
@@ -149,7 +162,7 @@ njs_chb_drop(njs_chb_t *chain, size_t drop)
 
     if (drop >= size) {
         njs_chb_destroy(chain);
-        njs_chb_init(chain, chain->pool);
+        njs_chb_init(chain, chain->pool, chain->alloc, chain->free);
         return;
     }
 
@@ -201,7 +214,7 @@ njs_chb_join(njs_chb_t *chain, njs_str_t *str)
         return NJS_ERROR;
     }
 
-    start = njs_mp_alloc(chain->pool, size);
+    start = chain->alloc(chain->pool, size);
     if (njs_slow_path(start == NULL)) {
         return NJS_ERROR;
     }
@@ -238,7 +251,7 @@ njs_chb_destroy(njs_chb_t *chain)
 
     while (n != NULL) {
         next = n->next;
-        njs_mp_free(chain->pool, n);
+        chain->free(chain->pool, n);
         n = next;
     }
 }
index d4719f36d77c963a2353f4182d387789a4cea4c7..8501072846c56cd532894677c1ab7c8778115857 100644 (file)
@@ -17,14 +17,29 @@ struct njs_chb_node_s {
     u_char                  *end;
 };
 
+typedef void *(*njs_chb_alloc_t)(void *pool, size_t size);
+typedef void (*njs_chb_free_t)(void *pool, void *p);
+
 typedef struct {
     njs_bool_t              error;
-    njs_mp_t                *pool;
+
+    void                    *pool;
+    njs_chb_alloc_t         alloc;
+    njs_chb_free_t          free;
+
     njs_chb_node_t          *nodes;
     njs_chb_node_t          *last;
 } njs_chb_t;
 
 
+void njs_chb_init(njs_chb_t *chain, void *pool, njs_chb_alloc_t alloc,
+    njs_chb_free_t free);
+#define NJS_CHB_MP_INIT(chain, vm)                                           \
+    njs_chb_init(chain, njs_vm_memory_pool(vm), (njs_chb_alloc_t) njs_mp_alloc,\
+    (njs_chb_free_t) njs_mp_free)
+#define NJS_CHB_CTX_INIT(chain, ctx)                                         \
+    njs_chb_init(chain, ctx, (njs_chb_alloc_t) js_malloc,                    \
+    (njs_chb_free_t) js_free)
 void njs_chb_append0(njs_chb_t *chain, const char *msg, size_t len);
 void njs_chb_vsprintf(njs_chb_t *chain, size_t size, const char *fmt,
     va_list args);
@@ -48,16 +63,6 @@ void njs_chb_destroy(njs_chb_t *chain);
 #define njs_chb_node_room(n) (size_t) ((n)->end - (n)->pos)
 
 
-njs_inline void
-njs_chb_init(njs_chb_t *chain, njs_mp_t *pool)
-{
-    chain->error = 0;
-    chain->pool = pool;
-    chain->nodes = NULL;
-    chain->last = NULL;
-}
-
-
 njs_inline void
 njs_chb_append_str(njs_chb_t *chain, njs_str_t *str)
 {
index db360d04622dc472f11b5140e09736546eeb15d3..de1cafa38cce5546e373b28995313a3587b726e6 100644 (file)
@@ -1069,7 +1069,7 @@ njs_backtrace_to_string(njs_vm_t *vm, njs_arr_t *backtrace, njs_str_t *dst)
         return NJS_OK;
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     njs_chb_append_str(&chain, dst);
     njs_chb_append(&chain, "\n", 1);
index 5e824aee9202eb93ac3680118c67822550277822..bfdf3f3555ae191b0867fc7a9c0615b680d4fe74 100644 (file)
@@ -1032,7 +1032,7 @@ njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         goto fail;
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     if (async) {
         njs_chb_append_literal(&chain, "(async function(");
index 01466908e1beecaca7c363a56630202fb07d93e3..a7a6c9fdf7e80eaead37a344bd281bf4eb86883b 100644 (file)
@@ -1106,7 +1106,7 @@ njs_json_stringify_iterator(njs_json_stringify_t *stringify,
         goto memory_error;
     }
 
-    njs_chb_init(&chain, stringify->vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, stringify->vm);
 
     for ( ;; ) {
         if (state->index == 0) {
@@ -1990,7 +1990,7 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, njs_value_t *value,
         value = &exception;
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     if (!njs_dump_is_recursive(value)) {
         ret = njs_dump_terminal(stringify, &chain, value, console);
index d4706cc0e14253f62270b866e171cba11d766f03..397f12367d4b04224ed65e473310c280925490f6 100644 (file)
@@ -1398,7 +1398,7 @@ njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args,
         }
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     results.separate = 0;
     results.pointer = 0;
index f22ab43a2519dddf8bb6e276b2557aa2d5b592eb..e7e3893c0834b25b0656293a66baf8e1f4c4c40c 100644 (file)
@@ -3081,7 +3081,7 @@ njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
     p = rep.start;
     end = rep.start + rep.length;
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     while (p < end) {
         r = njs_strlchr(p, end, '$');
@@ -3379,7 +3379,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         return NJS_OK;
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     p_start = string.start;
     increment = s.length != 0 ? s.length : 1;
@@ -4033,7 +4033,7 @@ njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     src = string.start;
     end = string.start + string.size;
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     njs_utf8_decode_init(&ctx);
 
@@ -4307,7 +4307,7 @@ njs_string_atob(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     len = njs_base64_decoded_length(len, pad);
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     dst = njs_chb_reserve(&chain, len * 2);
     if (njs_slow_path(dst == NULL)) {
index c483ff5245ef6e3e581a439208085ec7c404313b..42426c063a71f1173d74eb83f6a4d5c016d215a3 100644 (file)
@@ -2143,7 +2143,7 @@ njs_typed_array_prototype_join(njs_vm_t *vm, njs_value_t *args,
         return NJS_ERROR;
     }
 
-    njs_chb_init(&chain, vm->mem_pool);
+    NJS_CHB_MP_INIT(&chain, vm);
 
     length = njs_typed_array_to_chain(vm, &chain, array, separator);
     size = njs_chb_size(&chain);
index 9827987855ee1c68be3857c7d9539050efba877c..f9c798aa2d9aea5572f4a474d08338f178c2fb05 100644 (file)
@@ -233,7 +233,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
     }
 
     if (njs_slow_path(vm->options.ast)) {
-        njs_chb_init(&chain, vm->mem_pool);
+        NJS_CHB_MP_INIT(&chain, vm);
         ret = njs_parser_serialize_ast(parser.node, &chain);
         if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
index 7108a3d8959bf0dd4fe347a4d55dab9e00d1ee35..e34a5a28de46462abc50f79b97909aac8b7b861c 100644 (file)
@@ -24477,7 +24477,7 @@ njs_chb_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
 
     static const njs_str_t  expected = njs_str("arg: \"XYZ\" -5");
 
-    njs_chb_init(&chain, njs_vm_memory_pool(vm));
+    NJS_CHB_MP_INIT(&chain, vm);
 
     p = njs_chb_reserve(&chain, 513);
     if (p == NULL) {