From 230848a6e18015a3c4501f0b368ac73b167edc60 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Mon, 13 May 2024 00:06:37 +0800 Subject: [PATCH] :memo: improve maintainability --- src/nasal_type.cpp | 64 ++++++++++++++++++++++++---------------------- src/nasal_vm.h | 59 +++++++++++++++++++++++++++--------------- test/class.nas | 14 +++++----- test/scalar.nas | 18 ++++++++++++- 4 files changed, 96 insertions(+), 59 deletions(-) diff --git a/src/nasal_type.cpp b/src/nasal_type.cpp index bef537c..537db2f 100644 --- a/src/nasal_type.cpp +++ b/src/nasal_type.cpp @@ -42,6 +42,7 @@ var nas_hash::get_value(const std::string& key) { } else if (!elems.count("parents")) { return var::none(); } + auto ret = var::none(); auto& val = elems.at("parents"); if (!val.is_vec()) { @@ -64,12 +65,14 @@ var* nas_hash::get_memory(const std::string& key) { } else if (!elems.count("parents")) { return nullptr; } + var* addr = nullptr; var& val = elems.at("parents"); if (!val.is_vec()) { return addr; } for(auto& i : val.vec().elems) { + // recursively search key in `parents` if (i.is_hash()) { addr = i.hash().get_memory(key); } @@ -102,11 +105,10 @@ void nas_func::clear() { keys.clear(); } -void nas_ghost::set( - const std::string& ghost_type_name, - destructor destructor_pointer, - marker gc_marker_pointer, - void* ghost_pointer) { +void nas_ghost::set(const std::string& ghost_type_name, + destructor destructor_pointer, + marker gc_marker_pointer, + void* ghost_pointer) { type_name = ghost_type_name; destructor_function = destructor_pointer; gc_mark_function = gc_marker_pointer; @@ -214,14 +216,14 @@ nas_val::nas_val(vm_type val_type) { nas_val::~nas_val() { switch(type) { - case vm_type::vm_str: delete ptr.str; break; - case vm_type::vm_vec: delete ptr.vec; break; - case vm_type::vm_hash: delete ptr.hash; break; - case vm_type::vm_func: delete ptr.func; break; - case vm_type::vm_upval:delete ptr.upval; break; - case vm_type::vm_ghost:delete ptr.obj; break; - case vm_type::vm_co: delete ptr.co; break; - case vm_type::vm_map: delete ptr.map; break; + case vm_type::vm_str: delete ptr.str; break; + case vm_type::vm_vec: delete ptr.vec; break; + case vm_type::vm_hash: delete ptr.hash; break; + case vm_type::vm_func: delete ptr.func; break; + case vm_type::vm_upval: delete ptr.upval; break; + case vm_type::vm_ghost: delete ptr.obj; break; + case vm_type::vm_co: delete ptr.co; break; + case vm_type::vm_map: delete ptr.map; break; default: break; } type = vm_type::vm_nil; @@ -229,14 +231,14 @@ nas_val::~nas_val() { void nas_val::clear() { switch(type) { - case vm_type::vm_str: ptr.str->clear(); break; - case vm_type::vm_vec: ptr.vec->elems.clear(); break; - case vm_type::vm_hash: ptr.hash->elems.clear(); break; - case vm_type::vm_func: ptr.func->clear(); break; - case vm_type::vm_upval:ptr.upval->clear(); break; - case vm_type::vm_ghost:ptr.obj->clear(); break; - case vm_type::vm_co: ptr.co->clear(); break; - case vm_type::vm_map: ptr.map->clear(); break; + case vm_type::vm_str: ptr.str->clear(); break; + case vm_type::vm_vec: ptr.vec->elems.clear(); break; + case vm_type::vm_hash: ptr.hash->elems.clear(); break; + case vm_type::vm_func: ptr.func->clear(); break; + case vm_type::vm_upval: ptr.upval->clear(); break; + case vm_type::vm_ghost: ptr.obj->clear(); break; + case vm_type::vm_co: ptr.co->clear(); break; + case vm_type::vm_map: ptr.map->clear(); break; default: break; } } @@ -259,16 +261,16 @@ std::string var::to_str() { std::ostream& operator<<(std::ostream& out, var& ref) { switch(ref.type) { - case vm_type::vm_none: out << "undefined"; break; - case vm_type::vm_nil: out << "nil"; break; - case vm_type::vm_num: out << ref.val.num; break; - case vm_type::vm_str: out << ref.str(); break; - case vm_type::vm_vec: out << ref.vec(); break; - case vm_type::vm_hash: out << ref.hash(); break; - case vm_type::vm_func: out << "func(..) {..}"; break; - case vm_type::vm_ghost:out << ref.ghost(); break; - case vm_type::vm_co: out << ref.co(); break; - case vm_type::vm_map: out << ref.map(); break; + case vm_type::vm_none: out << "undefined"; break; + case vm_type::vm_nil: out << "nil"; break; + case vm_type::vm_num: out << ref.val.num; break; + case vm_type::vm_str: out << ref.str(); break; + case vm_type::vm_vec: out << ref.vec(); break; + case vm_type::vm_hash: out << ref.hash(); break; + case vm_type::vm_func: out << "func(..) {..}"; break; + case vm_type::vm_ghost: out << ref.ghost(); break; + case vm_type::vm_co: out << ref.co(); break; + case vm_type::vm_map: out << ref.map(); break; default: break; } return out; diff --git a/src/nasal_vm.h b/src/nasal_vm.h index ea175f7..2286b01 100644 --- a/src/nasal_vm.h +++ b/src/nasal_vm.h @@ -20,13 +20,15 @@ namespace nasal { class vm { protected: - /* registers of vm */ - context ctx; // running context + /* vm context */ + context ctx; /* constants */ - const f64* const_number = nullptr; // constant numbers - const std::string* const_string = nullptr; // constant symbols and strings + const f64* const_number = nullptr; + const std::string* const_string = nullptr; std::vector imm; // immediate number table + + /* nasal native functions */ std::vector native_function; /* garbage collector */ @@ -77,9 +79,11 @@ protected: std::string type_name_string(const var&) const; void die(const std::string&); +protected: /* vm calculation functions*/ inline bool cond(var&); +protected: /* vm operands */ inline void o_repl(); inline void o_intl(); @@ -247,8 +251,9 @@ inline void vm::o_newv() { auto& vec = newv.vec().elems; vec.resize(imm[ctx.pc]); // use top-=imm[pc]-1 here will cause error if imm[pc] is 0 - ctx.top = ctx.top-imm[ctx.pc]+1; - for(u32 i = 0; i