]> git.kaiwu.me - njs.git/commitdiff
Reporting filename in runtime errors.
authorhongzhidao <hongzhidao@gmail.com>
Mon, 4 Feb 2019 17:07:45 +0000 (01:07 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Mon, 4 Feb 2019 17:07:45 +0000 (01:07 +0800)
njs/njs_generator.c
njs/njs_vm.c
njs/njs_vm.h

index 0ecc05294ccc093ffb9cad3f269f64c52bc4fb47..496e7481212e18ca924ee9e100cde540e7bf5f82 100644 (file)
@@ -160,8 +160,7 @@ static nxt_noinline nxt_int_t njs_generate_index_release(njs_vm_t *vm,
     njs_generator_t *generator, njs_index_t index);
 
 static nxt_int_t njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
-    njs_function_lambda_t *lambda, uint32_t line);
-
+    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, ...);
@@ -1888,7 +1887,7 @@ njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     if (vm->debug != NULL) {
-        ret = njs_generate_function_debug(vm, NULL, lambda, node->token_line);
+        ret = njs_generate_function_debug(vm, NULL, lambda, node);
         if (nxt_slow_path(ret != NXT_OK)) {
             return ret;
         }
@@ -2269,8 +2268,7 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     if (vm->debug != NULL) {
-        ret = njs_generate_function_debug(vm, &var->name, lambda,
-                                          node->token_line);
+        ret = njs_generate_function_debug(vm, &var->name, lambda, node);
     }
 
     return ret;
@@ -3137,7 +3135,7 @@ njs_generate_index_release(njs_vm_t *vm, njs_generator_t *generator,
 
 static nxt_int_t
 njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
-    njs_function_lambda_t *lambda, uint32_t line)
+    njs_function_lambda_t *lambda, njs_parser_node_t *node)
 {
     njs_function_debug_t  *debug;
 
@@ -3154,7 +3152,8 @@ njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
     }
 
     debug->lambda = lambda;
-    debug->line = line;
+    debug->line = node->token_line;
+    debug->file = node->scope->file;
 
     return NXT_OK;
 }
index 451ca28ec757171b457cb7a2b0100268d86c1b54..8355c16d712067c98b3810023944583e5b599783 100644 (file)
@@ -3127,8 +3127,8 @@ again:
                 be = backtrace->start;
 
                 for (i = 0; i < backtrace->items; i++) {
-                    if (i != 0 && prev->name.start == be[i].name.start
-                        && prev->line == be[i].line)
+                    if (i != 0 && prev->name.start == be->name.start
+                        && prev->line == be->line)
                     {
                         count++;
 
@@ -3140,17 +3140,18 @@ again:
                             count = 0;
                         }
 
-                        if (be[i].line != 0) {
-                            len += nxt_length("    at  (:)\n") + NXT_INT_T_LEN
-                                   + be[i].name.length;
+                        len += be->name.length + nxt_length("    at  ()\n");
+
+                        if (be->line != 0) {
+                            len += be->file.length + NXT_INT_T_LEN + 1;
 
                         } else {
-                            len += nxt_length("    at  (native)\n")
-                                   + be[i].name.length;
+                            len += nxt_length("native");
                         }
                     }
 
-                    prev = &be[i];
+                    prev = be;
+                    be++;
                 }
 
                 p = nxt_mp_alloc(vm->mem_pool, len);
@@ -3168,30 +3169,34 @@ again:
                 count = 0;
                 prev = NULL;
 
+                be = backtrace->start;
+
                 for (i = 0; i < backtrace->items; i++) {
-                    if (i != 0 && prev->name.start == be[i].name.start
-                        && prev->line == be[i].line)
+                    if (i != 0 && prev->name.start == be->name.start
+                        && prev->line == be->line)
                     {
                         count++;
 
                     } else {
                         if (count != 0) {
-                            p = nxt_sprintf(p, end,
-                                            "      repeats %uz times\n", count);
+                            p = nxt_sprintf(p, end, "      repeats %uz times\n",
+                                            count);
                             count = 0;
                         }
 
-                        if (be[i].line != 0) {
-                            p = nxt_sprintf(p, end, "    at %V (:%uD)\n",
-                                            &be[i].name, be[i].line);
+                        p = nxt_sprintf(p, end, "    at %V ", &be->name);
+
+                        if (be->line != 0) {
+                            p = nxt_sprintf(p, end, "(%V:%uD)\n", &be->file,
+                                            be->line);
 
                         } else {
-                            p = nxt_sprintf(p, end, "    at %V (native)\n",
-                                            &be[i].name);
+                            p = nxt_sprintf(p, end, "(native)\n");
                         }
                     }
 
-                    prev = &be[i];
+                    prev = be;
+                    be++;
                 }
 
                 dst->start = start;
@@ -3549,6 +3554,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame)
                 be->name = entry_anonymous;
             }
 
+            be->file = debug_entry[i].file;
             be->line = debug_entry[i].line;
 
             return NXT_OK;
index bdf0aa2df182cf66955b59cc683afbefa0fea2f9..394949c97d75ece69cda72c19b7b5d7a953ab7b1 100644 (file)
@@ -352,8 +352,9 @@ typedef union {
 
 
 typedef struct {
-    nxt_str_t                       name;
-    uint32_t                        line;
+    nxt_str_t                         name;
+    nxt_str_t                         file;
+    uint32_t                          line;
 } njs_backtrace_entry_t;
 
 
@@ -1012,6 +1013,7 @@ typedef struct {
 
 typedef struct {
     uint32_t                  line;
+    nxt_str_t                 file;
     nxt_str_t                 name;
     njs_function_lambda_t     *lambda;
 } njs_function_debug_t;