From 72f3be60844396c2bb347f4653b4e6b63f880483 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 12 Mar 2019 19:28:11 +0300 Subject: [PATCH] Reporting file name and function name in disassembler output. --- njs/njs.c | 2 +- njs/njs_disassembler.c | 2 ++ njs/njs_generator.c | 16 ++++++++++------ njs/njs_generator.h | 2 +- njs/njs_vm.c | 19 ++++++++++--------- njs/njs_vm.h | 7 +++++++ 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/njs/njs.c b/njs/njs.c index 86c1642c..153e8a28 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -271,7 +271,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) nxt_memzero(&generator, sizeof(njs_generator_t)); - ret = njs_generate_scope(vm, &generator, scope); + ret = njs_generate_scope(vm, &generator, scope, &njs_entry_main); if (nxt_slow_path(ret != NXT_OK)) { goto fail; } diff --git a/njs/njs_disassembler.c b/njs/njs_disassembler.c index 8509954b..2780f726 100644 --- a/njs/njs_disassembler.c +++ b/njs/njs_disassembler.c @@ -139,6 +139,8 @@ njs_disassembler(njs_vm_t *vm) n = vm->code->items; while (n != 0) { + printf("%.*s:%.*s\n", (int) code->file.length, code->file.start, + (int) code->name.length, code->name.start); njs_disassemble(code->start, code->end); code++; n--; diff --git a/njs/njs_generator.c b/njs/njs_generator.c index 5c818b7d..780ac101 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -138,7 +138,8 @@ static nxt_int_t njs_generate_inc_dec_operation(njs_vm_t *vm, static nxt_int_t njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_function_scope(njs_vm_t *vm, - njs_function_lambda_t *lambda, njs_parser_node_t *node); + njs_function_lambda_t *lambda, njs_parser_node_t *node, + const nxt_str_t *name); static nxt_int_t njs_generate_argument_closures(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_return_statement(njs_vm_t *vm, @@ -1913,7 +1914,7 @@ njs_generate_function(njs_vm_t *vm, njs_generator_t *generator, lambda = node->u.value.data.u.lambda; - ret = njs_generate_function_scope(vm, lambda, node); + ret = njs_generate_function_scope(vm, lambda, node, &njs_entry_anonymous); if (nxt_slow_path(ret != NXT_OK)) { return ret; @@ -2269,7 +2270,8 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator, lambda = var->value.data.u.function->u.lambda; - ret = njs_generate_function_scope(vm, lambda, node); + ret = njs_generate_function_scope(vm, lambda, node, + &node->u.reference.name); if (nxt_slow_path(ret != NXT_OK)) { return ret; } @@ -2284,7 +2286,7 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator, static nxt_int_t njs_generate_function_scope(njs_vm_t *vm, njs_function_lambda_t *lambda, - njs_parser_node_t *node) + njs_parser_node_t *node, const nxt_str_t *name) { size_t size; nxt_int_t ret; @@ -2295,7 +2297,7 @@ njs_generate_function_scope(njs_vm_t *vm, njs_function_lambda_t *lambda, nxt_memzero(&generator, sizeof(njs_generator_t)); - ret = njs_generate_scope(vm, &generator, node->scope); + ret = njs_generate_scope(vm, &generator, node->scope, name); if (nxt_fast_path(ret == NXT_OK)) { size = 0; @@ -2323,7 +2325,7 @@ njs_generate_function_scope(njs_vm_t *vm, njs_function_lambda_t *lambda, nxt_int_t njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator, - njs_parser_scope_t *scope) + njs_parser_scope_t *scope, const nxt_str_t *name) { u_char *p; size_t size; @@ -2393,6 +2395,8 @@ njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator, code->start = generator->code_start; code->end = generator->code_end; + code->file = scope->file; + code->name = *name; return NXT_OK; } diff --git a/njs/njs_generator.h b/njs/njs_generator.h index 3ebb0739..fc1b4067 100644 --- a/njs/njs_generator.h +++ b/njs/njs_generator.h @@ -28,7 +28,7 @@ struct njs_generator_s { nxt_int_t njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator, - njs_parser_scope_t *scope); + njs_parser_scope_t *scope, const nxt_str_t *name); #endif /* _NJS_GENERATOR_H_INCLUDED_ */ diff --git a/njs/njs_vm.c b/njs/njs_vm.c index 5b1274df..c2a1515c 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -95,6 +95,12 @@ const njs_value_t njs_string_function = njs_string("function"); const njs_value_t njs_string_memory_error = njs_string("MemoryError"); +const nxt_str_t njs_entry_main = nxt_string("main"); +const nxt_str_t njs_entry_native = nxt_string("native"); +const nxt_str_t njs_entry_unknown = nxt_string("unknown"); +const nxt_str_t njs_entry_anonymous = nxt_string("anonymous"); + + /* * The nJSVM is optimized for an ABIs where the first several arguments * are passed in registers (AMD64, ARM32/64): two pointers to the operand @@ -3497,11 +3503,6 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame) njs_function_lambda_t *lambda; njs_backtrace_entry_t *be; - static const nxt_str_t entry_main = nxt_string("main"); - static const nxt_str_t entry_native = nxt_string("native"); - static const nxt_str_t entry_unknown = nxt_string("unknown"); - static const nxt_str_t entry_anonymous = nxt_string("anonymous"); - native_frame = &frame->native; function = native_frame->function; @@ -3513,7 +3514,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame) be->line = 0; if (function == NULL) { - be->name = entry_main; + be->name = njs_entry_main; return NXT_OK; } @@ -3529,7 +3530,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame) return NXT_OK; } - be->name = entry_native; + be->name = njs_entry_native; return NXT_OK; } @@ -3543,7 +3544,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame) be->name = debug_entry[i].name; } else { - be->name = entry_anonymous; + be->name = njs_entry_anonymous; } be->file = debug_entry[i].file; @@ -3553,7 +3554,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame) } } - be->name = entry_unknown; + be->name = njs_entry_unknown; return NXT_OK; } diff --git a/njs/njs_vm.h b/njs/njs_vm.h index 394949c9..a0830d0f 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -1095,6 +1095,8 @@ struct njs_vm_s { typedef struct { u_char *start; u_char *end; + nxt_str_t file; + nxt_str_t name; } njs_vm_code_t; @@ -1297,6 +1299,11 @@ extern const njs_value_t njs_string_nan; extern const njs_value_t njs_string_internal_error; extern const njs_value_t njs_string_memory_error; +extern const nxt_str_t njs_entry_main; +extern const nxt_str_t njs_entry_native; +extern const nxt_str_t njs_entry_unknown; +extern const nxt_str_t njs_entry_anonymous; + extern const nxt_mem_proto_t njs_array_mem_proto; extern const nxt_lvlhsh_proto_t njs_object_hash_proto; -- 2.47.3