From 175afbafebd005e0504c407f34b07338ab4c7b17 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Thu, 10 Sep 2026 07:21:04 -0500 Subject: [PATCH] Remove THeapObjectHolder, std::nullptr_t from variant --- include/CrossLang.hpp | 31 +++++--- src/compiler/ast.cpp | 2 +- src/compiler/parser.cpp | 12 ++- src/runtime_methods/json.cpp | 16 ++-- src/runtime_methods/std.cpp | 29 +++---- src/types/native.cpp | 4 +- src/types/rootenvironment.cpp | 11 ++- src/vm/bc/add.cpp | 4 +- src/vm/bc/equals.cpp | 39 +++++----- src/vm/bc/executemethod2.cpp | 6 +- src/vm/bc/getfield.cpp | 10 +-- src/vm/bc/invokemethod.cpp | 5 +- src/vm/bc/invoketwo.cpp | 5 +- src/vm/bc/setfield.cpp | 10 +-- src/vm/bc/sub.cpp | 4 +- src/vm/bc/tobool.cpp | 4 +- src/vm/bc/tostring.cpp | 6 +- src/vm/gc.cpp | 12 +-- src/vm/gclist.cpp | 8 +- src/vm/vm.cpp | 137 ++++++++++++++++------------------ 20 files changed, 169 insertions(+), 186 deletions(-) diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index bb3dde1..60d3f86 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -1357,13 +1357,6 @@ class THeapObject { virtual ~THeapObject() = default; }; -class THeapObjectHolder { - public: - THeapObject *obj; - THeapObjectHolder(THeapObject *obj) { this->obj = obj; } - THeapObjectHolder() {} -}; - // this is a dummy type with class MethodInvoker {}; @@ -1377,7 +1370,7 @@ class TContinue {}; using TObject = std::variant, std::shared_ptr, TBreak, TContinue, std::shared_ptr, @@ -2578,6 +2571,22 @@ template bool GetObject(TObject &obj, T &res) { res = std::get(obj); return true; } + +inline bool IsNull(const TObject &obj) { + if (!std::holds_alternative(obj)) + return false; + + return std::get(obj) == nullptr; +} + +[[deprecated("Use GetObjectHeap() with TString instead")]] +inline bool GetObject(TObject &obj, std::string &str) { + if (!std::holds_alternative(obj)) + return false; + str = std::get(obj); + return true; +} + template bool GetArgument(std::vector &args, size_t index, T &obj) { if (index >= args.size()) @@ -2586,10 +2595,10 @@ bool GetArgument(std::vector &args, size_t index, T &obj) { } template bool GetObjectHeap(TObject &obj, T &res) { - THeapObjectHolder h; - if (!GetObject(obj, h)) + THeapObject *h; + if (!GetObject(obj, h)) return false; - auto v = dynamic_cast(h.obj); + auto v = dynamic_cast(h); if (v == nullptr) return false; res = v; diff --git a/src/compiler/ast.cpp b/src/compiler/ast.cpp index 945361f..235234c 100644 --- a/src/compiler/ast.cpp +++ b/src/compiler/ast.cpp @@ -75,7 +75,7 @@ SyntaxNode Deserialize(std::string astData) { } #if defined(CROSSLANG_ENABLE_JSON) static json_t *Serialize2(SyntaxNode node) { - if (std::holds_alternative(node)) + if (IsNull(node)) return json_null(); if (std::holds_alternative(node)) { return json_integer(std::get(node)); diff --git a/src/compiler/parser.cpp b/src/compiler/parser.cpp index 3c8f770..7a21e13 100644 --- a/src/compiler/parser.cpp +++ b/src/compiler/parser.cpp @@ -5,7 +5,7 @@ namespace Tesses::CrossLang { SyntaxNode TObject2SyntaxNode(TObject o) { if (std::holds_alternative(o)) return Undefined(); - if (std::holds_alternative(o)) + if (IsNull(o)) return nullptr; if (std::holds_alternative(o)) return std::get(o); @@ -491,9 +491,8 @@ void Parser::ParseHtml(std::vector &nodes, std::string var) { EnsureSymbol(">"); if (std::holds_alternative(item)) - item = AdvancedSyntaxNode::Create( - DeclareExpression, true, - {"item"}); + item = AdvancedSyntaxNode::Create(DeclareExpression, true, + {"item"}); std::vector _nodes; parseFn(_nodes, "each"); @@ -1379,9 +1378,8 @@ SyntaxNode Parser::ParseNode(bool isRoot) { body = ParseNode(); } if (std::holds_alternative(item)) - item = AdvancedSyntaxNode::Create( - DeclareExpression, true, - {"item"}); + item = + AdvancedSyntaxNode::Create(DeclareExpression, true, {"item"}); return AdvancedSyntaxNode::Create(EachStatement, false, {item, list, body}); diff --git a/src/runtime_methods/json.cpp b/src/runtime_methods/json.cpp index 9aa7bf0..709e65a 100644 --- a/src/runtime_methods/json.cpp +++ b/src/runtime_methods/json.cpp @@ -5,7 +5,7 @@ using namespace Tesses::Framework::Serialization::Json; namespace Tesses::CrossLang { static bool IsValidForJson(TObject v) { - if (std::holds_alternative(v)) + if (IsNull(v)) return true; if (std::holds_alternative(v)) @@ -20,10 +20,10 @@ static bool IsValidForJson(TObject v) { if (std::holds_alternative(v)) return true; - if (std::holds_alternative(v)) { - auto res = std::get(v); - auto ls = dynamic_cast(res.obj); - auto dict = dynamic_cast(res.obj); + if (std::holds_alternative(v)) { + auto res = std::get(v); + auto ls = dynamic_cast(res); + auto dict = dynamic_cast(res); if (ls != nullptr) return true; if (dict != nullptr) @@ -32,7 +32,7 @@ static bool IsValidForJson(TObject v) { return false; } static JToken JsonSerialize(TObject v) { - if (std::holds_alternative(v)) + if (IsNull(v)) return nullptr; if (std::holds_alternative(v)) return std::get(v); @@ -42,8 +42,8 @@ static JToken JsonSerialize(TObject v) { return std::get(v); if (std::holds_alternative(v)) return std::get(v); - if (std::holds_alternative(v)) { - auto obj = std::get(v).obj; + if (std::holds_alternative(v)) { + auto obj = std::get(v); auto ls = dynamic_cast(obj); auto dict = dynamic_cast(obj); diff --git a/src/runtime_methods/std.cpp b/src/runtime_methods/std.cpp index a3a4f28..f6afc69 100644 --- a/src/runtime_methods/std.cpp +++ b/src/runtime_methods/std.cpp @@ -143,8 +143,8 @@ ffi_tmp_type_t FFI_ConvertTObjectToFFIType(TObject &arg, std::string t) { return (ffi_tmp_type_t){ .v_ptr = (void *)std::get(arg).c_str()}; } - } else if (std::holds_alternative(arg)) { - auto obj = std::get(arg).obj; + } else if (std::holds_alternative(arg)) { + auto obj = std::get(arg); auto bA = dynamic_cast(obj); auto nat = dynamic_cast(obj); if (bA != nullptr) { @@ -435,13 +435,7 @@ static TObject TypeIsClass(GCList &ls, std::vector args) { static TObject TypeIsDefined(GCList &ls, std::vector args) { if (args.empty()) return nullptr; - return (!std::holds_alternative(args[0]) && - !std::holds_alternative(args[0])); -} -static TObject TypeIsHeap(GCList &ls, std::vector args) { - if (args.empty()) - return nullptr; - return std::holds_alternative(args[0]); + return (!IsNull(args[0]) && !std::holds_alternative(args[0])); } static TObject TypeIsNumber(GCList &ls, std::vector args) { if (args.empty()) @@ -668,7 +662,7 @@ std::string GetObjectTypeString(TObject _obj) { return "Regex"; if (std::holds_alternative(_obj)) return "Undefined"; - if (std::holds_alternative(_obj)) + if (IsNull(_obj)) return "Null"; if (std::holds_alternative(_obj)) return "Boolean"; @@ -820,8 +814,8 @@ std::string GetObjectTypeString(TObject _obj) { } return "VFS"; } - if (std::holds_alternative(_obj)) { - auto obj = std::get(_obj).obj; + if (std::holds_alternative(_obj)) { + auto obj = std::get(_obj); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1380,10 +1374,7 @@ void TStd::RegisterRoot(std::shared_ptr gc, TRootEnvironment *env) { env->DeclareFunction(gc, "TypeIsDefined", "Get whether object is not null or undefined", {"object"}, TypeIsDefined); - env->DeclareFunction( - gc, "TypeIsHeap", - "Get whether object is susceptible to garbage collection", {"object"}, - TypeIsHeap); + env->DeclareFunction(gc, "TypeIsNumber", "Get whether object is a number", {"object"}, TypeIsNumber); env->DeclareFunction(gc, "TypeIsLong", @@ -1455,9 +1446,9 @@ void TStd::RegisterRoot(std::shared_ptr gc, TRootEnvironment *env) { gc, "Thread", "Create thread", {"callback"}, [](GCList &ls, std::vector args) -> TObject { if (args.size() == 1 && - std::holds_alternative(args[0])) { - auto cb = dynamic_cast( - std::get(args[0]).obj); + std::holds_alternative(args[0])) { + auto cb = + dynamic_cast(std::get(args[0])); if (cb != nullptr) { return CreateThread(ls, cb, false); } diff --git a/src/types/native.cpp b/src/types/native.cpp index 17f9c37..afa14a9 100644 --- a/src/types/native.cpp +++ b/src/types/native.cpp @@ -26,8 +26,8 @@ void TNative::Destroy() { } bool TNativeObject::ToBool() { return true; } bool TNativeObject::Equals(std::shared_ptr gc, TObject right) { - if (std::holds_alternative(right)) { - return this == std::get(right).obj; + if (std::holds_alternative(right)) { + return this == std::get(right); } return false; } diff --git a/src/types/rootenvironment.cpp b/src/types/rootenvironment.cpp index 7b74b5e..458a26e 100644 --- a/src/types/rootenvironment.cpp +++ b/src/types/rootenvironment.cpp @@ -171,9 +171,8 @@ void TEnvironment::DeclareVariable(std::shared_ptr gc, TObject v = this->GetVariable(name[0]); TDictionary *dict = nullptr; - if (std::holds_alternative(v)) { - dict = - dynamic_cast(std::get(v).obj); + if (std::holds_alternative(v)) { + dict = dynamic_cast(std::get(v)); if (dict == nullptr) { dict = TDictionary::Create(ls); gc->BarrierBegin(); @@ -191,9 +190,9 @@ void TEnvironment::DeclareVariable(std::shared_ptr gc, gc->BarrierBegin(); auto v = dict->GetValue(name[i]); gc->BarrierEnd(); - if (std::holds_alternative(v)) { - auto dict2 = dynamic_cast( - std::get(v).obj); + if (std::holds_alternative(v)) { + auto dict2 = + dynamic_cast(std::get(v)); if (dict2 == nullptr) { dict2 = TDictionary::Create(ls); gc->BarrierBegin(); diff --git a/src/vm/bc/add.cpp b/src/vm/bc/add.cpp index c7c4c49..39807c7 100644 --- a/src/vm/bc/add.cpp +++ b/src/vm/bc/add.cpp @@ -119,8 +119,8 @@ bool InterperterThread::Add(std::shared_ptr gc) { str.append(std::get(left)); str.push_back(std::get(right)); cse.back()->Push(gc, str); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); auto natObj = dynamic_cast(obj); diff --git a/src/vm/bc/equals.cpp b/src/vm/bc/equals.cpp index 92de359..98c86fd 100644 --- a/src/vm/bc/equals.cpp +++ b/src/vm/bc/equals.cpp @@ -14,8 +14,7 @@ namespace Tesses::CrossLang { bool Equals(std::shared_ptr gc, TObject left, TObject right) { GCList ls(gc); - if (std::holds_alternative(left) && - std::holds_alternative(right)) { + if (IsNull(left) && IsNull(right)) { return true; } @@ -92,8 +91,8 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { auto r = std::get(right); return l == r; - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -109,12 +108,12 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { if (GetObjectHeap(obj, callable)) { return ToBool(callable->Call(ls, {right})); - } else if (std::holds_alternative(right)) { + } else if (IsNull(right)) { return false; } else if (std::holds_alternative(right)) { return false; - } else if (std::holds_alternative(right)) { - return cls == std::get(right).obj; + } else if (std::holds_alternative(right)) { + return cls == std::get(right); } } else if (natObj != nullptr) { return natObj->Equals(gc, right); @@ -124,10 +123,10 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { TObject fn = dict->GetValue("operator=="); gc->BarrierEnd(); if (!std::holds_alternative(fn)) { - if (std::holds_alternative(fn)) { + if (std::holds_alternative(fn)) { - auto obj = dynamic_cast( - std::get(fn).obj); + auto obj = + dynamic_cast(std::get(fn)); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { @@ -144,17 +143,17 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { } } else { - return dict == std::get(right).obj; + return dict == std::get(right); } } else { - return dict == std::get(right).obj; + return dict == std::get(right); } } else { - return dict == std::get(right).obj; + return dict == std::get(right); } return false; @@ -162,21 +161,19 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { else if (dynDict != nullptr) { auto res = dynDict->CallMethod(ls, "operator==", {right}); - if (!std::holds_alternative(res) && - std::holds_alternative(res)) { + if (!IsNull(res) && std::holds_alternative(res)) { return ToBool(res); } - } else if (native != nullptr && - std::holds_alternative(right)) { + } else if (native != nullptr && IsNull(right)) { return native->GetDestroyed(); } - if (std::holds_alternative(right)) { - return obj == std::get(right).obj; + if (std::holds_alternative(right)) { + return obj == std::get(right); } - else if (std::holds_alternative(right)) { + else if (IsNull(right)) { return false; } else if (std::holds_alternative(right)) { @@ -187,7 +184,7 @@ bool Equals(std::shared_ptr gc, TObject left, TObject right) { } - else if (std::holds_alternative(right)) { + else if (IsNull(right)) { return false; } else if (std::holds_alternative(right)) { return false; diff --git a/src/vm/bc/executemethod2.cpp b/src/vm/bc/executemethod2.cpp index 90798f5..36b604f 100644 --- a/src/vm/bc/executemethod2.cpp +++ b/src/vm/bc/executemethod2.cpp @@ -24,7 +24,7 @@ bool InterperterThread::ExecuteMethod2(std::shared_ptr gc, TObject instance, GCList ls(gc); std::regex regex; TVMVersion version; - if (std::holds_alternative(instance)) { + if (IsNull(instance)) { if (key == "ToString") { cse.back()->Push(gc, "null"); return false; @@ -1964,8 +1964,8 @@ bool InterperterThread::ExecuteMethod2(std::shared_ptr gc, TObject instance, } cse.back()->Push(gc, Undefined()); return false; - } else if (std::holds_alternative(instance)) { - auto obj = std::get(instance).obj; + } else if (std::holds_alternative(instance)) { + auto obj = std::get(instance); auto list = dynamic_cast(obj); auto dynList = dynamic_cast(obj); auto bArray = dynamic_cast(obj); diff --git a/src/vm/bc/getfield.cpp b/src/vm/bc/getfield.cpp index a2bcd4f..e967a24 100644 --- a/src/vm/bc/getfield.cpp +++ b/src/vm/bc/getfield.cpp @@ -323,8 +323,8 @@ bool InterperterThread::GetField(std::shared_ptr gc) { stk->Push(gc, Undefined()); return false; } - if (std::holds_alternative(instance)) { - auto obj = std::get(instance).obj; + if (std::holds_alternative(instance)) { + auto obj = std::get(instance); auto bA = dynamic_cast(obj); auto list = dynamic_cast(obj); auto dict = dynamic_cast(obj); @@ -669,9 +669,9 @@ bool InterperterThread::GetField(std::shared_ptr gc) { gc->BarrierBegin(); TObject fn = dict->GetValue("get" + key); gc->BarrierEnd(); - if (std::holds_alternative(fn) && - dynamic_cast( - std::get(fn).obj) != nullptr) { + if (std::holds_alternative(fn) && + dynamic_cast(std::get(fn)) != + nullptr) { return InvokeOne(ls, fn, dict); } else { gc->BarrierBegin(); diff --git a/src/vm/bc/invokemethod.cpp b/src/vm/bc/invokemethod.cpp index 26c9777..e5287b4 100644 --- a/src/vm/bc/invokemethod.cpp +++ b/src/vm/bc/invokemethod.cpp @@ -15,10 +15,9 @@ namespace Tesses::CrossLang { bool InterperterThread::InvokeMethod(GCList &ls, TObject fn, TObject instance, std::vector args) { - if (std::holds_alternative(fn)) { + if (std::holds_alternative(fn)) { - auto obj = - dynamic_cast(std::get(fn).obj); + auto obj = dynamic_cast(std::get(fn)); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { diff --git a/src/vm/bc/invoketwo.cpp b/src/vm/bc/invoketwo.cpp index 54b5c32..1a4d55d 100644 --- a/src/vm/bc/invoketwo.cpp +++ b/src/vm/bc/invoketwo.cpp @@ -12,10 +12,9 @@ namespace Tesses::CrossLang { bool InterperterThread::InvokeTwo(GCList &ls, TObject fn, TObject left, TObject right) { - if (std::holds_alternative(fn)) { + if (std::holds_alternative(fn)) { - auto obj = - dynamic_cast(std::get(fn).obj); + auto obj = dynamic_cast(std::get(fn)); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { diff --git a/src/vm/bc/setfield.cpp b/src/vm/bc/setfield.cpp index b4e5cf1..0d1295e 100644 --- a/src/vm/bc/setfield.cpp +++ b/src/vm/bc/setfield.cpp @@ -257,8 +257,8 @@ bool InterperterThread::SetField(std::shared_ptr gc) { stk->Push(gc, Undefined()); return false; } - if (std::holds_alternative(instance)) { - auto obj = std::get(instance).obj; + if (std::holds_alternative(instance)) { + auto obj = std::get(instance); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -313,9 +313,9 @@ bool InterperterThread::SetField(std::shared_ptr gc) { gc->BarrierBegin(); TObject fn = dict->GetValue("set" + key); gc->BarrierEnd(); - if (std::holds_alternative(fn) && - dynamic_cast( - std::get(fn).obj) != nullptr) { + if (std::holds_alternative(fn) && + dynamic_cast(std::get(fn)) != + nullptr) { return InvokeTwo(ls, fn, dict, value); } else { gc->BarrierBegin(); diff --git a/src/vm/bc/sub.cpp b/src/vm/bc/sub.cpp index 2874072..e1db190 100644 --- a/src/vm/bc/sub.cpp +++ b/src/vm/bc/sub.cpp @@ -65,8 +65,8 @@ bool InterperterThread::Sub(std::shared_ptr gc) { cse.back()->Push( gc, std::make_shared((*l) - (*r))); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); diff --git a/src/vm/bc/tobool.cpp b/src/vm/bc/tobool.cpp index f3ef224..b128542 100644 --- a/src/vm/bc/tobool.cpp +++ b/src/vm/bc/tobool.cpp @@ -44,8 +44,8 @@ bool ToBool(TObject obj) { } else if (std::holds_alternative(obj)) { auto &uuid = std::get(obj); return !uuid.IsEmpty(); - } else if (std::holds_alternative(obj)) { - auto o = std::get(obj).obj; + } else if (std::holds_alternative(obj)) { + auto o = std::get(obj); auto ls = dynamic_cast(o); auto aarray = dynamic_cast(o); auto dict = dynamic_cast(o); diff --git a/src/vm/bc/tostring.cpp b/src/vm/bc/tostring.cpp index d8003de..13c0479 100644 --- a/src/vm/bc/tostring.cpp +++ b/src/vm/bc/tostring.cpp @@ -31,7 +31,7 @@ std::string ToString(std::shared_ptr gc, TObject o) { if (std::holds_alternative(o)) { return std::string{std::get(o)}; } - if (std::holds_alternative(o)) { + if (IsNull(o)) { return "null"; } if (std::holds_alternative(o)) { @@ -54,8 +54,8 @@ std::string ToString(std::shared_ptr gc, TObject o) { return std::get(o).ToString( Framework::UuidStringifyConfig::LowercaseNoCurly); } - if (std::holds_alternative(o)) { - auto obj = std::get(o).obj; + if (std::holds_alternative(o)) { + auto obj = std::get(o); auto dict = dynamic_cast(obj); auto list = dynamic_cast(obj); auto bArray = dynamic_cast(obj); diff --git a/src/vm/gc.cpp b/src/vm/gc.cpp index b3cb524..644e7af 100644 --- a/src/vm/gc.cpp +++ b/src/vm/gc.cpp @@ -140,8 +140,8 @@ bool GC::UsingNullThreads() { return false; } void GC::BarrierBegin() { this->mtx.Lock(); } void GC::BarrierEnd() { this->mtx.Unlock(); } void GC::Watch(TObject obj) { - if (std::holds_alternative(obj)) { - auto _item = std::get(obj).obj; + if (std::holds_alternative(obj)) { + auto _item = std::get(obj); this->BarrierBegin(); this->objects.insert(_item); auto nowAllocs = ++this->allocs; @@ -151,14 +151,14 @@ void GC::Watch(TObject obj) { } } void GC::Mark(TObject obj) { - if (std::holds_alternative(obj)) { - auto _item = std::get(obj).obj; + if (std::holds_alternative(obj)) { + auto _item = std::get(obj); _item->Mark(); } } void GC::Unwatch(TObject obj) { - if (std::holds_alternative(obj)) { - auto _item = std::get(obj).obj; + if (std::holds_alternative(obj)) { + auto _item = std::get(obj); this->BarrierBegin(); this->objects.erase(_item); this->BarrierEnd(); diff --git a/src/vm/gclist.cpp b/src/vm/gclist.cpp index a05adfe..4eb1c64 100644 --- a/src/vm/gclist.cpp +++ b/src/vm/gclist.cpp @@ -10,8 +10,8 @@ GCList::GCList(std::shared_ptr gc) { std::shared_ptr GCList::GetGC() const { return this->gc; } void GCList::Remove(TObject obj) { - if (std::holds_alternative(obj)) { - auto _item = std::get(obj).obj; + if (std::holds_alternative(obj)) { + auto _item = std::get(obj); this->gc->BarrierBegin(); for (auto index = this->items.begin(); index != this->items.end(); index++) { @@ -25,8 +25,8 @@ void GCList::Remove(TObject obj) { } void GCList::Add(TObject obj) { - if (std::holds_alternative(obj)) { - auto _item = std::get(obj).obj; + if (std::holds_alternative(obj)) { + auto _item = std::get(obj); this->gc->BarrierBegin(); for (auto item : this->items) { diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index d8a251d..9adf8bf 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -79,8 +79,8 @@ bool InterperterThread::Times(std::shared_ptr gc) { } else if (std::holds_alternative(left) && std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) * std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -180,8 +180,8 @@ bool InterperterThread::Divide(std::shared_ptr gc) { cse.back()->Push(gc, std::get(left) / std::get(right)); } - else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -256,8 +256,8 @@ bool InterperterThread::Mod(std::shared_ptr gc) { gc, fmod(std::get(left), std::get(right))); } - else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -312,8 +312,8 @@ bool InterperterThread::Neg(std::shared_ptr gc) { cse.back()->Push(gc, -std::get(left)); } else if (std::holds_alternative(left)) { cse.back()->Push(gc, -std::get(left)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -365,7 +365,7 @@ bool InterperterThread::LNot(std::shared_ptr gc) { if (std::holds_alternative(left)) { cse.back()->Push(gc, true); - } else if (std::holds_alternative(left)) { + } else if (IsNull(left)) { cse.back()->Push(gc, true); } @@ -375,8 +375,8 @@ bool InterperterThread::LNot(std::shared_ptr gc) { else if (std::holds_alternative(left)) { cse.back()->Push(gc, !std::get(left)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -431,8 +431,8 @@ bool InterperterThread::BNot(std::shared_ptr gc) { cse.back()->Push(gc, ~std::get(left)); } - else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -538,8 +538,8 @@ bool InterperterThread::Lt(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() < r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -644,8 +644,8 @@ bool InterperterThread::Gt(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() > r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -751,8 +751,8 @@ bool InterperterThread::Lte(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() <= r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -863,8 +863,8 @@ bool InterperterThread::Gte(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() >= r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -917,8 +917,7 @@ bool InterperterThread::Eq(std::shared_ptr gc) { GCList ls(gc); auto right = cse.back()->Pop(ls); auto left = cse.back()->Pop(ls); - if (std::holds_alternative(left) && - std::holds_alternative(right)) { + if (IsNull(left) && IsNull(right)) { cse.back()->Push(gc, true); return false; } @@ -1000,8 +999,8 @@ bool InterperterThread::Eq(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() == r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1039,25 +1038,23 @@ bool InterperterThread::Eq(std::shared_ptr gc) { else if (dynDict != nullptr) { auto res = dynDict->CallMethod(ls, "operator==", {right}); - if (!std::holds_alternative(res) && - std::holds_alternative(res)) { + if (!IsNull(res) && std::holds_alternative(res)) { cse.back()->Push(gc, res); return false; } } - else if (native != nullptr && - std::holds_alternative(right)) { + else if (native != nullptr && IsNull(right)) { cse.back()->Push(gc, native->GetDestroyed()); return false; } - if (std::holds_alternative(right)) { - cse.back()->Push(gc, obj == std::get(right).obj); + if (std::holds_alternative(right)) { + cse.back()->Push(gc, obj == std::get(right)); return false; } - else if (std::holds_alternative(right)) { + else if (IsNull(right)) { cse.back()->Push(gc, false); return false; } else if (std::holds_alternative(right)) { @@ -1069,7 +1066,7 @@ bool InterperterThread::Eq(std::shared_ptr gc) { } - else if (std::holds_alternative(right)) { + else if (IsNull(right)) { cse.back()->Push(gc, false); return false; } else if (std::holds_alternative(right)) { @@ -1087,8 +1084,7 @@ bool InterperterThread::NEq(std::shared_ptr gc) { auto right = cse.back()->Pop(ls); auto left = cse.back()->Pop(ls); - if (std::holds_alternative(left) && - std::holds_alternative(right)) { + if (IsNull(left) && IsNull(right)) { cse.back()->Push(gc, false); return false; } else if (std::holds_alternative(left) && @@ -1158,8 +1154,8 @@ bool InterperterThread::NEq(std::shared_ptr gc) { auto &r = std::get>(right); cse.back()->Push(gc, l->TotalSeconds() != r->TotalSeconds()); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto native = dynamic_cast(obj); auto natObj = dynamic_cast(obj); @@ -1196,22 +1192,20 @@ bool InterperterThread::NEq(std::shared_ptr gc) { else if (dynDict != nullptr) { auto res = dynDict->CallMethod(ls, "operator!=", {right}); - if (!std::holds_alternative(res) && - std::holds_alternative(res)) { + if (!IsNull(res) && std::holds_alternative(res)) { cse.back()->Push(gc, res); return false; } } - else if (native != nullptr && - std::holds_alternative(right)) { + else if (native != nullptr && IsNull(right)) { cse.back()->Push(gc, !native->GetDestroyed()); return false; } - if (std::holds_alternative(right)) { - cse.back()->Push(gc, obj != std::get(right).obj); + if (std::holds_alternative(right)) { + cse.back()->Push(gc, obj != std::get(right)); return false; - } else if (std::holds_alternative(right)) { + } else if (IsNull(right)) { cse.back()->Push(gc, true); return false; } else if (std::holds_alternative(right)) { @@ -1224,7 +1218,7 @@ bool InterperterThread::NEq(std::shared_ptr gc) { } else if (std::holds_alternative(right)) { cse.back()->Push(gc, true); return false; - } else if (std::holds_alternative(right)) { + } else if (IsNull(right)) { cse.back()->Push(gc, true); return false; } else { @@ -1243,8 +1237,8 @@ bool InterperterThread::LShift(std::shared_ptr gc) { std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) << (int)std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1301,8 +1295,8 @@ bool InterperterThread::RShift(std::shared_ptr gc) { std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) >> (int)std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1359,8 +1353,8 @@ bool InterperterThread::BOr(std::shared_ptr gc) { std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) | std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1417,8 +1411,8 @@ bool InterperterThread::XOr(std::shared_ptr gc) { std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) ^ std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1474,8 +1468,8 @@ bool InterperterThread::BAnd(std::shared_ptr gc) { std::holds_alternative(right)) { cse.back()->Push(gc, std::get(left) & std::get(right)); - } else if (std::holds_alternative(left)) { - auto obj = std::get(left).obj; + } else if (std::holds_alternative(left)) { + auto obj = std::get(left); auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1520,10 +1514,9 @@ bool InterperterThread::BAnd(std::shared_ptr gc) { return false; } bool InterperterThread::InvokeOne(GCList &ls, TObject fn, TObject arg) { - if (std::holds_alternative(fn)) { + if (std::holds_alternative(fn)) { - auto obj = - dynamic_cast(std::get(fn).obj); + auto obj = dynamic_cast(std::get(fn)); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { @@ -1568,10 +1561,10 @@ bool InterperterThread::ExecuteFunction(std::shared_ptr gc) { if (args.size() == 3) { if (std::holds_alternative(args[1]) && - std::holds_alternative(args[2])) { + std::holds_alternative(args[2])) { std::string key = std::get(args[1]); TList *ls = dynamic_cast( - std::get(args[2]).obj); + std::get(args[2])); if (ls != nullptr) return ExecuteMethod2(gc, args[0], key, ls->items); } @@ -1580,10 +1573,10 @@ bool InterperterThread::ExecuteFunction(std::shared_ptr gc) { return false; } - if (std::holds_alternative(fn)) { + if (std::holds_alternative(fn)) { - auto obj = dynamic_cast( - std::get(fn).obj); + auto obj = + dynamic_cast(std::get(fn)); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { @@ -2147,8 +2140,7 @@ bool InterperterThread::JumpIfDefined(std::shared_ptr gc) { auto _res2 = stk->Pop(ls); stk->ip = stk->ip + 4; - if (!std::holds_alternative(_res2) && - !std::holds_alternative(_res2)) { + if (!std::holds_alternative(_res2) && !IsNull(_res2)) { stk->ip = n; stk->Push(gc, _res2); } @@ -2321,9 +2313,8 @@ bool InterperterThread::AppendList(std::shared_ptr gc) { gc->BarrierBegin(); auto obj = stk->Pop(ls); auto objhold = stk->Pop(ls); - if (std::holds_alternative(objhold)) { - auto list = - dynamic_cast(std::get(objhold).obj); + if (std::holds_alternative(objhold)) { + auto list = dynamic_cast(std::get(objhold)); if (list != nullptr) { list->Add(obj); } @@ -2353,12 +2344,12 @@ bool InterperterThread::AppendDictionary(std::shared_ptr gc) { auto value = stk->Pop(ls); auto k = stk->Pop(ls); auto objhold = stk->Pop(ls); - if (std::holds_alternative(objhold) && + if (std::holds_alternative(objhold) && std::holds_alternative(k)) { - auto dict = dynamic_cast( - std::get(objhold).obj); - auto cls = dynamic_cast( - std::get(objhold).obj); + auto dict = + dynamic_cast(std::get(objhold)); + auto cls = + dynamic_cast(std::get(objhold)); if (dict != nullptr) { dict->SetValue(std::get(k), value);