* Implementation of Guardian is complete.
* Implementation not fully tested. May have corner cases.
This commit is contained in:
parent
8dac92a512
commit
5ccca042a6
BIN
bin/ikarus
BIN
bin/ikarus
Binary file not shown.
|
@ -488,15 +488,16 @@ guardians_loop(gc_t* gc){
|
|||
ik_guardian_table* t = pcb->guardians[i];
|
||||
while(t){
|
||||
int j;
|
||||
int c = t->count;
|
||||
for(j=0; j<c; j++){
|
||||
int count = t->count;
|
||||
for(j=0; j<count; j++){
|
||||
ikp tc = t->p[j].tc;
|
||||
ikp obj = t->p[j].obj;
|
||||
if(is_live(obj, gc)){
|
||||
pending_hold[i] =
|
||||
move_guardian(t->p[j].tc, obj, pending_hold[i]);
|
||||
move_guardian(tc, obj, pending_hold[i]);
|
||||
} else {
|
||||
pending_final =
|
||||
move_guardian(t->p[j].tc, obj, pending_final);
|
||||
move_guardian(tc, obj, pending_final);
|
||||
}
|
||||
}
|
||||
ik_guardian_table* next = t->next;
|
||||
|
@ -868,10 +869,12 @@ add_object_proc(gc_t* gc, ikp x)
|
|||
if(is_fixnum(x)){
|
||||
return x;
|
||||
}
|
||||
#ifndef NDEBUG
|
||||
if(x == forward_ptr){
|
||||
fprintf(stderr, "GOTCHA\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
int tag = tagof(x);
|
||||
if(tag == immediate_tag){
|
||||
return x;
|
||||
|
|
|
@ -833,7 +833,7 @@ ikrt_register_guardian(ikp tc, ikp obj, ikpcb* pcb){
|
|||
exit(-1);
|
||||
}
|
||||
ik_guardian_table* p =
|
||||
(ik_guardian_table*)ik_alloc(pcb, sizeof(ik_guardian_table));
|
||||
(ik_guardian_table*)ik_mmap(sizeof(ik_guardian_table));
|
||||
p->next = g;
|
||||
p->count = 0;
|
||||
pcb->guardians[0] = p;
|
||||
|
|
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
Loading…
Reference in New Issue