From 50dd3afaa853df44c5fe3c0bc137c94b18462c64 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 4 Feb 2019 21:24:26 -0700 Subject: [PATCH] add support for copying attributed variables in copy_term --- src/prolog/copier.rs | 36 +++++++++++++++++------- src/prolog/machine/machine_state_impl.rs | 2 +- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/prolog/copier.rs b/src/prolog/copier.rs index f5497529..f075640b 100644 --- a/src/prolog/copier.rs +++ b/src/prolog/copier.rs @@ -30,16 +30,26 @@ pub(crate) trait CopierTarget: IndexMut fn reinstantiate_var(&mut self, ra: Addr, scan: usize, trail: &mut Trail) { - self[scan] = HeapCellValue::Addr(Addr::HeapCell(scan)); - - if let Addr::HeapCell(hc) = ra.clone() { - self[hc] = HeapCellValue::Addr(Addr::HeapCell(scan)); - trail.push((Ref::HeapCell(hc), - HeapCellValue::Addr(Addr::HeapCell(hc)))); - } else if let Addr::StackCell(fr, sc) = ra { - self.stack()[fr][sc] = Addr::HeapCell(scan); - trail.push((Ref::StackCell(fr, sc), - HeapCellValue::Addr(Addr::StackCell(fr, sc)))); + match ra { + Addr::HeapCell(hc) => { + self[scan] = HeapCellValue::Addr(Addr::HeapCell(scan)); + self[hc] = HeapCellValue::Addr(Addr::HeapCell(scan)); + trail.push((Ref::HeapCell(hc), + HeapCellValue::Addr(Addr::HeapCell(hc)))); + }, + Addr::StackCell(fr, sc) => { + self[scan] = HeapCellValue::Addr(Addr::HeapCell(scan)); + self.stack()[fr][sc] = Addr::HeapCell(scan); + trail.push((Ref::StackCell(fr, sc), + HeapCellValue::Addr(Addr::StackCell(fr, sc)))); + }, + Addr::AttrVar(hc) => { + self[scan] = HeapCellValue::Addr(Addr::AttrVar(scan)); + self[hc] = HeapCellValue::Addr(Addr::AttrVar(scan)); + trail.push((Ref::AttrVar(hc), + HeapCellValue::Addr(Addr::AttrVar(hc)))); + }, + _ => {} } } @@ -111,6 +121,12 @@ pub(crate) trait CopierTarget: IndexMut }, _ if ra == rd => { self.reinstantiate_var(ra, scan, &mut trail); + + if let Addr::AttrVar(h) = rd { + let value = self[h + 1].clone(); + self.push(value); + } + scan += 1; }, _ => self[scan] = HeapCellValue::Addr(rd) diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 00e6bf18..0743b062 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -1588,7 +1588,7 @@ impl MachineState { for (v1, v2) in iter { match (v1, v2) { (HeapCellValue::Addr(Addr::Lis(_)), HeapCellValue::Addr(Addr::Con(Constant::String(_)))) - | (HeapCellValue::Addr(Addr::Con(Constant::String(_))), HeapCellValue::Addr(Addr::Lis(_))) + | (HeapCellValue::Addr(Addr::Con(Constant::String(_))), HeapCellValue::Addr(Addr::Lis(_))) if self.flags.double_quotes.is_chars() => {}, (HeapCellValue::Addr(Addr::Con(Constant::EmptyList)), HeapCellValue::Addr(Addr::Con(Constant::String(ref s)))) -- 2.54.0