diff --git a/CMakeLists.txt b/CMakeLists.txt index 64d7e3c..420a92d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.10) -project(nasal VERSION 11.2) +project(nasal VERSION 11.3) message("CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}") diff --git a/src/nasal.h b/src/nasal.h index 664200d..fb5ed9f 100644 --- a/src/nasal.h +++ b/src/nasal.h @@ -1,7 +1,7 @@ #pragma once #ifndef __nasver__ -#define __nasver__ "11.2" +#define __nasver__ "11.3" #endif #include diff --git a/src/nasal_vm.cpp b/src/nasal_vm.cpp index 006a392..c58b502 100644 --- a/src/nasal_vm.cpp +++ b/src/nasal_vm.cpp @@ -63,45 +63,74 @@ void vm::context_and_global_init() { } } +void vm::hash_value_info(var& val) { + std::clog << "{"; + usize count = 0; + for(const auto& i : val.hash().elems) { + ++count; + if (count>3) { + break; + } + + std::clog << i.first; + if (count!=val.hash().size()) { + std::clog << ", "; + } + } + if (val.hash().size()>3) { + std::clog << "..."; + } + std::clog << "}"; +} + void vm::value_info(var& val) { const auto p = reinterpret_cast(val.val.gcobj); switch(val.type) { case vm_type::vm_none: std::clog << "| null |"; break; - case vm_type::vm_ret: std::clog << "| pc | 0x" << std::hex - << val.ret() << std::dec; break; - case vm_type::vm_addr: std::clog << "| addr | 0x" << std::hex - << reinterpret_cast(val.addr()) - << std::dec; break; + case vm_type::vm_ret: + std::clog << "| pc | 0x" << std::hex << val.ret() << std::dec; + break; + case vm_type::vm_addr: + std::clog << "| addr | 0x"; + std::clog << std::hex << reinterpret_cast(val.addr()) << std::dec; + break; case vm_type::vm_cnt: std::clog << "| cnt | " << val.cnt(); break; case vm_type::vm_nil: std::clog << "| nil |"; break; case vm_type::vm_num: std::clog << "| num | " << val.num(); break; - case vm_type::vm_str: std::clog << "| str | <0x" << std::hex << p - << "> \"" << util::rawstr(val.str(), 16) - << "\"" << std::dec; break; - case vm_type::vm_func: std::clog << "| func | <0x" << std::hex << p - << std::dec << "> " << val.func(); - break; - case vm_type::vm_upval:std::clog << "| upval| <0x" << std::hex << p - << std::dec << "> [" << val.upval().size - << " val]"; break; - case vm_type::vm_vec: std::clog << "| vec | <0x" << std::hex << p - << std::dec << "> [" << val.vec().size() - << " val]"; break; - case vm_type::vm_hash: std::clog << "| hash | <0x" << std::hex << p - << std::dec << "> {" << val.hash().size() - << " val}"; break; - case vm_type::vm_ghost:std::clog << "| obj | <0x" << std::hex << p - << "> obj:0x" - << reinterpret_cast(val.ghost().pointer) - << std::dec; break; - case vm_type::vm_co: std::clog << "| co | <0x" << std::hex << p - << std::dec << "> coroutine"; break; - case vm_type::vm_map: std::clog << "| nmspc| <0x" << std::hex << p - << std::dec << "> namespace [" - << val.map().mapper.size() - << " val]"; break; - default: std::clog << "| err | <0x" << std::hex << p - << std::dec << "> unknown object"; break; + case vm_type::vm_str: + std::clog << "| str | <0x" << std::hex << p << "> " << std::dec; + std::clog << "\"" << util::rawstr(val.str(), 16) << "\""; + break; + case vm_type::vm_func: + std::clog << "| func | <0x" << std::hex << p << std::dec << "> "; + std::clog << val.func(); + break; + case vm_type::vm_upval: + std::clog << "| upval| <0x" << std::hex << p << std::dec; + std::clog << "> [" << val.upval().size << " val]"; break; + case vm_type::vm_vec: + std::clog << "| vec | <0x" << std::hex << p << std::dec; + std::clog << "> [" << val.vec().size() << " val]"; break; + case vm_type::vm_hash: + std::clog << "| hash | <0x" << std::hex << p << std::dec << "> "; + hash_value_info(val); + break; + case vm_type::vm_ghost: + std::clog << "| obj | <0x" << std::hex << p << "> " << std::dec; + std::clog << "obj:" << val.ghost().type_name; + break; + case vm_type::vm_co: + std::clog << "| co | <0x" << std::hex << p << std::dec; + std::clog << "> coroutine"; + break; + case vm_type::vm_map: + std::clog << "| nmspc| <0x" << std::hex << p << std::dec; + std::clog << "> namespace [" << val.map().mapper.size() << " val]"; + break; + default: + std::clog << "| err | <0x" << std::hex << p << std::dec; + std::clog << "> unknown object"; + break; } std::clog << "\n"; } diff --git a/src/nasal_vm.h b/src/nasal_vm.h index 392dfaa..27b9678 100644 --- a/src/nasal_vm.h +++ b/src/nasal_vm.h @@ -65,6 +65,7 @@ protected: protected: /* debug functions */ bool verbose = false; + void hash_value_info(var&); void value_info(var&); void function_detail_info(const nas_func&); void function_call_trace();