mthom's revised run_query with manually created printer and some cleanup

This commit is contained in:
Nicolas Luck
2023-09-14 22:00:50 +02:00
parent 5fa68e253c
commit 6bdd7f3a3f

View File

@@ -1,8 +1,10 @@
use std::collections::BTreeSet; use std::collections::BTreeSet;
use std::sync::Arc;
use crate::atom_table; use crate::atom_table;
use crate::heap_print::{HCPrinter, HCValueOutputter, PrinterOutputter};
use crate::machine::BREAK_FROM_DISPATCH_LOOP_LOC; use crate::machine::BREAK_FROM_DISPATCH_LOOP_LOC;
use crate::machine::mock_wam::{CompositeOpDir, Term}; use crate::machine::mock_wam::{CompositeOpDir, Term, Fixnum};
use crate::parser::parser::{Parser, Tokens}; use crate::parser::parser::{Parser, Tokens};
use crate::read::write_term_to_heap; use crate::read::write_term_to_heap;
@@ -65,9 +67,6 @@ impl Machine {
} }
pub fn run_query(&mut self, query: String) -> QueryResult { pub fn run_query(&mut self, query: String) -> QueryResult {
//let input = format!("{}", query);
//println!("Running query: {}", input);
// Parse the query so we can analyze and then call the term // Parse the query so we can analyze and then call the term
let mut parser = Parser::new( let mut parser = Parser::new(
Stream::from_owned_string(query, &mut self.machine_st.arena), Stream::from_owned_string(query, &mut self.machine_st.arena),
@@ -79,33 +78,39 @@ impl Machine {
// Write parsed term to heap // Write parsed term to heap
let term_write_result = write_term_to_heap(&term, &mut self.machine_st.heap, &mut self.machine_st.atom_tbl).expect("couldn't write term to heap"); let term_write_result = write_term_to_heap(&term, &mut self.machine_st.heap, &mut self.machine_st.atom_tbl).expect("couldn't write term to heap");
// Set up registers // Write term to heap
self.machine_st.registers[1] = self.machine_st.heap[term_write_result.heap_loc]; self.machine_st.registers[1] = self.machine_st.heap[term_write_result.heap_loc];
// Call the term
self.machine_st.cp = BREAK_FROM_DISPATCH_LOOP_LOC; self.machine_st.cp = BREAK_FROM_DISPATCH_LOOP_LOC;
self.machine_st.p = self.indices.code_dir.get(&(atom!("$call"), 1)).expect("couldn't get code index").local().unwrap(); self.machine_st.p = self.indices.code_dir.get(&(atom!("call"), 1)).expect("couldn't get code index").local().unwrap();
// If we don't set this register, we get an error in write_term.
// It seems to be the register that holds max_depth
self.machine_st.registers[7] = 50.into();
// Not setting this will cause:
// thread 'machine::lib_machine::tests::programatic_query' panicked at 'index out of bounds: the len is 10 but the index is 295', src/machine/machine_state_impl.rs:1479:56
self.machine_st.registers[6] = 9.into();
println!("running dispatch loop");
self.dispatch_loop(); self.dispatch_loop();
println!("done");
let op_dir = &self.indices.op_dir;
let write_term_result = self.machine_st.write_term(op_dir); // NOTE: mimic writeq settings here (see arguments of '$write_term'/8 at builtins.pl:693)
println!("write_term_result: {:?}", write_term_result); self.machine_st.registers[8] = atom_as_cell!(atom!("false"));
// => Err([HeapCellValue { tag: Atom, name: "error", arity: 2, m: false, f: false }, HeapCellValue { tag: Str, value: 13, m: false, f: false }, HeapCellValue { tag: Str, value: 16, m: false, f: false }, HeapCellValue { tag: Atom, name: "type_error", arity: 2, m: false, f: false }, HeapCellValue { tag: Atom, name: "list", arity: 0, m: false, f: false }, HeapCellValue { tag: Cons, ptr: 9, m: false, f: false }, HeapCellValue { tag: Atom, name: "/", arity: 2, m: false, f: false }, HeapCellValue { tag: Atom, name: "write_term", arity: 0, m: false, f: false }, HeapCellValue { tag: Fixnum, value: 2, m: false, f: false }]) self.machine_st.registers[7] = fixnum_as_cell!(Fixnum::build_with(10));
let printer = write_term_result self.machine_st.registers[6] = empty_list_as_cell!();
.expect("Couldn't get printer from write_term") self.machine_st.registers[5] = atom_as_cell!(atom!("true"));
.expect("Couldn't get printer from write_term"); self.machine_st.registers[4] = atom_as_cell!(atom!("true"));
self.machine_st.registers[3] = atom_as_cell!(atom!("false"));
let term_to_be_printed = self.machine_st.store(self.machine_st.deref(self.machine_st.registers[2]));
let mut printer = HCPrinter::new(
&mut self.machine_st.heap,
Arc::clone(&self.machine_st.atom_tbl),
&mut self.machine_st.stack,
&self.indices.op_dir,
PrinterOutputter::new(),
term_to_be_printed,
);
println!("Varnames: {:?}", printer.var_names); println!("Varnames: {:?}", printer.var_names);
println!("Printer: {:?}", printer); printer.max_depth = 1000;
let output = printer.print();
println!("Print: {:?}", output);
println!("Result: {:?}", output.result());
Err("not implementend".to_string()) Err("not implementend".to_string())
} }