Exceptions!!!
This commit is contained in:
@@ -33,6 +33,7 @@ ObjectGCSet GC_WHITE = 2;
|
||||
|
||||
enum IncrementalGCSetp {
|
||||
GC_STEP_STATICS,
|
||||
GC_STEP_UNWIND,
|
||||
GC_STEP_STACK,
|
||||
GC_STEP_HEAP,
|
||||
GC_STEP_FREE,
|
||||
@@ -264,7 +265,7 @@ static void mark_statics(size_t *restrict limit) {
|
||||
// we processed the whole list, move to the next step
|
||||
if (!node) {
|
||||
incremental_state.next_static = static_objects;
|
||||
incremental_state.step = GC_STEP_STACK;
|
||||
incremental_state.step = GC_STEP_UNWIND;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -311,6 +312,26 @@ static void mark_stack_frame(StackFrame *frame, size_t *restrict limit) {
|
||||
}
|
||||
}
|
||||
|
||||
static void mark_unwind_info(size_t *restrict limit) {
|
||||
if (the_stack.unwind_info.set) {
|
||||
switch (the_stack.unwind_info.cause) {
|
||||
case UNWIND_NORMAL:
|
||||
mark_object(the_stack.unwind_info.target);
|
||||
saturating_dec(limit, 1);
|
||||
break;
|
||||
case UNWIND_EXCEPTION:
|
||||
mark_object(the_stack.unwind_info.exception.name);
|
||||
mark_object(the_stack.unwind_info.exception.data);
|
||||
saturating_dec(limit, 2);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
incremental_state.step = GC_STEP_STACK;
|
||||
}
|
||||
|
||||
static void mark_the_stack(size_t *restrict limit) {
|
||||
size_t i;
|
||||
for (i = 0; i < the_stack.depth && *limit; ++i) {
|
||||
@@ -385,6 +406,9 @@ void lisp_gc_yield(struct timespec *restrict time_took, bool full) {
|
||||
case GC_STEP_STATICS:
|
||||
mark_statics(&limit);
|
||||
break;
|
||||
case GC_STEP_UNWIND:
|
||||
mark_unwind_info(&limit);
|
||||
break;
|
||||
case GC_STEP_STACK:
|
||||
mark_the_stack(&limit);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user