Ok(())
}
-
- pub fn remove_unbound_vars(&self, orig_heap_locs: &HeapVarDict, heap_locs: &mut HeapVarDict) {
- for (var, addr) in orig_heap_locs.iter() {
- match self.machine_st.store(self.machine_st.deref(addr.clone())) {
- new_addr => if new_addr.is_ref() {
- heap_locs.remove(var);
- }
- }
- }
- }
-
+
pub fn add_batched_code(&mut self, code: Code, code_dir: CodeDir)
{
// error detection has finished, so update the master index of keys.
}
}
- pub fn heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
+ pub fn toplevel_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
+ where Outputter: HCValueOutputter
+ {
+ let mut sorted_vars: Vec<(&Rc<Var>, &Addr)> = var_dir.iter().collect();
+ sorted_vars.sort_by_key(|ref v| v.0);
+
+ for (var, addr) in sorted_vars {
+ let addr = self.machine_st.store(self.machine_st.deref(addr.clone()));
+
+ if addr.is_ref() {
+ continue;
+ }
+
+ output = self.machine_st.print_var_eq(var.clone(), addr, var_dir, output);
+ }
+
+ output
+ }
+
+ #[cfg(test)]
+ pub fn test_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
where Outputter: HCValueOutputter
{
let mut sorted_vars: Vec<(&Rc<Var>, &Addr)> = var_dir.iter().collect();
pub fn print(wam: &mut Machine, result: EvalSession) {
match result {
- EvalSession::InitialQuerySuccess(alloc_locs, mut heap_locs) => {
- let orig_heap_locs = heap_locs.clone();
-
+ EvalSession::InitialQuerySuccess(alloc_locs, mut heap_locs) =>
loop {
- wam.remove_unbound_vars(&orig_heap_locs, &mut heap_locs);
-
if wam.or_stack_is_empty() {
if heap_locs.is_empty() {
- let attr_goals = wam.attribute_goals(&orig_heap_locs);
+ let attr_goals = wam.attribute_goals(&heap_locs);
if !attr_goals.is_empty() {
println!("{}.", attr_goals);
return;
}
- } else if heap_locs.is_empty() && orig_heap_locs.is_empty() {
+ } else if heap_locs.is_empty() {
print!("true");
stdout().flush().unwrap();
}
let mut raw_stdout = stdout().into_raw_mode().unwrap();
- if !heap_locs.is_empty() {
+ let bindings = if !heap_locs.is_empty() {
let mut output = PrinterOutputter::new();
- let bindings = wam.heap_view(&heap_locs, output).result();
-
- write!(raw_stdout, "{}", bindings).unwrap();
- raw_stdout.flush().unwrap();
- }
+ wam.toplevel_heap_view(&heap_locs, output).result()
+ } else {
+ "".to_string()
+ };
- let attr_goals = wam.attribute_goals(&orig_heap_locs);
+ let attr_goals = wam.attribute_goals(&heap_locs);
if !attr_goals.is_empty() {
- if heap_locs.is_empty() {
+ if bindings.is_empty() {
write!(raw_stdout, "{}", attr_goals).unwrap();
} else {
- write!(raw_stdout, ", {}", attr_goals).unwrap();
+ write!(raw_stdout, "{}, {}", bindings, attr_goals).unwrap();
}
+ } else {
+ write!(raw_stdout, "{}", bindings).unwrap();
}
if !wam.or_stack_is_empty() {
return;
}
} else {
- if heap_locs.is_empty() && attr_goals.is_empty() {
+ if bindings.is_empty() && attr_goals.is_empty() {
write!(raw_stdout, "true.\r\n").unwrap();
} else {
write!(raw_stdout, ".\r\n").unwrap();
break;
}
- }
- },
+ },
EvalSession::Error(e) => println!("{}", e),
_ => {}
};
{
let mut output = TestOutputter::new();
- output = wam.heap_view(&heap_locs, output);
+ output = wam.test_heap_view(&heap_locs, output);
output.cache();
while let EvalSession::SubsequentQuerySuccess = wam.continue_query(&alloc_locs, &mut heap_locs)
{
- output = wam.heap_view(&heap_locs, output);
+ output = wam.test_heap_view(&heap_locs, output);
output.cache();
}
{
let mut output = TestOutputter::new();
- output = wam.heap_view(&heap_locs, output);
+ output = wam.test_heap_view(&heap_locs, output);
output.cache();
let mut count = 1;
while let EvalSession::SubsequentQuerySuccess = wam.continue_query(&alloc_locs, &mut heap_locs)
{
- output = wam.heap_view(&heap_locs, output);
+ output = wam.test_heap_view(&heap_locs, output);
output.cache();
count += 1;