From: Mark Thom Date: Mon, 30 Jul 2018 00:38:26 +0000 (-0600) Subject: realize full cheney in copier.rs X-Git-Tag: v0.8.110~439 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1ce527d1791f47dc06e4b3f07e7f71a4918c8340;p=scryer-prolog.git realize full cheney in copier.rs --- diff --git a/src/prolog/copier.rs b/src/prolog/copier.rs index b16ba5ad..0595678d 100644 --- a/src/prolog/copier.rs +++ b/src/prolog/copier.rs @@ -1,13 +1,12 @@ use prolog::and_stack::*; use prolog::ast::*; -use std::collections::HashMap; use std::ops::IndexMut; type Trail = Vec<(Ref, HeapCellValue)>; pub(crate) struct RedirectInfo { - trail: Trail + trail: Trail } pub(crate) trait CopierTarget @@ -40,11 +39,6 @@ pub(crate) trait CopierTarget let mut scan = self.source(); let old_h = self.threshold(); - // Lists have a compressed representation as structures, - // removing the need for NamedStr, so we use a redirection - // table for copying lists. - let mut list_redirect = HashMap::new(); - self.push(HeapCellValue::Addr(addr)); while scan < self.threshold() { @@ -54,15 +48,16 @@ pub(crate) trait CopierTarget HeapCellValue::Addr(a) => match a.clone() { Addr::Lis(a) => { - if let Some(idx) = list_redirect.get(&a) { - self[scan] = HeapCellValue::Addr(Addr::Lis(*idx)); - scan += 1; - continue; + if let HeapCellValue::Addr(Addr::Lis(b)) = self[a].clone() { + if b >= old_h { + self[scan] = HeapCellValue::Addr(Addr::Lis(b)); + scan += 1; + continue; + } } - list_redirect.insert(a, self.threshold()); - - self[scan] = HeapCellValue::Addr(Addr::Lis(self.threshold())); + let threshold = self.threshold(); + self[scan] = HeapCellValue::Addr(Addr::Lis(threshold)); let hcv = self[a].clone(); self.push(hcv); @@ -70,6 +65,9 @@ pub(crate) trait CopierTarget let hcv = self[a+1].clone(); self.push(hcv); + trail.push((Ref::HeapCell(a), self[a].clone())); + self[a] = HeapCellValue::Addr(Addr::Lis(threshold)); + scan += 1; }, Addr::HeapCell(_) | Addr::StackCell(_, _) => {