Fix docker

This commit is contained in:
2025-01-14 22:03:27 -06:00
parent 01a034a77b
commit 5c8dc0fd9b
9 changed files with 600 additions and 65 deletions

View File

@ -1,6 +1,96 @@
#include "CrossLang.hpp"
namespace Tesses::CrossLang {
TDynamicDictionary* TDynamicDictionary::Create(GCList& ls,TCallable* callable)
{
TDynamicDictionary* dict=new TDynamicDictionary();
dict->cb = callable;
GC* _gc = ls.GetGC();
ls.Add(dict);
_gc->Watch(dict);
return dict;
}
TDynamicDictionary* TDynamicDictionary::Create(GCList* ls,TCallable* callable)
{
TDynamicDictionary* dict=new TDynamicDictionary();
dict->cb = callable;
GC* _gc = ls->GetGC();
ls->Add(dict);
_gc->Watch(dict);
return dict;
}
void TDynamicDictionary::Mark()
{
if(this->marked) return;
this->marked=true;
this->cb->Mark();
}
TObject TDynamicDictionary::GetField(GCList& ls, std::string key)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "GetField");
dict->SetValue("Key", key);
ls.GetGC()->BarrierEnd();
return cb->Call(ls,{dict});
}
void TDynamicDictionary::SetField(GCList& ls, std::string key, TObject value)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "SetField");
dict->SetValue("Key", key);
dict->SetValue("Value", value);
ls.GetGC()->BarrierEnd();
cb->Call(ls,{dict});
}
TObject TDynamicDictionary::CallMethod(GCList& ls, std::string name, std::vector<TObject> args)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "CallMethod");
dict->SetValue("Name", name);
auto argVal = TList::Create(ls);
argVal->items = args;
dict->SetValue("Arguments", argVal);
ls.GetGC()->BarrierEnd();
return cb->Call(ls,{dict});
}
TEnumerator* TDynamicDictionary::GetEnumerator(GCList& ls)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "GetEnumerator");
ls.GetGC()->BarrierEnd();
return TEnumerator::CreateFromObject(ls,cb->Call(ls,{dict}));
}
bool TDynamicDictionary::MethodExists(GCList& ls,std::string name)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "MethodExists");
dict->SetValue("Name", name);
ls.GetGC()->BarrierEnd();
auto res = cb->Call(ls,{dict});
bool r2;
if(GetObject(res,r2)) return r2;
return false;
}
TDynamicDictionary::~TDynamicDictionary()
{
}
TObject TDictionary::CallMethod(GCList& ls, std::string key, std::vector<TObject> args)
{
ls.GetGC()->BarrierBegin();

View File

@ -56,6 +56,8 @@ namespace Tesses::CrossLang
{
std::string str;
TList* mls;
TDynamicList* dynList;
TDynamicDictionary* dynDict;
TDictionary* dict;
TEnumerator* enumerator;
if(GetObject(obj,str))
@ -66,6 +68,10 @@ namespace Tesses::CrossLang
{
return TListEnumerator::Create(ls,mls);
}
else if(GetObjectHeap(obj,dynList))
{
return TDynamicListEnumerator::Create(ls,dynList);
}
else if(GetObjectHeap(obj,dict))
{
auto res=dict->CallMethod(ls,"GetEnumerator",{});
@ -208,6 +214,52 @@ namespace Tesses::CrossLang
this->ls->Mark();
}
TDynamicListEnumerator* TDynamicListEnumerator::Create(GCList& ls, TDynamicList* list)
{
TDynamicListEnumerator* liste=new TDynamicListEnumerator();
liste->ls = list;
liste->index = -1;
GC* _gc = ls.GetGC();
ls.Add(liste);
_gc->Watch(liste);
return liste;
}
TDynamicListEnumerator* TDynamicListEnumerator::Create(GCList* ls, TDynamicList* list)
{
TDynamicListEnumerator* liste=new TDynamicListEnumerator();
liste->ls = list;
liste->index = -1;
GC* _gc = ls->GetGC();
ls->Add(liste);
_gc->Watch(liste);
return liste;
}
bool TDynamicListEnumerator::MoveNext(GC* ls)
{
this->index++;
GCList ls2(ls);
return this->index >= 0 && this->index < this->ls->Count(ls2);
}
TObject TDynamicListEnumerator::GetCurrent(GCList& ls)
{
if(this->index < -1) return nullptr;
auto r = this->ls->Count(ls);
if(r == 0) return nullptr;
if(this->index >= r) return nullptr;
ls.GetGC()->BarrierBegin();
TObject o = this->ls->GetAt(ls,index);
ls.GetGC()->BarrierEnd();
return o;
}
void TDynamicListEnumerator::Mark()
{
if(this->marked) return;
this->marked = true;
this->ls->Mark();
}
TStringEnumerator* TStringEnumerator::Create(GCList& ls,std::string str)
{
TStringEnumerator* stre=new TStringEnumerator();

View File

@ -1,5 +1,72 @@
#include "CrossLang.hpp"
namespace Tesses::CrossLang {
TDynamicList* TDynamicList::Create(GCList& ls,TCallable* callable)
{
TDynamicList* list=new TDynamicList();
list->cb = callable;
GC* _gc = ls.GetGC();
ls.Add(list);
_gc->Watch(list);
return list;
}
TDynamicList* TDynamicList::Create(GCList* ls,TCallable* callable)
{
TDynamicList* list=new TDynamicList();
list->cb = callable;
GC* _gc = ls->GetGC();
ls->Add(list);
_gc->Watch(list);
return list;
}
void TDynamicList::Mark()
{
if(this->marked) return;
this->marked=true;
this->cb->Mark();
}
int64_t TDynamicList::Count(GCList& ls)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "Count");
ls.GetGC()->BarrierEnd();
auto res = cb->Call(ls,{dict});
int64_t n;
if(GetObject(res,n)) return n;
return 0;
}
TObject TDynamicList::GetAt(GCList& ls, int64_t index)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "GetAt");
dict->SetValue("Index",index);
ls.GetGC()->BarrierEnd();
return cb->Call(ls,{dict});
}
void TDynamicList::SetAt(GCList& ls, int64_t index, TObject val)
{
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("Type", "SetAt");
dict->SetValue("Index",index);
dict->SetValue("Value",val);
ls.GetGC()->BarrierEnd();
cb->Call(ls,{dict});
}
TDynamicList::~TDynamicList()
{
}
TByteArray* TByteArray::Create(GCList& ls)
{
TByteArray* arr=new TByteArray();