fix conformity testing #274
This commit is contained in:
@@ -140,7 +140,7 @@ impl MachineState {
|
||||
self.p = CodePtr::Local(LocalCodePtr::DirEntry(p));
|
||||
}
|
||||
|
||||
fn print_attribute_goals_string(&mut self, var_dict: &HeapVarDict) -> String
|
||||
fn print_attribute_goals_string(&mut self, op_dir: &OpDir, var_dict: &HeapVarDict) -> String
|
||||
{
|
||||
let mut attr_goals = mem::replace(&mut self.attr_var_init.attribute_goals, vec![]);
|
||||
|
||||
@@ -154,7 +154,7 @@ impl MachineState {
|
||||
let mut output = PrinterOutputter::new();
|
||||
|
||||
for goal_addr in attr_goals {
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, output, var_dict);
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, op_dir, output, var_dict);
|
||||
printer.see_all_locs();
|
||||
|
||||
printer.numbervars = false;
|
||||
@@ -188,6 +188,6 @@ impl Machine {
|
||||
self.machine_st.query_stepper(&mut self.indices, &mut self.policies, &mut self.code_repo,
|
||||
&mut readline::input_stream());
|
||||
|
||||
self.machine_st.print_attribute_goals_string(var_dict)
|
||||
self.machine_st.print_attribute_goals_string(&self.indices.op_dir, var_dict)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ impl Machine {
|
||||
output.append(format!(":- dynamic({}/{}). ", name.as_str(), arity).as_str());
|
||||
|
||||
for addr in addrs {
|
||||
let mut printer = HCPrinter::new(&self.machine_st, output);
|
||||
let mut printer = HCPrinter::new(&self.machine_st, &self.indices.op_dir, output);
|
||||
printer.quoted = true;
|
||||
|
||||
output = printer.print(addr);
|
||||
|
||||
@@ -40,7 +40,7 @@ impl Ball {
|
||||
pub(super) fn take(&mut self) -> Ball {
|
||||
let boundary = self.boundary;
|
||||
self.boundary = 0;
|
||||
|
||||
|
||||
Ball {
|
||||
boundary,
|
||||
stub: mem::replace(&mut self.stub, vec![])
|
||||
@@ -238,7 +238,7 @@ pub struct MachineState {
|
||||
pub(crate) flags: MachineFlags
|
||||
}
|
||||
|
||||
impl MachineState {
|
||||
impl MachineState {
|
||||
fn call_at_index(&mut self, arity: usize, p: usize)
|
||||
{
|
||||
self.cp.assign_if_local(self.p.clone() + 1);
|
||||
@@ -548,12 +548,18 @@ pub(crate) trait CallPolicy: Any {
|
||||
let a3 = machine_st[temp_v!(3)].clone();
|
||||
|
||||
let c = match machine_st.compare_term_test(&a2, &a3) {
|
||||
Ordering::Greater => Addr::Con(Constant::Atom(clause_name!(">"),
|
||||
Some(SharedOpDesc::new(700, XFX)))),
|
||||
Ordering::Equal => Addr::Con(Constant::Atom(clause_name!("="),
|
||||
Some(SharedOpDesc::new(700, XFX)))),
|
||||
Ordering::Less => Addr::Con(Constant::Atom(clause_name!("<"),
|
||||
Some(SharedOpDesc::new(700, XFX))))
|
||||
Ordering::Greater => {
|
||||
let spec = fetch_atom_op_spec(clause_name!(">"), None, &indices.op_dir);
|
||||
Addr::Con(Constant::Atom(clause_name!(">"), spec))
|
||||
},
|
||||
Ordering::Equal => {
|
||||
let spec = fetch_atom_op_spec(clause_name!("="), None, &indices.op_dir);
|
||||
Addr::Con(Constant::Atom(clause_name!("="), spec))
|
||||
},
|
||||
Ordering::Less => {
|
||||
let spec = fetch_atom_op_spec(clause_name!("<"), None, &indices.op_dir);
|
||||
Addr::Con(Constant::Atom(clause_name!("<"), spec))
|
||||
}
|
||||
};
|
||||
|
||||
machine_st.unify(a1, c);
|
||||
@@ -584,7 +590,7 @@ pub(crate) trait CallPolicy: Any {
|
||||
},
|
||||
&BuiltInClauseType::Read => {
|
||||
readline::toggle_prompt(false);
|
||||
|
||||
|
||||
match machine_st.read(parsing_stream, indices.atom_tbl.clone(), &indices.op_dir) {
|
||||
Ok(offset) => {
|
||||
let addr = machine_st[temp_v!(1)].clone();
|
||||
|
||||
@@ -186,7 +186,7 @@ impl MachineState {
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn print_var_eq<Outputter>(&self, var: Rc<Var>, addr: Addr, var_dict: &HeapVarDict,
|
||||
fn print_var_eq<Outputter>(&self, var: Rc<Var>, addr: Addr, op_dir: &OpDir, var_dict: &HeapVarDict,
|
||||
mut output: Outputter)
|
||||
-> Outputter
|
||||
where Outputter: HCValueOutputter
|
||||
@@ -198,13 +198,13 @@ impl MachineState {
|
||||
output.append(var.as_str());
|
||||
output.append(" = ");
|
||||
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, output, var_dict);
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, op_dir, output, var_dict);
|
||||
|
||||
printer.numbervars = false;
|
||||
printer.quoted = true;
|
||||
|
||||
let mut output = printer.print(addr);
|
||||
|
||||
|
||||
let bad_ending = format!("= {}", &var);
|
||||
|
||||
if output.ends_with(&bad_ending) {
|
||||
@@ -2038,13 +2038,14 @@ impl MachineState {
|
||||
self.try_functor_unify_components(a1, Addr::Con(integer!(0))),
|
||||
Addr::Str(o) =>
|
||||
match self.heap[o].clone() {
|
||||
HeapCellValue::NamedStr(arity, name, spec) =>
|
||||
self.try_functor_compound_case(name, arity, spec),
|
||||
HeapCellValue::NamedStr(arity, name, spec) => {
|
||||
let spec = fetch_op_spec(name.clone(), arity, spec, op_dir);
|
||||
self.try_functor_compound_case(name, arity, spec)
|
||||
},
|
||||
_ => self.fail = true
|
||||
},
|
||||
Addr::Lis(_) => {
|
||||
let shared_op_desc = op_dir.get(&(clause_name!("."), Fixity::In))
|
||||
.map(|val| val.0.clone());
|
||||
let shared_op_desc = fetch_op_spec(clause_name!("."), 2, None, op_dir);
|
||||
self.try_functor_compound_case(clause_name!("."), 2, shared_op_desc)
|
||||
},
|
||||
Addr::AttrVar(..) | Addr::HeapCell(_) | Addr::StackCell(..) => {
|
||||
@@ -2079,6 +2080,8 @@ impl MachineState {
|
||||
Addr::Con(_) if arity == 0 =>
|
||||
self.unify(a1, name),
|
||||
Addr::Con(Constant::Atom(name, spec)) => {
|
||||
let spec = fetch_atom_op_spec(name.clone(), spec, op_dir);
|
||||
|
||||
let f_a = if name.as_str() == "." && arity == 2 {
|
||||
Addr::Lis(self.heap.h)
|
||||
} else {
|
||||
|
||||
@@ -413,7 +413,8 @@ impl Machine {
|
||||
};
|
||||
}
|
||||
|
||||
let term_output = self.machine_st.print_query(term, &var_dict);
|
||||
let term_output = self.machine_st.print_query(term, &self.indices.op_dir,
|
||||
&var_dict);
|
||||
term_output.result()
|
||||
},
|
||||
Err(err_stub) => {
|
||||
@@ -627,21 +628,24 @@ impl Machine {
|
||||
|
||||
for (var, addr) in sorted_vars {
|
||||
let addr = self.machine_st.store(self.machine_st.deref(addr.clone()));
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr, var_dir, output);
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr, &self.indices.op_dir, var_dir,
|
||||
output);
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub fn test_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
|
||||
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();
|
||||
sorted_vars.sort_by_key(|ref v| v.0);
|
||||
|
||||
for (var, addr) in sorted_vars {
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output);
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), &self.indices.op_dir,
|
||||
var_dir, output);
|
||||
}
|
||||
|
||||
output
|
||||
@@ -654,10 +658,10 @@ impl Machine {
|
||||
|
||||
|
||||
impl MachineState {
|
||||
fn print_query(&self, addr: Addr, var_dict: &HeapVarDict) -> PrinterOutputter
|
||||
fn print_query(&self, addr: Addr, op_dir: &OpDir, var_dict: &HeapVarDict) -> PrinterOutputter
|
||||
{
|
||||
let output = PrinterOutputter::new();
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, output, var_dict);
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, op_dir, output, var_dict);
|
||||
|
||||
printer.quoted = true;
|
||||
printer.numbervars = false;
|
||||
|
||||
@@ -3,6 +3,7 @@ use prolog_parser::parser::{get_desc, get_clause_spec};
|
||||
use prolog_parser::tabled_rc::*;
|
||||
|
||||
use prolog::clause_types::*;
|
||||
use prolog::forms::*;
|
||||
use prolog::heap_print::*;
|
||||
use prolog::machine::copier::*;
|
||||
use prolog::machine::machine_errors::*;
|
||||
@@ -908,7 +909,7 @@ impl MachineState {
|
||||
_ => unreachable!()
|
||||
};
|
||||
|
||||
let module = op.owning_module();
|
||||
let module = op.owning_module();
|
||||
|
||||
let result = to_op_decl(priority, specifier.as_str(), op)
|
||||
.map_err(SessionError::from)
|
||||
@@ -1167,9 +1168,11 @@ impl MachineState {
|
||||
},
|
||||
_ => unreachable!()
|
||||
},
|
||||
Addr::Con(Constant::Atom(name, op_spec)) => {
|
||||
Addr::Con(Constant::Atom(name, spec)) => {
|
||||
let module = name.owning_module();
|
||||
indices.predicate_exists(name, module, 0, op_spec)
|
||||
let spec = fetch_atom_op_spec(name.clone(), spec, &indices.op_dir);
|
||||
|
||||
indices.predicate_exists(name, module, 0, spec)
|
||||
},
|
||||
head => {
|
||||
let err = MachineError::type_error(ValidType::Callable, head);
|
||||
@@ -1423,9 +1426,9 @@ impl MachineState {
|
||||
let var_atom = Constant::Atom(var_atom, None);
|
||||
|
||||
let h = self.heap.h;
|
||||
let op_desc = Some(SharedOpDesc::new(700, XFX));
|
||||
let spec = fetch_atom_op_spec(clause_name!("="), None, &indices.op_dir);
|
||||
|
||||
self.heap.push(HeapCellValue::NamedStr(2, clause_name!("="), op_desc));
|
||||
self.heap.push(HeapCellValue::NamedStr(2, clause_name!("="), spec));
|
||||
self.heap.push(HeapCellValue::Addr(Addr::Con(var_atom)));
|
||||
self.heap.push(HeapCellValue::Addr(binding));
|
||||
|
||||
@@ -1503,7 +1506,7 @@ impl MachineState {
|
||||
let numbervars = self.store(self.deref(self[temp_v!(3)].clone()));
|
||||
let quoted = self.store(self.deref(self[temp_v!(4)].clone()));
|
||||
|
||||
let mut printer = HCPrinter::new(&self, PrinterOutputter::new());
|
||||
let mut printer = HCPrinter::new(&self, &indices.op_dir, PrinterOutputter::new());
|
||||
|
||||
if let &Addr::Con(Constant::Atom(ref name, ..)) = &ignore_ops {
|
||||
printer.ignore_ops = name.as_str() == "true";
|
||||
|
||||
@@ -289,10 +289,10 @@ impl<'a, R: Read> TermStream<'a, R> {
|
||||
|
||||
impl MachineState {
|
||||
pub(super)
|
||||
fn print_with_locs(&self, addr: Addr, var_dict: &HeapVarDict) -> PrinterOutputter
|
||||
fn print_with_locs(&self, addr: Addr, op_dir: &OpDir, var_dict: &HeapVarDict) -> PrinterOutputter
|
||||
{
|
||||
let output = PrinterOutputter::new();
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, output, var_dict);
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, op_dir, output, var_dict);
|
||||
let mut max_var_length = 0;
|
||||
|
||||
for var in var_dict.keys() {
|
||||
@@ -338,7 +338,7 @@ impl MachineState {
|
||||
None
|
||||
} else {
|
||||
let &TermWriteResult { heap_loc: _, ref var_dict } = &term_write_result;
|
||||
let output = self.print_with_locs(Addr::HeapCell(h), var_dict);
|
||||
let output = self.print_with_locs(Addr::HeapCell(h), &indices.op_dir, var_dict);
|
||||
|
||||
self.reset();
|
||||
Some(output.result())
|
||||
|
||||
Reference in New Issue
Block a user