From: Mark Thom Date: Tue, 5 Feb 2019 04:24:26 +0000 (-0700) Subject: add support for copying attributed variables in copy_term X-Git-Tag: v0.8.110~275 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=50dd3afaa853df44c5fe3c0bc137c94b18462c64;p=scryer-prolog.git add support for copying attributed variables in copy_term --- 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))))