]> git.kaiwu.me - njs.git/commitdiff
Fixed line number in reporting variable reference errors.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 14 Feb 2019 12:21:02 +0000 (15:21 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 14 Feb 2019 12:21:02 +0000 (15:21 +0300)
This closes #94 issue on Github.

njs/njs_generator.c
njs/njs_parser.c
njs/njs_parser.h
njs/njs_variable.c
njs/test/njs_unit_test.c

index 24a8064261471ac76595711be57b86da8c5562a5..14ed8c46deb28c4373e045e34b2e3ba15da333b6 100644 (file)
@@ -162,9 +162,6 @@ static nxt_noinline nxt_int_t njs_generate_index_release(njs_vm_t *vm,
 static nxt_int_t njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
     njs_function_lambda_t *lambda, njs_parser_node_t *node);
 
-static void njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node,
-    const char *fmt, ...);
-
 
 #define njs_generate_code(generator, type, code)                              \
     do {                                                                      \
@@ -207,6 +204,9 @@ static void njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node,
         njs_code_offset_diff(generator, patch->jump_offset)
 
 
+#define njs_generate_syntax_error(vm, node, fmt, ...)                         \
+    njs_parser_node_error(vm, node, NJS_OBJECT_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
+
 
 static const nxt_str_t  no_label = { 0, NULL };
 
@@ -3157,39 +3157,3 @@ njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
 
     return NXT_OK;
 }
-
-
-static void
-njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node,
-    const char *fmt, ...)
-{
-    size_t              width;
-    u_char              msg[NXT_MAX_ERROR_STR];
-    u_char              *p, *end;
-    va_list             args;
-    njs_parser_scope_t  *scope;
-
-    p = msg;
-    end = msg + NXT_MAX_ERROR_STR;
-
-    va_start(args, fmt);
-    p = nxt_vsprintf(p, end, fmt, args);
-    va_end(args);
-
-    scope = node->scope;
-
-    width = nxt_length(" in ") + scope->file.length + NXT_INT_T_LEN;
-
-    if (p > end - width) {
-        p = end - width;
-    }
-
-    if (scope->file.start != NULL) {
-        p = nxt_sprintf(p, end, " in %V:%uD", &scope->file, node->token_line);
-
-    } else {
-        p = nxt_sprintf(p, end, " in %uD", node->token_line);
-    }
-
-    njs_error_new(vm, &vm->retval, NJS_OBJECT_SYNTAX_ERROR, msg, p - msg);
-}
index 04016d207eacda20ad3f88f743171a04e8156add..caf14ed19a203f24a0eea57e2c985c449ad3e985 100644 (file)
@@ -2141,6 +2141,8 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     case NJS_TOKEN_NAME:
         nxt_thread_log_debug("JS: %V", name);
 
+        node->token_line = parser->lexer->token_line;
+
         ext = njs_external_lookup(vm, name, hash);
 
         if (ext != NULL) {
@@ -2727,37 +2729,59 @@ njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
 }
 
 
-void
-njs_parser_error(njs_vm_t *vm, njs_parser_t *parser, njs_value_type_t type,
-    const char *fmt, ...)
+static void
+njs_parser_scope_error(njs_vm_t *vm, njs_parser_scope_t *scope,
+    njs_value_type_t type, uint32_t line, const char *fmt, va_list args)
 {
-    size_t       width;
-    u_char       *p, *end;
-    u_char       msg[NXT_MAX_ERROR_STR];
-    va_list      args;
-    njs_lexer_t  *lexer;
+    size_t     width;
+    u_char     msg[NXT_MAX_ERROR_STR];
+    u_char     *p, *end;
+    nxt_str_t  *file;
+
+    file = &scope->file;
 
     p = msg;
     end = msg + NXT_MAX_ERROR_STR;
 
-    va_start(args, fmt);
     p = nxt_vsprintf(p, end, fmt, args);
-    va_end(args);
 
-    lexer = parser->lexer;
-
-    width = nxt_length(" in ") + lexer->file.length + NXT_INT_T_LEN;
+    width = nxt_length(" in ") + file->length + NXT_INT_T_LEN;
 
     if (p > end - width) {
         p = end - width;
     }
 
-    if (lexer->file.start != NULL) {
-        p = nxt_sprintf(p, end, " in %V:%uD", &lexer->file, lexer->line);
+    if (file->start != NULL) {
+        p = nxt_sprintf(p, end, " in %V:%uD", file, line);
 
     } else {
-        p = nxt_sprintf(p, end, " in %uD", lexer->line);
+        p = nxt_sprintf(p, end, " in %uD", line);
     }
 
     njs_error_new(vm, &vm->retval, type, msg, p - msg);
- }
+}
+
+
+void
+njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
+    njs_value_type_t type, const char *fmt, ...)
+{
+    va_list  args;
+
+    va_start(args, fmt);
+    njs_parser_scope_error(vm, parser->scope, type, parser->lexer->line, fmt,
+                           args);
+    va_end(args);
+}
+
+
+void
+njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
+    njs_value_type_t type, const char *fmt, ...)
+{
+    va_list  args;
+
+    va_start(args, fmt);
+    njs_parser_scope_error(vm, node->scope, type, node->token_line, fmt, args);
+    va_end(args);
+}
index 63b9d948f71791eaec43e363e4a5afacb1a24483..61079488b169220104fa3df1c44cb4c9f858f81e 100644 (file)
@@ -329,14 +329,19 @@ njs_index_t njs_variable_index(njs_vm_t *vm, njs_parser_node_t *node);
 nxt_bool_t njs_parser_has_side_effect(njs_parser_node_t *node);
 u_char *njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
     u_char *start);
-void njs_parser_error(njs_vm_t *vm, njs_parser_t *parser,
+void njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
     njs_value_type_t type, const char *fmt, ...);
+void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
+    njs_value_type_t type, const char *fmt, ...);
+
+
+#define njs_parser_syntax_error(vm, parser, fmt, ...)                         \
+    njs_parser_lexer_error(vm, parser, NJS_OBJECT_SYNTAX_ERROR, fmt,          \
+                           ##__VA_ARGS__)
 
-#define njs_parser_syntax_error(vm, parser, fmt, ...)  \
-    njs_parser_error(vm, parser, NJS_OBJECT_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
 
-#define njs_parser_ref_error(vm, parser, fmt, ...)  \
-    njs_parser_error(vm, parser, NJS_OBJECT_REF_ERROR, fmt, ##__VA_ARGS__)
+#define njs_parser_ref_error(vm, parser, fmt, ...)                            \
+    njs_parser_lexer_error(vm, parser, NJS_OBJECT_REF_ERROR, fmt, ##__VA_ARGS__)
 
 
 nxt_inline njs_parser_node_t *
index 0a364363b0884d878813a42aafc7469ce6959589..8daca9d732f111d641b639faf02f424937637a6a 100644 (file)
@@ -344,7 +344,8 @@ njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node)
 
 not_found:
 
-    njs_parser_ref_error(vm, vm->parser, "\"%V\" is not defined", &vr->name);
+    njs_parser_node_error(vm, node, NJS_OBJECT_REF_ERROR,
+                          "\"%V\" is not defined", &vr->name);
 
     return NULL;
 }
index 04164ec489f3555ee4396c1078ca1f839f5ceadf..e8b0eb108c1ab7f2192de82a7fec6e17e9ae7250 100644 (file)
@@ -2107,6 +2107,12 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("a"),
       nxt_string("ReferenceError: \"a\" is not defined in 1") },
 
+    { nxt_string("\na"),
+      nxt_string("ReferenceError: \"a\" is not defined in 2") },
+
+    { nxt_string("\n\na"),
+      nxt_string("ReferenceError: \"a\" is not defined in 3") },
+
     { nxt_string("a + a"),
       nxt_string("ReferenceError: \"a\" is not defined in 1") },