]> Repositorios git - scryer-prolog.git/commitdiff
add access to HeapVarDict to the printer.
authorMark Thom <[email protected]>
Sat, 5 May 2018 02:51:02 +0000 (20:51 -0600)
committerMark Thom <[email protected]>
Sat, 5 May 2018 02:51:02 +0000 (20:51 -0600)
src/prolog/heap_iter.rs
src/prolog/heap_print.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/mod.rs

index 33b552aa250b8c69053419fd747c2fcc25756d64..8532e55adeb37e1848333e54c3067c490767bc5e 100644 (file)
@@ -184,6 +184,14 @@ pub struct HCDerefAcyclicIterator<HCIter> {
     seen: HashSet<Addr>
 }
 
+pub type HCDerefAcyclicPreOrderIterator<'a> = HCDerefAcyclicIterator<HCPreOrderIterator<'a>>;
+
+impl<'a> HCPreOrderIterator<'a> {
+    pub fn deref_acyclic_iter(self) -> HCDerefAcyclicPreOrderIterator<'a> {
+        HCDerefAcyclicIterator::new(self)
+    }
+}
+
 impl<HCIter: MutStackHCIterator> HCDerefAcyclicIterator<HCIter>
 {
     pub fn new(iter: HCIter) -> Self {
index cb8d7bd6a98564becb8fbf375bdd12adbb049898..3923f72bd79ba275f790f70d80f62603cd923b22 100644 (file)
@@ -1,5 +1,6 @@
 use prolog::ast::*;
 use prolog::heap_iter::*;
+use prolog::machine::machine_state::MachineState;
 
 use std::borrow::Cow;
 use std::cell::Cell;
@@ -143,7 +144,7 @@ impl HCValueFormatter for TermFormatter {
 pub struct HCPrinter<'a, Formatter, Outputter> {
     formatter:   Formatter,
     outputter:   Outputter,
-    iter:        HCPreOrderIterator<'a>,
+    iter:        HCDerefAcyclicPreOrderIterator<'a>,
     state_stack: Vec<TokenOrRedirect>,
     heap_locs:   Cow<'a, HeapVarDict>
 }
@@ -151,22 +152,26 @@ pub struct HCPrinter<'a, Formatter, Outputter> {
 impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter>
     HCPrinter<'a, Formatter, Outputter>
 {
-    pub fn new(iter: HCPreOrderIterator<'a>, fmt: Formatter, output: Outputter) -> Self
+    pub fn new(machine_st: &'a MachineState, addr: Addr, fmt: Formatter, output: Outputter) -> Self
     {
+        let iter = HCPreOrderIterator::new(&machine_st, addr);
+        
         HCPrinter { formatter: fmt,
                     outputter: output,
-                    iter,
+                    iter: iter.deref_acyclic_iter(),
                     state_stack: vec![],
                     heap_locs: Cow::default() }
     }
 
-    pub fn from_heap_locs(iter: HCPreOrderIterator<'a>, fmt: Formatter,
+    pub fn from_heap_locs(machine_st: &'a MachineState, addr: Addr, fmt: Formatter,
                           output: Outputter, heap_locs: &'a HeapVarDict)
                           -> Self
     {
+        let iter = HCPreOrderIterator::new(&machine_st, addr);
+        
         HCPrinter { formatter: fmt,
                     outputter: output,
-                    iter,
+                    iter: iter.deref_acyclic_iter(),
                     state_stack: vec![],
                     heap_locs: Cow::Borrowed(heap_locs) }
     }
index e425d2b0e9fe5cc36e70dc8c6f773dd04d059234..d0cf402e05751bbf2ee94bc66e8897bbd56ab5d9 100644 (file)
@@ -93,12 +93,34 @@ impl MachineState {
         self.trail(r1);
     }
 
-    pub(super) fn print_term<Fmt, Outputter>(&self, a: Addr, fmt: Fmt, output: Outputter) -> Outputter
-      where Fmt: HCValueFormatter, Outputter: HCValueOutputter
+    pub(super)
+    fn print_var_eq<Fmt, Outputter>(&self, var: Rc<Var>, addr: Addr, var_dir: &HeapVarDict,
+                                    fmt: Fmt, mut output: Outputter)
+                                    -> Outputter
+        where Fmt: HCValueFormatter, Outputter: HCValueOutputter
     {
-        let iter    = HCPreOrderIterator::new(&self, a);
-        let printer = HCPrinter::new(iter, fmt, output);
+        let orig_len = output.len();
+        
+        output.begin_new_var();
+
+        output.append(var.as_str());
+        output.append(" = ");
+        
+        let printer    = HCPrinter::from_heap_locs(&self, addr, fmt, output, var_dir);
+        let mut output = printer.print();
+
+        if output.ends_with(var.as_str()) {
+            output.truncate(orig_len);
+        }
 
+        output
+    }
+    
+    pub(super)
+    fn print_term<Fmt, Outputter>(&self, addr: Addr, fmt: Fmt, output: Outputter) -> Outputter
+      where Fmt: HCValueFormatter, Outputter: HCValueOutputter
+    {
+        let printer = HCPrinter::new(&self, addr, fmt, output);
         printer.print()
     }
 
index fa19f6e572d8d8433b4be9b9ba3ad6ebe668c065..b8294658a4299e0d61b137d13f158506dd8753b5 100644 (file)
@@ -4,7 +4,7 @@ use prolog::heap_print::*;
 use prolog::tabled_rc::*;
 
 mod machine_errors;
-pub(crate) mod machine_state;
+pub(super) mod machine_state;
 #[macro_use]
 mod machine_state_impl;
 
@@ -427,12 +427,8 @@ impl Machine {
        where Outputter: HCValueOutputter
     {
         for (var, addr) in var_dir {
-            output.begin_new_var();
-
-            output.append(var.as_str());
-            output.append(" = ");
-
-            output = self.ms.print_term(addr.clone(), TermFormatter {}, output);
+            let fmt = TermFormatter {};
+            output = self.ms.print_var_eq(var.clone(), addr.clone(), var_dir, fmt, output);
         }
 
         output