|
|
@ -1004,8 +1004,16 @@ void ink_gc(struct context* ctx) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Start by marking the roots of the routines */ |
|
|
|
/* Start by marking the roots of the routines, Clear the routines if possible */ |
|
|
|
for(i = 0; i < ctx->routines_top; ++i) { |
|
|
|
if(ctx->routine[i].panic == INK_ROUTINE_SUCCESS) { |
|
|
|
ctx->free(ctx->routine[i].stack); |
|
|
|
ctx->free(ctx->routine[i].function_stack); |
|
|
|
ctx->routine[i].panic = INK_ROUTINE_CAN_REUSE; |
|
|
|
} |
|
|
|
if(ctx->routine[i].panic == INK_ROUTINE_CAN_REUSE) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
for(j = 0; j < ctx->routines[i].top; ++j) { |
|
|
|
v = ink_get_value_link(ctx, ctx->routines[i].stack[j]); |
|
|
|
if(v != NULL) ++v->uses; |
|
|
|