mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-02-09 01:25:45 +00:00
make exception throwing in vm use exception_ptr
This commit is contained in:
@@ -6967,7 +6967,7 @@ namespace Tesses::CrossLang {
|
|||||||
|
|
||||||
stk->mustReturn=false;
|
stk->mustReturn=false;
|
||||||
}
|
}
|
||||||
catch(VMByteCodeException& ex)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -6997,71 +6997,7 @@ namespace Tesses::CrossLang {
|
|||||||
item->Call(ls2,{});
|
item->Call(ls2,{});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw ex;
|
std::rethrow_exception(std::current_exception());
|
||||||
}
|
|
||||||
catch(VMException& ex)
|
|
||||||
{
|
|
||||||
|
|
||||||
{
|
|
||||||
gc->BarrierBegin();
|
|
||||||
GCList ls(gc);
|
|
||||||
std::vector<TCallable*> callable;
|
|
||||||
while(!cse.empty())
|
|
||||||
{
|
|
||||||
auto r= cse.back();
|
|
||||||
auto e = r->env;
|
|
||||||
for(uint32_t i = 0; i < r->scopes; i++)
|
|
||||||
{
|
|
||||||
if(!e->defers.empty())
|
|
||||||
{
|
|
||||||
ls.Add(e);
|
|
||||||
callable.insert(callable.end(), e->defers.begin(),e->defers.end());
|
|
||||||
}
|
|
||||||
e = e->GetParentEnvironment();
|
|
||||||
}
|
|
||||||
cse.erase(cse.end()-1);
|
|
||||||
}
|
|
||||||
gc->BarrierEnd();
|
|
||||||
|
|
||||||
for(auto item : callable)
|
|
||||||
{
|
|
||||||
GCList ls2(gc);
|
|
||||||
item->Call(ls2,{});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
catch(std::exception& ex)
|
|
||||||
{
|
|
||||||
|
|
||||||
{
|
|
||||||
gc->BarrierBegin();
|
|
||||||
GCList ls(gc);
|
|
||||||
std::vector<TCallable*> callable;
|
|
||||||
while(!cse.empty())
|
|
||||||
{
|
|
||||||
auto r= cse.back();
|
|
||||||
auto e = r->env;
|
|
||||||
for(uint32_t i = 0; i < r->scopes; i++)
|
|
||||||
{
|
|
||||||
if(!e->defers.empty())
|
|
||||||
{
|
|
||||||
ls.Add(e);
|
|
||||||
callable.insert(callable.end(), e->defers.begin(),e->defers.end());
|
|
||||||
}
|
|
||||||
e = e->GetParentEnvironment();
|
|
||||||
}
|
|
||||||
cse.erase(cse.end()-1);
|
|
||||||
}
|
|
||||||
gc->BarrierEnd();
|
|
||||||
|
|
||||||
for(auto item : callable)
|
|
||||||
{
|
|
||||||
GCList ls2(gc);
|
|
||||||
item->Call(ls2,{});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
}
|
||||||
if(cse.size()==1)
|
if(cse.size()==1)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user