From: hongzhidao Date: Sun, 3 Feb 2019 21:33:19 +0000 (+0800) Subject: Reporting filename in parser errors. X-Git-Tag: 0.2.8~47 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=debed7898ce4205b16a39d213c1189a87fc683c0;p=njs.git Reporting filename in parser errors. --- diff --git a/njs/njs.c b/njs/njs.c index c7d4d4d0..83eeae40 100644 --- 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) { diff --git a/njs/njs.h b/njs/njs.h index 62024ebd..6d9a03d3 100644 --- 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 */ diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 0a66e9c0..ba32c7d5 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -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); + } diff --git a/njs/njs_parser.h b/njs/njs_parser.h index c82aa6fd..8f74be56 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -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 * diff --git a/njs/njs_shell.c b/njs/njs_shell.c index 232e26d7..c677c784 100644 --- a/njs/njs_shell.c +++ b/njs/njs_shell.c @@ -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 --git a/nxt/nxt_types.h b/nxt/nxt_types.h index c777f6d7..f550e3da 100644 --- a/nxt/nxt_types.h +++ b/nxt/nxt_types.h @@ -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_ */