From 476fbdb859d9aa42a483531ca9f40b383e07d1cd Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Fri, 1 Dec 2023 19:31:47 +0800 Subject: [PATCH] :sparkles: show function entry file location in call trace info --- module/json.cpp | 31 ++++++++++++++----------------- src/nasal_opcode.cpp | 2 +- src/nasal_vm.cpp | 3 ++- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/module/json.cpp b/module/json.cpp index 51adecc..8dab16f 100644 --- a/module/json.cpp +++ b/module/json.cpp @@ -58,7 +58,6 @@ private: std::string var_generate(var&); std::string vector_generate(nas_vec&); std::string hash_generate(nas_hash&); - std::string map_generate(nas_map&); private: bool is_num(char c) { @@ -95,11 +94,23 @@ std::string json::var_generate(var& value) { case vm_type::vm_num: { std::stringstream out; out << value.num(); + if (std::isnan(value.num())) { + error_info() += "json::stringify: cannot generate number nan\n"; + } + if (std::isinf(value.num())) { + error_info() += "json::stringify: cannot generate number inf\n"; + } return out.str(); } case vm_type::vm_str: return "\"" + value.str() + "\""; case vm_type::vm_vec: return vector_generate(value.vec()); case vm_type::vm_hash: return hash_generate(value.hash()); + case vm_type::vm_func: + error_info() += "json::stringify: cannot generate function\n"; break; + case vm_type::vm_ghost: + error_info() += "json::stringify: cannot generate ghost type\n"; break; + case vm_type::vm_map: + error_info() += "json::stringify: cannot generate namespace type\n"; break; default: break; } return "\"undefined\""; @@ -130,26 +141,12 @@ std::string json::hash_generate(nas_hash& hash) { return out; } -std::string json::map_generate(nas_map& nmap) { - std::string out = "{"; - for(auto& i : nmap.mapper) { - out += "\"" + i.first + "\":"; - out += var_generate(*i.second) + ","; - } - if (out.back()==',') { - out.pop_back(); - } - out += "}"; - return out; -} - std::string json::stringify(var& object) { + error_info() = ""; if (object.is_vec()) { return vector_generate(object.vec()); } else if (object.is_hash()) { return hash_generate(object.hash()); - } else if (object.is_map()) { - return map_generate(object.map()); } return "[]"; } @@ -349,7 +346,7 @@ var json::parse(const std::string& input, gc* ngc) { var stringify(var* args, usize size, gc* ngc) { auto object = args[0]; - if (!object.is_vec() && !object.is_hash() && !object.is_map()) { + if (!object.is_vec() && !object.is_hash()) { return nas_err("json::stringify", "must use hashmap or vector"); } return ngc->newstr(json().stringify(object)); diff --git a/src/nasal_opcode.cpp b/src/nasal_opcode.cpp index 8d2478f..6b8a36c 100644 --- a/src/nasal_opcode.cpp +++ b/src/nasal_opcode.cpp @@ -111,7 +111,7 @@ void codestream::dump(std::ostream& out) const { break; } if (files) { - out << "(" << files[code.fidx] << ":" << code.line << ")"; + out << " (" << files[code.fidx] << ":" << code.line << ")"; } } diff --git a/src/nasal_vm.cpp b/src/nasal_vm.cpp index 6cfb4d2..a6bc4d3 100644 --- a/src/nasal_vm.cpp +++ b/src/nasal_vm.cpp @@ -129,7 +129,8 @@ void vm::function_detail_info(const nas_func& func) { std::clog << const_string[func.dynamic_parameter_index] << "..."; } std::clog << ") "; - std::clog << "{entry: 0x" << std::hex << func.entry << std::dec << "}"; + const auto& code = bytecode[func.entry]; + std::clog << "{ entry: " << files[code.fidx] << ":" << code.line << " }"; } void vm::function_call_trace() {