make sure garbage collector doesn't confused with overwrites in attvars
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1142 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
bb2cb9e9f8
commit
e295016899
19
C/heapgc.c
19
C/heapgc.c
@ -2223,37 +2223,44 @@ sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR)
|
|||||||
CELL trail_cell = TrailTerm(trail_ptr+2);
|
CELL trail_cell = TrailTerm(trail_ptr+2);
|
||||||
CELL *ptr;
|
CELL *ptr;
|
||||||
CELL old = TrailTerm(trail_ptr+1);
|
CELL old = TrailTerm(trail_ptr+1);
|
||||||
|
/* be sure we don't overwrite before we read */
|
||||||
|
int marked_ptr = MARKED_PTR(&TrailTerm(trail_ptr+2));
|
||||||
|
int marked_old = MARKED_PTR(&TrailTerm(trail_ptr+1));
|
||||||
|
#ifdef FROZEN_STACKS
|
||||||
|
int marked_val_old = MARKED_PTR(&TrailVal(trail_ptr+1));
|
||||||
|
int marked_val_ptr = MARKED_PTR(&TrailVal(trail_ptr+2));
|
||||||
|
#endif
|
||||||
|
|
||||||
if (MARKED_PTR(&TrailTerm(trail_ptr+2)))
|
if (marked_ptr)
|
||||||
ptr = RepAppl(UNMARK_CELL(trail_cell));
|
ptr = RepAppl(UNMARK_CELL(trail_cell));
|
||||||
else
|
else
|
||||||
ptr = RepAppl(trail_cell);
|
ptr = RepAppl(trail_cell);
|
||||||
|
|
||||||
TrailTerm(dest+1) = old;
|
TrailTerm(dest+1) = old;
|
||||||
TrailTerm(dest+2) = TrailTerm(dest) = trail_cell;
|
if (marked_old) {
|
||||||
if (MARKED_PTR(&TrailTerm(trail_ptr+1))) {
|
|
||||||
UNMARK(&TrailTerm(dest+1));
|
UNMARK(&TrailTerm(dest+1));
|
||||||
if (HEAP_PTR(old)) {
|
if (HEAP_PTR(old)) {
|
||||||
into_relocation_chain(&TrailTerm(dest+1), GET_NEXT(old));
|
into_relocation_chain(&TrailTerm(dest+1), GET_NEXT(old));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TrailTerm(dest+2) = TrailTerm(dest) = trail_cell;
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
TrailVal(dest+1) = TrailVal(trail_ptr+1);
|
TrailVal(dest+1) = TrailVal(trail_ptr+1);
|
||||||
if (MARKED_PTR(&TrailVal(dest+1))) {
|
if (marked_val_old) {
|
||||||
UNMARK(&TrailVal(dest+1));
|
UNMARK(&TrailVal(dest+1));
|
||||||
if (HEAP_PTR(TrailVal(dest+1))) {
|
if (HEAP_PTR(TrailVal(dest+1))) {
|
||||||
into_relocation_chain(&TrailVal(dest+1), GET_NEXT(TrailTerm(dest+1)));
|
into_relocation_chain(&TrailVal(dest+1), GET_NEXT(TrailTerm(dest+1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TrailVal(dest+2) = TrailVal(trail_ptr+2);
|
TrailVal(dest+2) = TrailVal(trail_ptr+2);
|
||||||
if (MARKED_PTR(&TrailVal(dest+2))) {
|
if (marked_val_ptr) {
|
||||||
UNMARK(&TrailVal(dest+2));
|
UNMARK(&TrailVal(dest+2));
|
||||||
if (HEAP_PTR(TrailVal(dest+2))) {
|
if (HEAP_PTR(TrailVal(dest+2))) {
|
||||||
into_relocation_chain(&TrailVal(dest+2), GET_NEXT(TrailTerm(dest+2)));
|
into_relocation_chain(&TrailVal(dest+2), GET_NEXT(TrailTerm(dest+2)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (MARKED_PTR(&TrailTerm(trail_ptr+2))) {
|
if (marked_ptr) {
|
||||||
UNMARK(&TrailTerm(dest));
|
UNMARK(&TrailTerm(dest));
|
||||||
UNMARK(&TrailTerm(dest+2));
|
UNMARK(&TrailTerm(dest+2));
|
||||||
if (HEAP_PTR(trail_cell)) {
|
if (HEAP_PTR(trail_cell)) {
|
||||||
|
Reference in New Issue
Block a user