*should mark the whole outer-scope chain when collecting garbage with a closure.

This commit is contained in:
Wang Renxin 2017-11-07 11:21:15 +08:00
parent 91ad8cd226
commit abbe1f85be

View File

@ -6405,9 +6405,11 @@ static int _gc_add_reachable(void* data, void* extra, void* h) {
case _DT_ROUTINE:
if(obj->data.routine->type == MB_RT_LAMBDA) {
if(!_ht_find(ht, &obj->data.routine->func.lambda.ref)) {
_running_context_ref_t* outs = obj->data.routine->func.lambda.outer_scope;
_ht_set_or_insert(ht, &obj->data.routine->func.lambda.ref, obj->data.routine);
if(obj->data.routine->func.lambda.outer_scope) {
_HT_FOREACH(obj->data.routine->func.lambda.outer_scope->scope->var_dict, _do_nothing_on_object, _gc_add_reachable, ht);
while(outs) {
_HT_FOREACH(outs->scope->var_dict, _do_nothing_on_object, _gc_add_reachable, ht);
outs = outs->prev;
}
}
}