Fix a bug where a crvm dependency is freed if it only has classes

This commit is contained in:
2025-11-14 12:12:22 -06:00
parent 5a384ca015
commit 06e19150e8
5 changed files with 31 additions and 3 deletions

View File

@@ -1230,6 +1230,10 @@ namespace Tesses::CrossLang
}
return nullptr;
}
static TObject New_Task(GCList& ls, std::vector<TObject> args)
{
return TTask::Create(ls);
}
void TStd::RegisterRoot(GC* gc, TRootEnvironment* env)
{
GCList ls(gc);
@@ -1370,6 +1374,7 @@ namespace Tesses::CrossLang
});
newTypes->DeclareFunction(gc,"DocumentationParser","Parse documentation blocks",{"documentationString"},New_DocumentationParser);
newTypes->DeclareFunction(gc,"ByteArray","Create bytearray, with optional either size (to size it) or string argument (to fill byte array)",{"$data"},ByteArray);
newTypes->DeclareFunction(gc,"Task","Create a task for async, to manually create an async object",{},New_Task);
env->DeclareVariable("Version", TDictionary::Create(ls,{
TDItem("Parse",TExternalMethod::Create(ls,"Parse version from string",{"versionStr"},[](GCList& ls, std::vector<TObject> args)->TObject{

View File

@@ -314,6 +314,7 @@ namespace Tesses::CrossLang {
if(this->permissions.customConsole != nullptr) this->permissions.customConsole->Mark();
for(auto defer : this->defers) defer->Mark();
if(this->error != nullptr) this->error->Mark();
for(auto cls : this->classes) cls.first->Mark();
}
TRootEnvironment* TRootEnvironment::Create(GCList* gc,TDictionary* dict)
{

View File

@@ -3996,6 +3996,28 @@ namespace Tesses::CrossLang {
if(ttask != nullptr)
{
if(key == "SetSucceeded")
{
if(args.size() > 0)
{
ttask->SetSucceeded(args[0]);
}
cse.back()->Push(gc, Undefined());
return false;
}
if(key == "SetFailed")
{
if(args.size() > 0)
{
try {
throw VMByteCodeException(gc,args[0]);
} catch(...) {
ttask->SetFailed(std::current_exception());
}
}
cse.back()->Push(gc, Undefined());
return false;
}
if(key == "ContinueWith")
{
TCallable* callable2;
@@ -7002,7 +7024,7 @@ namespace Tesses::CrossLang {
}
cse.erase(cse.end()-1);
}
gc->BarrierEnd();
gc->BarrierEnd();
for(auto item : callable)
{