From b5f02de883c4799bdd31ad9fd2c70e7122607861 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sat, 15 Mar 2025 18:17:35 +0800 Subject: [PATCH] :art: opcode dump can get global variable name --- src/nasal_codegen.cpp | 1 + src/nasal_codegen.h | 10 +++++----- src/nasal_dbg.cpp | 8 +++++++- src/nasal_opcode.cpp | 24 +++++++++++++++++++++++- src/nasal_opcode.h | 11 +++++++++++ src/nasal_vm.cpp | 8 +++++++- 6 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/nasal_codegen.cpp b/src/nasal_codegen.cpp index 0a513de..4455082 100644 --- a/src/nasal_codegen.cpp +++ b/src/nasal_codegen.cpp @@ -1436,6 +1436,7 @@ void codegen::print(std::ostream& out) { codestream::set( const_number_table.data(), const_string_table.data(), + global, native_function.data() ); diff --git a/src/nasal_codegen.h b/src/nasal_codegen.h index ae86d3c..4f0e9a8 100644 --- a/src/nasal_codegen.h +++ b/src/nasal_codegen.h @@ -161,11 +161,11 @@ private: void ret_gen(return_expr*); public: - const auto& strs() const {return const_string_table;} - const auto& nums() const {return const_number_table;} - const auto& natives() const {return native_function;} - const auto& codes() const {return code;} - const auto& globals() const {return global;} + const auto& strs() const { return const_string_table; } + const auto& nums() const { return const_number_table; } + const auto& natives() const { return native_function; } + const auto& codes() const { return code; } + const auto& globals() const { return global; } public: codegen() = default; diff --git a/src/nasal_dbg.cpp b/src/nasal_dbg.cpp index 94cbfd8..490b301 100644 --- a/src/nasal_dbg.cpp +++ b/src/nasal_dbg.cpp @@ -163,7 +163,13 @@ void dbg::step_info() { begin = (ctx.pc>>3)==0? 0:((ctx.pc>>3)<<3); end = (1+(ctx.pc>>3))<<3; - codestream::set(const_number, const_string, native_function.data(), files); + codestream::set( + const_number, + const_string, + global_symbol_name, + native_function.data(), + files + ); std::clog << "\nnext bytecode:\n"; for(u64 i = begin; i& globals, const nasal_builtin_table* native_table, const std::string* file_list) { const_number = number_list; const_string = string_list; natives = native_table; files = file_list; + + global_variable.resize(globals.size()); + for(auto& [name, index]: globals) { + global_variable[index] = name; + } +} + +void codestream::set(const f64* number_list, + const std::string* string_list, + const std::vector& globals, + const nasal_builtin_table* native_table, + const std::string* file_list) { + const_number = number_list; + const_string = string_list; + natives = native_table; + files = file_list; + + global_variable = globals; } void codestream::dump(std::ostream& out) const { @@ -93,13 +112,16 @@ void codestream::dump(std::ostream& out) const { case op_jmp: case op_jt: case op_jf: - case op_callg: case op_mcallg: case op_loadg: case op_calll: case op_mcalll: case op_loadl: out << hex << "0x" << num << dec; break; + case op_callg: + out << hex << "0x" << num << dec; + out << " (" << util::rawstr(global_variable[num], 32) << ")"; + break; case op_callb: out << hex << "0x" << num << dec; out << " <" << natives[num].name << "@0x"; diff --git a/src/nasal_opcode.h b/src/nasal_opcode.h index 9201ff8..e12d94b 100644 --- a/src/nasal_opcode.h +++ b/src/nasal_opcode.h @@ -4,6 +4,10 @@ #include "natives/builtin.h" #include +#include +#include +#include +#include namespace nasal { @@ -207,11 +211,18 @@ private: inline static const std::string* const_string = nullptr; inline static const nasal_builtin_table* natives = nullptr; inline static const std::string* files = nullptr; + inline static std::vector global_variable; public: codestream(const opcode& c, const u64 i): code(c), index(i) {} static void set(const f64*, const std::string*, + const std::unordered_map&, + const nasal_builtin_table*, + const std::string* file_list = nullptr); + static void set(const f64*, + const std::string*, + const std::vector&, const nasal_builtin_table*, const std::string* file_list = nullptr); void dump(std::ostream&) const; diff --git a/src/nasal_vm.cpp b/src/nasal_vm.cpp index 96b9388..8bd5b2b 100644 --- a/src/nasal_vm.cpp +++ b/src/nasal_vm.cpp @@ -327,7 +327,13 @@ void vm::trace_back() { std::clog << "\nback trace "; std::clog << (ngc.cort? "(coroutine)":"(main)") << "\n"; - codestream::set(const_number, const_string, native_function.data(), files); + codestream::set( + const_number, + const_string, + global_symbol_name, + native_function.data(), + files + ); for(u64 p = 0, same = 0, prev = 0xffffffff; !ret.empty(); prev = p, ret.pop()) { if ((p = ret.top())==prev) {