[njs] Reporting filename in parser errors.

Dmitry Volyntsev xeioex at nginx.com
Mon Feb 4 08:33:53 UTC 2019


details:   https://hg.nginx.org/njs/rev/06e1b1790f9a
branches:  
changeset: 755:06e1b1790f9a
user:      hongzhidao <hongzhidao at gmail.com>
date:      Mon Feb 04 05:33:19 2019 +0800
description:
Reporting filename in parser errors.

diffstat:

 njs/njs.c        |   1 +
 njs/njs.h        |   1 +
 njs/njs_parser.c |  69 ++++++++++++++++++++++++++++++++++---------------------
 njs/njs_parser.h |  14 ++++++++---
 njs/njs_shell.c  |   5 ++++
 nxt/nxt_types.h  |   2 +
 6 files changed, 61 insertions(+), 31 deletions(-)

diffs (173 lines):

diff -r 83581029a022 -r 06e1b1790f9a njs/njs.c
--- a/njs/njs.c	Mon Feb 04 05:26:42 2019 +0800
+++ b/njs/njs.c	Mon Feb 04 05:33:19 2019 +0800
@@ -244,6 +244,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **st
     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) {
diff -r 83581029a022 -r 06e1b1790f9a njs/njs.h
--- a/njs/njs.h	Mon Feb 04 05:26:42 2019 +0800
+++ b/njs/njs.h	Mon Feb 04 05:33:19 2019 +0800
@@ -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 */
diff -r 83581029a022 -r 06e1b1790f9a njs/njs_parser.c
--- a/njs/njs_parser.c	Mon Feb 04 05:26:42 2019 +0800
+++ b/njs/njs_parser.c	Mon Feb 04 05:33:19 2019 +0800
@@ -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 *tr
     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 *tr
 
 
 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);
-}
-
-
-void
-njs_parser_ref_error(njs_vm_t *vm, njs_parser_t *parser, const char* fmt,
-    ...)
-{
-    va_list  args;
-    u_char   buf[256], *end;
-
-    va_start(args, fmt);
-    end = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args);
-    va_end(args);
-
-    njs_reference_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;
+
+    if (p > end - width) {
+        p = end - width;
+    }
+
+    if (lexer->file.start != NULL) {
+        p = nxt_sprintf(p, end, " in %V:%uD", &lexer->file, lexer->line);
+
+    } else {
+        p = nxt_sprintf(p, end, " in %uD", lexer->line);
+    }
+
+    njs_error_new(vm, type, msg, p - msg);
+ }
diff -r 83581029a022 -r 06e1b1790f9a njs/njs_parser.h
--- a/njs/njs_parser.h	Mon Feb 04 05:26:42 2019 +0800
+++ b/njs/njs_parser.h	Mon Feb 04 05:33:19 2019 +0800
@@ -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 
 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 *
diff -r 83581029a022 -r 06e1b1790f9a njs/njs_shell.c
--- a/njs/njs_shell.c	Mon Feb 04 05:26:42 2019 +0800
+++ b/njs/njs_shell.c	Mon Feb 04 05:33:19 2019 +0800
@@ -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;
diff -r 83581029a022 -r 06e1b1790f9a nxt/nxt_types.h
--- a/nxt/nxt_types.h	Mon Feb 04 05:26:42 2019 +0800
+++ b/nxt/nxt_types.h	Mon Feb 04 05:33:19 2019 +0800
@@ -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_ */


More information about the nginx-devel mailing list