]> git.kaiwu.me - njs.git/commitdiff
Reporting filename in parser errors.
authorhongzhidao <hongzhidao@gmail.com>
Sun, 3 Feb 2019 21:33:19 +0000 (05:33 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Sun, 3 Feb 2019 21:33:19 +0000 (05:33 +0800)
njs/njs.c
njs/njs.h
njs/njs_parser.c
njs/njs_parser.h
njs/njs_shell.c
nxt/nxt_types.h

index c7d4d4d0fed460fc4d651df3891d0d80bfaf8a95..83eeae40ed40924ee066be220133fb547557d98d 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -244,6 +244,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
     lexer->start = *start;
     lexer->end = end;
     lexer->line = 1;
+    lexer->file = vm->options.file;
     lexer->keywords_hash = vm->shared->keywords_hash;
 
     if (vm->backtrace != NULL) {
index 62024ebdc85c253bc16a2e2a8ead9df3c5d7eb4d..6d9a03d3f9a3ad75dc1b5c1bd9d3e027b340a7f0 100644 (file)
--- a/njs/njs.h
+++ b/njs/njs.h
@@ -141,6 +141,7 @@ typedef struct {
     njs_external_ptr_t              external;
     njs_vm_shared_t                 *shared;
     njs_vm_ops_t                    *ops;
+    nxt_str_t                       file;
 
     uint8_t                         trailer;         /* 1 bit */
     uint8_t                         init;            /* 1 bit */
index 0a66e9c01aadc9c8daed0276b00e113add0d1898..ba32c7d57708216b35c644f2ce31241dac8dd0af 100644 (file)
@@ -2604,9 +2604,10 @@ u_char *
 njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
     u_char *start)
 {
-    u_char    *p;
-    size_t    size;
-    njs_vm_t  *vm;
+    u_char       *p;
+    size_t       size;
+    njs_vm_t     *vm;
+    njs_lexer_t  *lexer;
 
     size = nxt_length("InternalError: ");
     memcpy(start, "InternalError: ", size);
@@ -2618,7 +2619,15 @@ njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
     p = trace->handler(trace, td, p);
 
     if (vm->parser != NULL) {
-        njs_internal_error(vm, "%s in %uD", start, vm->parser->lexer->line);
+        lexer = vm->parser->lexer;
+
+        if (lexer->file.start != NULL) {
+            njs_internal_error(vm, "%s in %V:%uD", start, &lexer->file,
+                               lexer->line);
+        } else {
+            njs_internal_error(vm, "%s in %uD", start, lexer->line);
+        }
+
     } else {
         njs_internal_error(vm, "%s", start);
     }
@@ -2628,30 +2637,36 @@ njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
 
 
 void
-njs_parser_syntax_error(njs_vm_t *vm, njs_parser_t *parser, const char* fmt,
-    ...)
-{
-    va_list  args;
-    u_char   buf[256], *end;
+njs_parser_error(njs_vm_t *vm, njs_parser_t *parser, njs_value_type_t type,
+    const char *fmt, ...)
+ {
+    size_t       width;
+    u_char       *p, *end;
+    u_char       msg[NXT_MAX_ERROR_STR];
+    va_list      args;
+    njs_lexer_t  *lexer;
+
+    p = msg;
+    end = msg + NXT_MAX_ERROR_STR;
 
     va_start(args, fmt);
-    end = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args);
+    p = nxt_vsprintf(p, end, fmt, args);
     va_end(args);
 
-    njs_syntax_error(vm, "%*s in %uD", end - buf, buf, parser->lexer->line);
-}
+    lexer = parser->lexer;
 
+    width = nxt_length(" in ") + lexer->file.length + NXT_INT_T_LEN;
 
-void
-njs_parser_ref_error(njs_vm_t *vm, njs_parser_t *parser, const char* fmt,
-    ...)
-{
-    va_list  args;
-    u_char   buf[256], *end;
+    if (p > end - width) {
+        p = end - width;
+    }
 
-    va_start(args, fmt);
-    end = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args);
-    va_end(args);
+    if (lexer->file.start != NULL) {
+        p = nxt_sprintf(p, end, " in %V:%uD", &lexer->file, lexer->line);
 
-    njs_reference_error(vm, "%*s in %uD", end - buf, buf, parser->lexer->line);
-}
+    } else {
+        p = nxt_sprintf(p, end, " in %uD", lexer->line);
+    }
+
+    njs_error_new(vm, type, msg, p - msg);
+ }
index c82aa6fd9f5dffe49edf88c8b984d038ca620f82..8f74be560df4f6fd5373ceaca7ffe806623a4418 100644 (file)
@@ -221,6 +221,8 @@ typedef struct {
 
     nxt_lvlhsh_t                    keywords_hash;
 
+    nxt_str_t                       file;
+
     u_char                          *start;
     u_char                          *prev_start;
     u_char                          *end;
@@ -327,10 +329,14 @@ 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_syntax_error(njs_vm_t *vm, njs_parser_t *parser,
-    const char* fmt, ...);
-void njs_parser_ref_error(njs_vm_t *vm, njs_parser_t *parser, const char* fmt,
-    ...);
+void njs_parser_error(njs_vm_t *vm, njs_parser_t *parser,
+    njs_value_type_t type, const char *fmt, ...);
+
+#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__)
 
 
 nxt_inline njs_parser_node_t *
index 232e26d70cb918dda011efc286b3fdf47aeddfd6..c677c7846aeb1dbf5e5d36f0e2fbd31a533f2740 100644 (file)
@@ -215,6 +215,11 @@ main(int argc, char **argv)
 
     nxt_memzero(&vm_options, sizeof(njs_vm_opt_t));
 
+    if (opts.file != NULL) {
+        vm_options.file.start = (u_char *) opts.file;
+        vm_options.file.length = strlen(opts.file);
+    }
+
     vm_options.init = !opts.interactive;
     vm_options.accumulative = opts.interactive;
     vm_options.backtrace = 1;
index c777f6d7124719ead9e29f40f7027f6709df1987..f550e3da227e44d8cc143dd5102faada74c28f05 100644 (file)
@@ -116,5 +116,7 @@ typedef pid_t          nxt_pid_t;
 
 #define NXT_DOUBLE_LEN       (1 + DBL_MAX_10_EXP)
 
+#define NXT_MAX_ERROR_STR    2048
+
 
 #endif /* _NXT_TYPES_H_INCLUDED_ */