Fix docker
This commit is contained in:
@ -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();
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
|
||||
Reference in New Issue
Block a user