]> git.kaiwu.me - njs.git/commitdiff
Reporting filename in generator errors.
authorhongzhidao <hongzhidao@gmail.com>
Mon, 4 Feb 2019 16:53:18 +0000 (00:53 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Mon, 4 Feb 2019 16:53:18 +0000 (00:53 +0800)
njs/njs_generator.c
njs/njs_parser.c
njs/njs_parser.h

index e747ec523fb4cc7f4b5dd841504fb3e9ad68c454..0ecc05294ccc093ffb9cad3f269f64c52bc4fb47 100644 (file)
@@ -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 charfmt, ...);
+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 charfmt, ...)
+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);
 }
index ba32c7d57708216b35c644f2ce31241dac8dd0af..b3883ac13c76b9fd40881dfe508bc9fd355e7950 100644 (file)
@@ -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];
index 8f74be560df4f6fd5373ceaca7ffe806623a4418..0836c8f29c5cf2c96cc1900dbc6e07dfba9bbb02 100644 (file)
@@ -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;