diff --git a/src/nasal_gc.cpp b/src/nasal_gc.cpp index bf34a5e..f9df309 100644 --- a/src/nasal_gc.cpp +++ b/src/nasal_gc.cpp @@ -373,7 +373,9 @@ void gc::mark_context(std::vector& bfs_queue) { // scan now running context, this context maybe related to coroutine or main 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->upvalr); @@ -385,7 +387,9 @@ void gc::mark_context(std::vector& bfs_queue) { // coroutine is running, so scan main process stack from mctx 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.upvalr); @@ -422,7 +426,9 @@ void gc::mark_hash(std::vector& bfs_queue, nas_hash& hash) { void gc::mark_func(std::vector& bfs_queue, nas_func& function) { 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) { bfs_queue.push_back(i); @@ -431,7 +437,9 @@ void gc::mark_func(std::vector& bfs_queue, nas_func& function) { void gc::mark_upval(std::vector& bfs_queue, nas_upval& upval) { 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& bfs_queue, nas_co& co) { bfs_queue.push_back(co.ctx.funcr); bfs_queue.push_back(co.ctx.upvalr); 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& bfs_queue, nas_map& mp) { 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", "object", "coroutine", - "mapper", + "namespace", nullptr }; diff --git a/src/nasal_gc.h b/src/nasal_gc.h index 93fee0b..a3937e9 100644 --- a/src/nasal_gc.h +++ b/src/nasal_gc.h @@ -48,7 +48,7 @@ enum vm_type:u8 { vm_upval, vm_obj, vm_co, - vm_map // for globals, arg + vm_map // for globals and namespaces }; const u32 gc_type_size = vm_map-vm_str+1;