⚡ optimize gc
This commit is contained in:
parent
48d1d8ddef
commit
0c183b5984
|
@ -373,7 +373,9 @@ void gc::mark_context(std::vector<var>& bfs_queue) {
|
||||||
|
|
||||||
// scan now running context, this context maybe related to coroutine or main
|
// scan now running context, this context maybe related to coroutine or main
|
||||||
for(var* i = rctx->stack; i<=rctx->top; ++i) {
|
for(var* i = rctx->stack; i<=rctx->top; ++i) {
|
||||||
bfs_queue.push_back(*i);
|
if (i->type>vm_num) {
|
||||||
|
bfs_queue.push_back(*i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bfs_queue.push_back(rctx->funcr);
|
bfs_queue.push_back(rctx->funcr);
|
||||||
bfs_queue.push_back(rctx->upvalr);
|
bfs_queue.push_back(rctx->upvalr);
|
||||||
|
@ -385,7 +387,9 @@ void gc::mark_context(std::vector<var>& bfs_queue) {
|
||||||
|
|
||||||
// coroutine is running, so scan main process stack from mctx
|
// coroutine is running, so scan main process stack from mctx
|
||||||
for(var* i = mctx.stack; i<=mctx.top; ++i) {
|
for(var* i = mctx.stack; i<=mctx.top; ++i) {
|
||||||
bfs_queue.push_back(*i);
|
if (i->type>vm_num) {
|
||||||
|
bfs_queue.push_back(*i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bfs_queue.push_back(mctx.funcr);
|
bfs_queue.push_back(mctx.funcr);
|
||||||
bfs_queue.push_back(mctx.upvalr);
|
bfs_queue.push_back(mctx.upvalr);
|
||||||
|
@ -422,7 +426,9 @@ void gc::mark_hash(std::vector<var>& bfs_queue, nas_hash& hash) {
|
||||||
|
|
||||||
void gc::mark_func(std::vector<var>& bfs_queue, nas_func& function) {
|
void gc::mark_func(std::vector<var>& bfs_queue, nas_func& function) {
|
||||||
for(auto& i : function.local) {
|
for(auto& i : function.local) {
|
||||||
bfs_queue.push_back(i);
|
if (i.type>vm_num) {
|
||||||
|
bfs_queue.push_back(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for(auto& i : function.upval) {
|
for(auto& i : function.upval) {
|
||||||
bfs_queue.push_back(i);
|
bfs_queue.push_back(i);
|
||||||
|
@ -431,7 +437,9 @@ void gc::mark_func(std::vector<var>& bfs_queue, nas_func& function) {
|
||||||
|
|
||||||
void gc::mark_upval(std::vector<var>& bfs_queue, nas_upval& upval) {
|
void gc::mark_upval(std::vector<var>& bfs_queue, nas_upval& upval) {
|
||||||
for(auto& i : upval.elems) {
|
for(auto& i : upval.elems) {
|
||||||
bfs_queue.push_back(i);
|
if (i.type>vm_num) {
|
||||||
|
bfs_queue.push_back(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,13 +447,17 @@ void gc::mark_co(std::vector<var>& bfs_queue, nas_co& co) {
|
||||||
bfs_queue.push_back(co.ctx.funcr);
|
bfs_queue.push_back(co.ctx.funcr);
|
||||||
bfs_queue.push_back(co.ctx.upvalr);
|
bfs_queue.push_back(co.ctx.upvalr);
|
||||||
for(var* i = co.stack; i<=co.ctx.top; ++i) {
|
for(var* i = co.stack; i<=co.ctx.top; ++i) {
|
||||||
bfs_queue.push_back(*i);
|
if (i->type>vm_num) {
|
||||||
|
bfs_queue.push_back(*i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gc::mark_map(std::vector<var>& bfs_queue, nas_map& mp) {
|
void gc::mark_map(std::vector<var>& bfs_queue, nas_map& mp) {
|
||||||
for(const auto& i : mp.mapper) {
|
for(const auto& i : mp.mapper) {
|
||||||
bfs_queue.push_back(*i.second);
|
if (i.second->type>vm_num) {
|
||||||
|
bfs_queue.push_back(*i.second);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -542,7 +554,7 @@ void gc::info() const {
|
||||||
"upvalue",
|
"upvalue",
|
||||||
"object",
|
"object",
|
||||||
"coroutine",
|
"coroutine",
|
||||||
"mapper",
|
"namespace",
|
||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ enum vm_type:u8 {
|
||||||
vm_upval,
|
vm_upval,
|
||||||
vm_obj,
|
vm_obj,
|
||||||
vm_co,
|
vm_co,
|
||||||
vm_map // for globals, arg
|
vm_map // for globals and namespaces
|
||||||
};
|
};
|
||||||
|
|
||||||
const u32 gc_type_size = vm_map-vm_str+1;
|
const u32 gc_type_size = vm_map-vm_str+1;
|
||||||
|
|
Loading…
Reference in New Issue