]> git.kaiwu.me - njs.git/commitdiff
Fixed format of the reference exception.
authorAlexander Borisov <alexander.borisov@nginx.com>
Mon, 27 May 2019 16:06:34 +0000 (19:06 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Mon, 27 May 2019 16:06:34 +0000 (19:06 +0300)
Previously, it did not include filename.

njs/njs_generator.c
njs/njs_vm.c
njs/njs_vm.h
njs/test/njs_expect_test.exp

index 1158192f753ba4ecf81daf8946888dfa5fa5b2cd..58615f4e35dea548c631c503aa6a8a9babf3bf17 100644 (file)
@@ -3288,6 +3288,7 @@ static nxt_int_t
 njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
                              njs_parser_node_t *node)
 {
+    njs_ret_t                     ret;
     njs_vmcode_reference_error_t  *ref_err;
 
     if (nxt_slow_path(!node->u.reference.not_defined)) {
@@ -3301,6 +3302,11 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
 
     ref_err->token_line = node->token_line;
 
+    ret = njs_name_copy(vm, &ref_err->file, &node->scope->file);
+    if (nxt_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
+    }
+
     return njs_name_copy(vm, &ref_err->name, &node->u.reference.name);
 }
 
index f6f2e3e7654034680b5dd15f14cae537a79b88b1..4a585947de858abd6289c51e536bbe1ca09dd614 100644 (file)
@@ -2659,12 +2659,21 @@ njs_ret_t
 njs_vmcode_reference_error(njs_vm_t *vm, njs_value_t *invld1,
     njs_value_t *invld2)
 {
+    nxt_str_t                     *file;
     njs_vmcode_reference_error_t  *ref_err;
 
     ref_err = (njs_vmcode_reference_error_t *) vm->current;
 
-    njs_reference_error(vm, "\"%V\" is not defined in %uD", &ref_err->name,
-                        ref_err->token_line);
+    file = &ref_err->file;
+
+    if (file->length != 0 && !vm->options.quiet) {
+        njs_reference_error(vm, "\"%V\" is not defined in %V:%uD",
+                            &ref_err->name, file, ref_err->token_line);
+
+    } else {
+        njs_reference_error(vm, "\"%V\" is not defined in %uD", &ref_err->name,
+                            ref_err->token_line);
+    }
 
     return NJS_ERROR;
 }
index 41f2b5c34f624257c8274bd657a0f424af7a4497..52f914e9494b99c05713e694cdda855fbdf29404 100644 (file)
@@ -857,6 +857,7 @@ typedef struct {
 typedef struct {
     njs_vmcode_t               code;
     nxt_str_t                  name;
+    nxt_str_t                  file;
     uint32_t                   token_line;
 } njs_vmcode_reference_error_t;
 
index 33445df73a4d8b54bcd2b33e2566a1a02fd4d29b..b29203022bf54a8965fd68739eec455800badc87 100644 (file)
@@ -668,6 +668,17 @@ njs_test {
 
 # modules
 
+# FIXME:
+# During import, the variable is declared regardless of the result of the import.
+# Because of this, in the console mode, checking the variable after the import
+# error may give an incorrect result.
+#
+# For example:
+# {"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"}
+
 njs_test {
     {"import lib1 from 'lib1.js'; import lib2 from 'lib1.js'\r\n"
      "undefined\r\n"}
@@ -685,8 +696,6 @@ njs_test {
      "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"