From e2950168997724df87c9408e8b404983cbb7e64b Mon Sep 17 00:00:00 2001 From: vsc Date: Fri, 17 Sep 2004 21:22:32 +0000 Subject: [PATCH] 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 --- C/heapgc.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/C/heapgc.c b/C/heapgc.c index 4747c377f..c04b18d99 100644 --- a/C/heapgc.c +++ b/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 *ptr; 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)); else ptr = RepAppl(trail_cell); TrailTerm(dest+1) = old; - TrailTerm(dest+2) = TrailTerm(dest) = trail_cell; - if (MARKED_PTR(&TrailTerm(trail_ptr+1))) { + if (marked_old) { UNMARK(&TrailTerm(dest+1)); if (HEAP_PTR(old)) { into_relocation_chain(&TrailTerm(dest+1), GET_NEXT(old)); } } + TrailTerm(dest+2) = TrailTerm(dest) = trail_cell; #ifdef FROZEN_STACKS TrailVal(dest+1) = TrailVal(trail_ptr+1); - if (MARKED_PTR(&TrailVal(dest+1))) { + if (marked_val_old) { UNMARK(&TrailVal(dest+1)); if (HEAP_PTR(TrailVal(dest+1))) { into_relocation_chain(&TrailVal(dest+1), GET_NEXT(TrailTerm(dest+1))); } } TrailVal(dest+2) = TrailVal(trail_ptr+2); - if (MARKED_PTR(&TrailVal(dest+2))) { + if (marked_val_ptr) { UNMARK(&TrailVal(dest+2)); if (HEAP_PTR(TrailVal(dest+2))) { into_relocation_chain(&TrailVal(dest+2), GET_NEXT(TrailTerm(dest+2))); } } #endif - if (MARKED_PTR(&TrailTerm(trail_ptr+2))) { + if (marked_ptr) { UNMARK(&TrailTerm(dest)); UNMARK(&TrailTerm(dest+2)); if (HEAP_PTR(trail_cell)) {