]> git.kaiwu.me - njs.git/commitdiff
Resetting loaded modules in accumulative mode.
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 25 Mar 2019 14:51:19 +0000 (17:51 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 25 Mar 2019 14:51:19 +0000 (17:51 +0300)
This closes #113 issue on Github.

njs/njs.c
njs/njs_module.c
njs/njs_module.h
njs/test/module/ref_exception.js [new file with mode: 0644]
njs/test/njs_expect_test.exp

index fa1e560fe361be3e76a3673518ce83e09585221b..cdfb36a69a8eab8fc0ef523c05185f87a207f9d7 100644 (file)
--- 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;
index decb27410e5dca2058d64ce136923f407a79cf00..2ce782996c9cf12ba06569ac0e4c7d85febbdaef 100644 (file)
@@ -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);
 }
 
 
index 63e86b9a9ba046ea51c7028abdb7b32dd6d81abc..97f0a45fc9441bcb06ed21a85595884741bb4c4f 100644 (file)
@@ -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 (file)
index 0000000..666d60e
--- /dev/null
@@ -0,0 +1 @@
+export default {type:typeof undeclared, undeclared};
index dbd2dd0146355fc3e0c0d49854806a7f843aec36..db1e597cf634133793636296e33fa84d49685468 100644 (file)
@@ -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"