fix garbage collection of attributed variables.
This commit is contained in:
parent
9f7df27e3a
commit
04ddd8dca0
51
C/heapgc.c
51
C/heapgc.c
@ -1153,30 +1153,6 @@ check_global(void) {
|
|||||||
static void
|
static void
|
||||||
mark_variable(CELL_PTR current);
|
mark_variable(CELL_PTR current);
|
||||||
|
|
||||||
static void
|
|
||||||
mark_att_var(CELL *hp)
|
|
||||||
{
|
|
||||||
if (!MARKED_PTR(hp-1)) {
|
|
||||||
MARK(hp-1);
|
|
||||||
PUSH_POINTER(hp-1);
|
|
||||||
total_marked++;
|
|
||||||
if (hp < HGEN) {
|
|
||||||
total_oldies++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!MARKED_PTR(hp)) {
|
|
||||||
MARK(hp);
|
|
||||||
PUSH_POINTER(hp);
|
|
||||||
total_marked++;
|
|
||||||
if (hp < HGEN) {
|
|
||||||
total_oldies++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mark_variable(hp+1);
|
|
||||||
mark_variable(hp+2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mark_variable(CELL_PTR current)
|
mark_variable(CELL_PTR current)
|
||||||
{
|
{
|
||||||
@ -1201,7 +1177,30 @@ mark_variable(CELL_PTR current)
|
|||||||
|
|
||||||
if (IsVarTerm(ccur)) {
|
if (IsVarTerm(ccur)) {
|
||||||
if (IN_BETWEEN(H0,current,H) && IsAttVar(current) && current==next) {
|
if (IN_BETWEEN(H0,current,H) && IsAttVar(current) && current==next) {
|
||||||
mark_att_var(current);
|
if (next < H0) POP_CONTINUATION();
|
||||||
|
if (!UNMARKED_MARK(next-1,local_bp)) {
|
||||||
|
total_marked++;
|
||||||
|
if (next-1 < HGEN) {
|
||||||
|
total_oldies++;
|
||||||
|
}
|
||||||
|
PUSH_POINTER(next-1);
|
||||||
|
}
|
||||||
|
next++;
|
||||||
|
if (!UNMARKED_MARK(next,local_bp)) {
|
||||||
|
total_marked++;
|
||||||
|
if (next < HGEN) {
|
||||||
|
total_oldies++;
|
||||||
|
}
|
||||||
|
PUSH_POINTER(next);
|
||||||
|
}
|
||||||
|
next++;
|
||||||
|
if (!UNMARKED_MARK(next,local_bp)) {
|
||||||
|
total_marked++;
|
||||||
|
if (next < HGEN) {
|
||||||
|
total_oldies++;
|
||||||
|
}
|
||||||
|
PUSH_POINTER(next);
|
||||||
|
}
|
||||||
POP_CONTINUATION();
|
POP_CONTINUATION();
|
||||||
} else if (ONHEAP(next)) {
|
} else if (ONHEAP(next)) {
|
||||||
#ifdef EASY_SHUNTING
|
#ifdef EASY_SHUNTING
|
||||||
@ -1725,7 +1724,7 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B
|
|||||||
goto remove_trash_entry;
|
goto remove_trash_entry;
|
||||||
} else {
|
} else {
|
||||||
/* This attributed variable is still in play */
|
/* This attributed variable is still in play */
|
||||||
mark_att_var(cptr);
|
mark_variable(cptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!gc_lookup_ma_var(cptr, trail_base)) {
|
if (!gc_lookup_ma_var(cptr, trail_base)) {
|
||||||
|
Reference in New Issue
Block a user