From 03f28a33db245beae0442ce516f976362b5fe783 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Sat, 31 May 2025 16:23:57 -0500 Subject: [PATCH] fix on macos --- include/CrossLang.hpp | 1 - src/runtime_methods/class.cpp | 96 +++++++++++++++++++++++++++++++++++ src/vm/gc.cpp | 2 +- src/vm/vm.cpp | 18 ++++++- 4 files changed, 114 insertions(+), 3 deletions(-) diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index 33d22b7..bf4211d 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -16,7 +16,6 @@ #include #include #include -#include #include /** diff --git a/src/runtime_methods/class.cpp b/src/runtime_methods/class.cpp index 83fadfc..ea9a669 100644 --- a/src/runtime_methods/class.cpp +++ b/src/runtime_methods/class.cpp @@ -59,6 +59,80 @@ namespace Tesses::CrossLang TDItem("Entries",EntriesToList(ls,f->classes.at(index).entry)) }); } + static TObject Class_CreateInstance(TRootEnvironment* env,GCList& ls, std::vector args) + { + TList* args_ls; + if(!GetArgumentHeap(args,1,args_ls)) return nullptr; + TList* list; + TClassObject* obj; + std::string str; + if(GetArgumentHeap(args,0,list)) + { + std::vector clsName; + for(int64_t i = 0; i < list->Count(); i++) + { + auto o = list->Get(i); + if(GetObject(o,str)) clsName.push_back(str); + } + for(auto& item : env->classes) + { + auto& f=item.first->classes.at(item.second); + + if(f.name.size() != clsName.size()) continue; + + bool found=true; + for(size_t i = 0; i < f.name.size(); i++) + if(f.name[i] != clsName[i]) + { + found=false; + break; + } + if(found) + { + return TClassObject::Create(ls,item.first,item.second,env,args_ls->items); + } + else + continue; + } + } + else if(GetArgument(args,0,str)) + { + std::vector clsName=Tesses::Framework::Http::HttpUtils::SplitString(str,"."); + for(auto& item : env->classes) + { + auto& f=item.first->classes.at(item.second); + + if(f.name.size() != clsName.size()) continue; + + bool found=true; + for(size_t i = 0; i < f.name.size(); i++) + if(f.name[i] != clsName[i]) + { + found=false; + break; + } + if(found) + { + return TClassObject::Create(ls,item.first,item.second,env,args_ls->items); + + } + else + continue; + } + } + return nullptr; + } + static TObject Class_GetClassNames(TRootEnvironment* env,GCList& ls, std::vector args) + { + TList* list = TList::Create(ls); + ls.GetGC()->BarrierBegin(); + for(auto& item : env->classes) + { + list->Add(JoinPeriod(item.first->classes.at(item.second).name)); + } + ls.GetGC()->BarrierEnd(); + return list; + } static TObject Class_GetInfo(TRootEnvironment* env,GCList& ls, std::vector args) { @@ -138,6 +212,28 @@ namespace Tesses::CrossLang ext->watch.push_back(env); cls->SetValue("GetInfo",ext); + + ext = TExternalMethod::Create(ls ,"Get the class names",{},[env](GCList& ls, std::vector args)->TObject { + return Class_GetClassNames(env,ls,args); + }); + ext->watch.push_back(env); + + cls->SetValue("GetClassNames",ext); + ext = TExternalMethod::Create(ls ,"Create an instance of class",{"name","args"},[env](GCList& ls, std::vector args)->TObject { + return Class_CreateInstance(env,ls,args); + }); + ext->watch.push_back(env); + + cls->SetValue("CreateInstance",ext); + cls->DeclareFunction(gc,"Name","Get class name via instance",{"instance"},[](GCList& ls, std::vector args)->TObject { + TClassObject* cls; + if(GetArgumentHeap(args,0,cls)) + { + return cls->name; + } + return ""; + }); + gc->BarrierEnd(); } } \ No newline at end of file diff --git a/src/vm/gc.cpp b/src/vm/gc.cpp index 3585c59..dc497af 100644 --- a/src/vm/gc.cpp +++ b/src/vm/gc.cpp @@ -81,7 +81,7 @@ namespace Tesses::CrossLang }); dict->DeclareFunction(ls.GetGC(),"getFinished","Get whether thread has finished",{},[th](GCList& _ls, std::vector _args)-> TObject{ - return th->hasReturned; + return (bool)(th->hasReturned==true); }); ls.GetGC()->BarrierEnd(); diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index 25d0b97..4ac607e 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -5669,7 +5669,9 @@ namespace Tesses::CrossLang { cse.back()->Push(gc,callable->Call(ls,{value})); return false; } + gc->BarrierBegin(); cls->SetValue(cse.back()->callable->className,key,value); + gc->BarrierEnd(); cse.back()->Push(gc,value); return false; @@ -6277,12 +6279,26 @@ namespace Tesses::CrossLang { 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); if(dict != nullptr) { dict->SetValue(std::get(k), value); } + else if(cls != nullptr) + { + auto obj=cls->GetValue(cse.back()->callable->className,"set"+std::get(k)); + TCallable* callable; + if(GetObjectHeap(obj,callable)) + { + gc->BarrierEnd(); + + callable->Call(ls,{value}); + gc->BarrierBegin(); + }else { + cls->SetValue(cse.back()->callable->className,std::get(k),value); + } + } } stk->Push(gc, objhold);