|
|
|
|
|
|
|
|
val->flags &= ~L2_VAL_MARKED; |
|
|
val->flags &= ~L2_VAL_MARKED; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Normal variables are unmarked by the above loop, |
|
|
|
|
|
// but builtins don't go through that loop |
|
|
|
|
|
for (size_t i = 0; i < vm->gc_start; ++i) { |
|
|
|
|
|
vm->values[i].flags &= ~L2_VAL_MARKED; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return freed; |
|
|
return freed; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gc_mark(vm, vm->stack[sptr]); |
|
|
gc_mark(vm, vm->stack[sptr]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
for (l2_word fsptr = 0; fsptr < vm->fsptr; ++fsptr) { |
|
|
|
|
|
|
|
|
// Don't need to mark the first stack frame, since that's where all the |
|
|
|
|
|
// builtins live, and they aren't sweeped anyways |
|
|
|
|
|
for (l2_word fsptr = 1; fsptr < vm->fsptr; ++fsptr) { |
|
|
gc_mark(vm, vm->fstack[fsptr].ns); |
|
|
gc_mark(vm, vm->fstack[fsptr].ns); |
|
|
} |
|
|
} |
|
|
|
|
|
|