From: Dmitry Volyntsev Date: Thu, 14 Feb 2019 12:21:02 +0000 (+0300) Subject: Fixed line number in reporting variable reference errors. X-Git-Tag: 0.2.8~24 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=c92c4caba315e416a2b211bf6e9c10f041322744;p=njs.git Fixed line number in reporting variable reference errors. This closes #94 issue on Github. --- diff --git a/njs/njs_generator.c b/njs/njs_generator.c index 24a80642..14ed8c46 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -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); -} diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 04016d20..caf14ed1 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -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); +} diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 63b9d948..61079488 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -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 * diff --git a/njs/njs_variable.c b/njs/njs_variable.c index 0a364363..8daca9d7 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -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; } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 04164ec4..e8b0eb10 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") },