From e6295eca91d3febff981922cd529346b5889d876 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 6 Jan 2023 20:39:01 -0800 Subject: [PATCH] Added njs_vm_add_module(). The new API does not require for njs_mod_t structure to be disclosed. --- external/njs_crypto_module.c | 6 ++---- external/njs_fs_module.c | 5 +---- external/njs_query_string_module.c | 6 ++---- src/njs.h | 2 ++ src/njs_buffer.c | 6 ++---- src/njs_module.c | 17 +++++++++-------- src/njs_module.h | 2 +- src/njs_vm.c | 9 ++++++++- 8 files changed, 27 insertions(+), 26 deletions(-) diff --git a/external/njs_crypto_module.c b/external/njs_crypto_module.c index fbef019f..1e0e2015 100644 --- a/external/njs_crypto_module.c +++ b/external/njs_crypto_module.c @@ -646,13 +646,11 @@ njs_crypto_init(njs_vm_t *vm) return NJS_ERROR; } - module = njs_module_add(vm, &njs_str_value("crypto")); + module = njs_vm_add_module(vm, &njs_str_value("crypto"), + njs_value_arg(&value)); if (njs_slow_path(module == NULL)) { return NJS_ERROR; } - njs_value_assign(&module->value, &value); - module->function.native = 1; - return NJS_OK; } diff --git a/external/njs_fs_module.c b/external/njs_fs_module.c index 150016ef..7aa9328d 100644 --- a/external/njs_fs_module.c +++ b/external/njs_fs_module.c @@ -3762,13 +3762,10 @@ njs_fs_init(njs_vm_t *vm) return NJS_ERROR; } - module = njs_module_add(vm, &njs_str_value("fs")); + module = njs_vm_add_module(vm, &njs_str_value("fs"), njs_value_arg(&value)); if (njs_slow_path(module == NULL)) { return NJS_ERROR; } - njs_value_assign(&module->value, &value); - module->function.native = 1; - return NJS_OK; } diff --git a/external/njs_query_string_module.c b/external/njs_query_string_module.c index 87caf9c9..b1463f3e 100644 --- a/external/njs_query_string_module.c +++ b/external/njs_query_string_module.c @@ -998,13 +998,11 @@ njs_query_string_init(njs_vm_t *vm) return NJS_ERROR; } - module = njs_module_add(vm, &njs_str_value("querystring")); + module = njs_vm_add_module(vm, &njs_str_value("querystring"), + njs_value_arg(&value)); if (njs_slow_path(module == NULL)) { return NJS_ERROR; } - njs_value_assign(&module->value, &value); - module->function.native = 1; - return NJS_OK; } diff --git a/src/njs.h b/src/njs.h index ee5ee684..e481c1bb 100644 --- a/src/njs.h +++ b/src/njs.h @@ -310,6 +310,8 @@ NJS_EXPORT njs_vm_t *njs_vm_create(njs_vm_opt_t *options); NJS_EXPORT void njs_vm_destroy(njs_vm_t *vm); NJS_EXPORT njs_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end); +NJS_EXPORT njs_mod_t *njs_vm_add_module(njs_vm_t *vm, njs_str_t *name, + njs_value_t *value); NJS_EXPORT njs_mod_t *njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name, u_char **start, u_char *end); NJS_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external); diff --git a/src/njs_buffer.c b/src/njs_buffer.c index 2a90686d..d716aded 100644 --- a/src/njs_buffer.c +++ b/src/njs_buffer.c @@ -2602,13 +2602,11 @@ njs_buffer_init(njs_vm_t *vm) return NJS_ERROR; } - module = njs_module_add(vm, &njs_str_value("buffer")); + module = njs_vm_add_module(vm, &njs_str_value("buffer"), + njs_value_arg(&value)); if (njs_slow_path(module == NULL)) { return NJS_ERROR; } - njs_value_assign(&module->value, &value); - module->function.native = 1; - return NJS_OK; } diff --git a/src/njs_module.c b/src/njs_module.c index 7af75ac7..8856f6da 100644 --- a/src/njs_module.c +++ b/src/njs_module.c @@ -283,7 +283,7 @@ njs_module_find(njs_vm_t *vm, njs_str_t *name, njs_bool_t shared) njs_mod_t * -njs_module_add(njs_vm_t *vm, njs_str_t *name) +njs_module_add(njs_vm_t *vm, njs_str_t *name, njs_value_t *value) { njs_int_t ret; njs_mod_t *module; @@ -309,16 +309,17 @@ njs_module_add(njs_vm_t *vm, njs_str_t *name) lhq.proto = &njs_modules_hash_proto; ret = njs_lvlhsh_insert(&vm->shared->modules_hash, &lhq); - if (njs_fast_path(ret == NJS_OK)) { - return module; + if (njs_slow_path(ret != NJS_OK)) { + njs_internal_error(vm, "lvlhsh insert failed"); + return NULL; } - njs_mp_free(vm->mem_pool, module->name.start); - njs_mp_free(vm->mem_pool, module); - - njs_internal_error(vm, "lvlhsh insert failed"); + if (value != NULL) { + njs_value_assign(&module->value, value); + module->function.native = 1; + } - return NULL; + return module; } diff --git a/src/njs_module.h b/src/njs_module.h index deb56359..ead4a34d 100644 --- a/src/njs_module.h +++ b/src/njs_module.h @@ -16,7 +16,7 @@ struct njs_mod_s { }; -njs_mod_t *njs_module_add(njs_vm_t *vm, njs_str_t *name); +njs_mod_t *njs_module_add(njs_vm_t *vm, njs_str_t *name, njs_value_t *value); njs_mod_t *njs_module_find(njs_vm_t *vm, njs_str_t *name, njs_bool_t shared); njs_mod_t *njs_parser_module(njs_parser_t *parser, njs_str_t *name); diff --git a/src/njs_vm.c b/src/njs_vm.c index 46b5d946..4ae3e2bc 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -238,6 +238,13 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) } +njs_mod_t * +njs_vm_add_module(njs_vm_t *vm, njs_str_t *name, njs_value_t *value) +{ + return njs_module_add(vm, name, value); +} + + njs_mod_t * njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name, u_char **start, u_char *end) @@ -256,7 +263,7 @@ njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name, u_char **start, return module; } - module = njs_module_add(vm, name); + module = njs_module_add(vm, name, NULL); if (njs_slow_path(module == NULL)) { return NULL; } -- 2.47.3