From 1ce527d1791f47dc06e4b3f07e7f71a4918c8340 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 29 Jul 2018 18:38:26 -0600 Subject: [PATCH] realize full cheney in copier.rs --- src/prolog/copier.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) 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(_, _) => { -- 2.54.0