From c362cc6d347d01126ee8ebf5ead1cbfad0309ebb Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 1 Dec 2019 15:28:47 -0700 Subject: [PATCH] fix list copying --- src/prolog/machine/copier.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/prolog/machine/copier.rs b/src/prolog/machine/copier.rs index 34c1bfe6..328c504a 100644 --- a/src/prolog/machine/copier.rs +++ b/src/prolog/machine/copier.rs @@ -71,13 +71,31 @@ impl CopyTermState { *self.value_at_scan() = HeapCellValue::Addr(Addr::Lis(threshold)); let hcv = self.target[addr].clone(); - self.target.push(hcv); + let ra = hcv.as_addr(threshold); + let rd = self.target.store(self.target.deref(ra)); + + self.target.push(hcv); + let hcv = self.target[addr + 1].clone(); self.target.push(hcv); - self.trail.push((Ref::HeapCell(addr), self.target[addr].clone())); - self.target[addr] = HeapCellValue::Addr(Addr::Lis(threshold)); + match rd.clone() { + Addr::AttrVar(h) | Addr::HeapCell(h) if h >= self.old_h => { + self.target[threshold] = HeapCellValue::Addr(rd) + } + ra @ Addr::AttrVar(_) | ra @ Addr::HeapCell(..) | ra @ Addr::StackCell(..) => { + if ra == rd { + self.reinstantiate_var(ra, threshold); + } else { + self.target[threshold] = HeapCellValue::Addr(ra); + } + } + _ => { + self.trail.push((Ref::HeapCell(addr), self.target[addr].clone())); + self.target[addr] = HeapCellValue::Addr(Addr::Lis(threshold)) + } + }; self.scan += 1; } -- 2.54.0