From 4f140a17017bd3f7cf26b63ccaf9bdd7f34aab0a Mon Sep 17 00:00:00 2001 From: hongzhidao Date: Tue, 5 Feb 2019 00:53:18 +0800 Subject: [PATCH] Reporting filename in generator errors. --- njs/njs_generator.c | 42 +++++++++++++++++++++++++++++++----------- njs/njs_parser.c | 13 ++++++++++--- njs/njs_parser.h | 2 ++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/njs/njs_generator.c b/njs/njs_generator.c index e747ec52..0ecc0529 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -163,8 +163,8 @@ static nxt_int_t njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name, njs_function_lambda_t *lambda, uint32_t line); -static void njs_generate_syntax_error(njs_vm_t *vm, uint32_t token_line, - const char* fmt, ...); +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) \ @@ -1407,8 +1407,7 @@ njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator, syntax_error: - njs_generate_syntax_error(vm, node->token_line, - "Illegal continue statement"); + njs_generate_syntax_error(vm, node, "Illegal continue statement"); return NXT_ERROR; } @@ -1456,7 +1455,7 @@ njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator, syntax_error: - njs_generate_syntax_error(vm, node->token_line, "Illegal break statement"); + njs_generate_syntax_error(vm, node, "Illegal break statement"); return NXT_ERROR; } @@ -3162,15 +3161,36 @@ njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name, static void -njs_generate_syntax_error(njs_vm_t *vm, uint32_t token_line, - const char* fmt, ...) +njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node, + const char *fmt, ...) { - va_list args; - u_char buf[256], *end; + 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); - 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, token_line); + 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, NJS_OBJECT_SYNTAX_ERROR, msg, p - msg); } diff --git a/njs/njs_parser.c b/njs/njs_parser.c index ba32c7d5..b3883ac1 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -162,6 +162,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev) static njs_ret_t njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type) { + nxt_int_t ret; nxt_uint_t nesting; nxt_array_t *values; njs_parser_scope_t *scope, *parent; @@ -188,13 +189,12 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type) } } - scope = nxt_mp_alloc(vm->mem_pool, sizeof(njs_parser_scope_t)); + scope = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_parser_scope_t)); if (nxt_slow_path(scope == NULL)) { return NXT_ERROR; } scope->type = type; - scope->top = NULL; if (type == NJS_SCOPE_FUNCTION) { scope->next_index[0] = type; @@ -230,6 +230,13 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type) scope->values[0] = values; scope->values[1] = NULL; + if (parser->lexer->file.start != NULL) { + ret = njs_name_copy(vm, &scope->file, &parser->lexer->file); + if (nxt_slow_path(ret != NXT_OK)) { + return NXT_ERROR; + } + } + parent = parser->scope; scope->parent = parent; parser->scope = scope; @@ -2639,7 +2646,7 @@ 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, ...) - { +{ size_t width; u_char *p, *end; u_char msg[NXT_MAX_ERROR_STR]; diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 8f74be56..0836c8f2 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -249,6 +249,8 @@ struct njs_parser_scope_s { nxt_array_t *values[2]; /* Array of njs_value_t. */ njs_index_t next_index[2]; + nxt_str_t file; + njs_scope_t type:8; uint8_t nesting; /* 4 bits */ uint8_t argument_closures; -- 2.47.3