From 8e22dda7472d2ec4615b8f8dfc46cfd5ece5beef Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 4 Feb 2019 22:32:31 -0700 Subject: [PATCH] add support for copying attributed variables in copy_term --- src/prolog/copier.rs | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/prolog/copier.rs b/src/prolog/copier.rs index f075640b..cc910200 100644 --- a/src/prolog/copier.rs +++ b/src/prolog/copier.rs @@ -89,16 +89,14 @@ pub(crate) trait CopierTarget: IndexMut let rd = self.store(self.deref(ra)); match rd.clone() { - Addr::HeapCell(hc) if hc >= old_h => { - self[threshold] = HeapCellValue::Addr(rd); - }, - addr @ Addr::HeapCell(..) | addr @ Addr::StackCell(..) => { - if rd == addr { - self.reinstantiate_var(addr, threshold, &mut trail); + Addr::HeapCell(hc) if hc >= old_h => + self[threshold] = HeapCellValue::Addr(rd), + ra @ Addr::AttrVar(_) | ra @ Addr::HeapCell(..) | ra @ Addr::StackCell(..) => + if ra == rd { + self.reinstantiate_var(ra, threshold, &mut trail); } else { - self[threshold] = HeapCellValue::Addr(addr); - } - }, + self[threshold] = HeapCellValue::Addr(ra); + }, _ => { trail.push((Ref::HeapCell(a), self[a].clone())); self[a] = HeapCellValue::Addr(Addr::Lis(threshold)) @@ -109,7 +107,7 @@ pub(crate) trait CopierTarget: IndexMut self.push(hcv); scan += 1; - }, + }, Addr::AttrVar(_) | Addr::HeapCell(_) | Addr::StackCell(_, _) => { let ra = a; let rd = self.store(self.deref(ra.clone())); @@ -119,14 +117,22 @@ pub(crate) trait CopierTarget: IndexMut self[scan] = HeapCellValue::Addr(rd); scan += 1; }, - _ if ra == rd => { - self.reinstantiate_var(ra, scan, &mut trail); + Addr::AttrVar(h) if ra == rd => { + let threshold = self.threshold(); + + self.push(HeapCellValue::Addr(Addr::AttrVar(threshold))); - if let Addr::AttrVar(h) = rd { - let value = self[h + 1].clone(); - self.push(value); - } + let list_val = self[h+1].clone(); + self.push(list_val); + self[scan] = HeapCellValue::Addr(Addr::AttrVar(threshold)); + self[h] = HeapCellValue::Addr(Addr::AttrVar(threshold)); + + trail.push((Ref::AttrVar(h), + HeapCellValue::Addr(Addr::AttrVar(h)))); + }, + _ if ra == rd => { + self.reinstantiate_var(ra, scan, &mut trail); scan += 1; }, _ => self[scan] = HeapCellValue::Addr(rd) -- 2.54.0