First commit
This commit is contained in:
90
src/types/closure.cpp
Normal file
90
src/types/closure.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
#include "CrossLang.hpp"
|
||||
namespace Tesses::CrossLang {
|
||||
TArgWrapper* TArgWrapper::Create(GCList& ls, TCallable* callable)
|
||||
{
|
||||
TArgWrapper* argWrapper = new TArgWrapper();
|
||||
argWrapper->callable = callable;
|
||||
GC* gc = ls.GetGC();
|
||||
ls.Add(argWrapper);
|
||||
gc->Watch(argWrapper);
|
||||
return argWrapper;
|
||||
}
|
||||
TArgWrapper* TArgWrapper::Create(GCList* ls, TCallable* callable)
|
||||
{
|
||||
TArgWrapper* argWrapper = new TArgWrapper();
|
||||
argWrapper->callable = callable;
|
||||
GC* gc = ls->GetGC();
|
||||
ls->Add(argWrapper);
|
||||
gc->Watch(argWrapper);
|
||||
return argWrapper;
|
||||
}
|
||||
TObject TArgWrapper::Call(GCList& ls,std::vector<TObject> args)
|
||||
{
|
||||
auto cse = current_function;
|
||||
TList* argList = TList::Create(ls);
|
||||
argList->items = args;
|
||||
TObject v=this->callable->Call(ls,{argList});
|
||||
current_function = cse;
|
||||
return v;
|
||||
}
|
||||
void TArgWrapper::Mark()
|
||||
{
|
||||
if(this->marked) return;
|
||||
this->marked = true;
|
||||
this->callable->Mark();
|
||||
}
|
||||
void TClosure::Mark()
|
||||
{
|
||||
if(this->marked) return;
|
||||
this->marked=true;
|
||||
this->file->Mark();
|
||||
this->env->Mark();
|
||||
this->closure->Mark();
|
||||
|
||||
}
|
||||
TClosure* TClosure::Create(GCList& ls,TEnvironment* env,TFile* file,uint32_t chunkId,bool ownScope)
|
||||
{
|
||||
TClosure* closure = new TClosure();
|
||||
closure->ownScope=ownScope;
|
||||
GC* _gc = ls.GetGC();
|
||||
ls.Add(closure);
|
||||
_gc->Watch(closure);
|
||||
closure->chunkId = chunkId;
|
||||
if(chunkId < file->chunks.size())
|
||||
closure->closure = file->chunks[chunkId];
|
||||
else throw VMException("ChunkId out of bounds.");
|
||||
closure->env = env;
|
||||
closure->file = file;
|
||||
|
||||
return closure;
|
||||
}
|
||||
TClosure* TClosure::Create(GCList* ls,TEnvironment* env,TFile* file,uint32_t chunkId,bool ownScope)
|
||||
{
|
||||
TClosure* closure = new TClosure();
|
||||
closure->ownScope=ownScope;
|
||||
GC* _gc = ls->GetGC();
|
||||
ls->Add(closure);
|
||||
_gc->Watch(closure);
|
||||
closure->chunkId = chunkId;
|
||||
if(chunkId < file->chunks.size())
|
||||
closure->closure = file->chunks[chunkId];
|
||||
else throw VMException("ChunkId out of bounds.");
|
||||
closure->env = env;
|
||||
closure->file = file;
|
||||
|
||||
return closure;
|
||||
}
|
||||
|
||||
TObject TClosure::Call(GCList& ls,std::vector<TObject> args)
|
||||
{
|
||||
auto cse = current_function;
|
||||
InterperterThread* thrd=InterperterThread::Create(ls);
|
||||
thrd->AddCallStackEntry(ls,this, args);
|
||||
|
||||
thrd->Execute(ls.GetGC());
|
||||
|
||||
TObject v= thrd->call_stack_entries[0]->Pop(ls);
|
||||
current_function = cse;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user