From 8a7216de8a204fc76e68da23fa5c2e58586e14a6 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 25 Mar 2019 17:51:19 +0300 Subject: [PATCH] Resetting loaded modules in accumulative mode. This closes #113 issue on Github. --- njs/njs.c | 4 ++++ njs/njs_module.c | 36 ++++++++++++++++++++++++++------ njs/njs_module.h | 1 + njs/test/module/ref_exception.js | 1 + njs/test/njs_expect_test.exp | 12 ++++++++--- 5 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 njs/test/module/ref_exception.js diff --git a/njs/njs.c b/njs/njs.c index fa1e560f..cdfb36a6 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -226,6 +226,10 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) return NJS_ERROR; } + if (vm->modules != NULL && vm->options.accumulative) { + njs_module_reset(vm); + } + parser = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_parser_t)); if (nxt_slow_path(parser == NULL)) { return NJS_ERROR; diff --git a/njs/njs_module.c b/njs/njs_module.c index decb2741..2ce78299 100644 --- a/njs/njs_module.c +++ b/njs/njs_module.c @@ -63,22 +63,46 @@ njs_module_load(njs_vm_t *vm) } else { ret = njs_vm_invoke(vm, &module->function, NULL, 0, module->index); if (ret == NXT_ERROR) { - goto done; + return ret; } } item++; } - ret = NXT_OK; + return NXT_OK; +} + -done: +void +njs_module_reset(njs_vm_t *vm) +{ + nxt_uint_t i; + njs_module_t **item, *module; + nxt_lvlhsh_query_t lhq; - if (vm->options.accumulative) { - nxt_array_reset(vm->modules); + if (vm->modules == NULL) { + return; + } + + item = vm->modules->start; + + for (i = 0; i < vm->modules->items; i++) { + module = *item; + + if (!module->function.native) { + lhq.key = module->name; + lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); + lhq.proto = &njs_modules_hash_proto; + lhq.pool = vm->mem_pool; + + (void) nxt_lvlhsh_delete(&vm->modules_hash, &lhq); + } + + item++; } - return ret; + nxt_array_reset(vm->modules); } diff --git a/njs/njs_module.h b/njs/njs_module.h index 63e86b9a..97f0a45f 100644 --- a/njs/njs_module.h +++ b/njs/njs_module.h @@ -17,6 +17,7 @@ typedef struct { nxt_int_t njs_module_load(njs_vm_t *vm); +void njs_module_reset(njs_vm_t *vm); nxt_int_t njs_parser_module(njs_vm_t *vm, njs_parser_t *parser); njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); diff --git a/njs/test/module/ref_exception.js b/njs/test/module/ref_exception.js new file mode 100644 index 00000000..666d60e4 --- /dev/null +++ b/njs/test/module/ref_exception.js @@ -0,0 +1 @@ +export default {type:typeof undeclared, undeclared}; diff --git a/njs/test/njs_expect_test.exp b/njs/test/njs_expect_test.exp index dbd2dd01..db1e597c 100644 --- a/njs/test/njs_expect_test.exp +++ b/njs/test/njs_expect_test.exp @@ -659,9 +659,7 @@ njs_test { # modules njs_test { - {"import lib1 from 'lib1.js'\r\n" - "undefined\r\n"} - {"import lib2 from 'lib1.js'\r\n" + {"import lib1 from 'lib1.js'; import lib2 from 'lib1.js'\r\n" "undefined\r\n"} {"lib2.inc()\r\n" "undefined\r\n"} @@ -675,6 +673,14 @@ njs_test { "Identifier \"default\" has already been declared in export.js:5\r\n"} {"import m from 'export_non_default.js'\r\n" "Non-default export is not supported in export_non_default.js:3\r\n"} + {"import ref from 'ref_exception.js'\r\n" + "ReferenceError: \"undeclared\" is not defined in ref_exception.js:1"} + {"ref\r\n" + "ReferenceError: \"ref\" is not defined in shell:1\r\n"} + {"var ref\r\n" + "undefined\r\n"} + {"import ref from 'ref_exception.js'\r\n" + "ReferenceError: \"undeclared\" is not defined in ref_exception.js:1"} {"import m from 'loading_exception.js'\r\n" "Error: loading exception\r\n at module \\(loading_exception.js:1\\)"} {"import lib3 from 'lib1.js'\r\n" -- 2.47.3