fn package_term(wam: &mut Machine, term: Term) -> Result<TopLevelPacket, ParserError> {
let code_dir = wam.code_dir.clone();
- let indices = machine_code_indices!(&mut CodeDir::new(),
+ let indices = machine_code_indices!(wam.atom_tbl.clone(),
+ &mut CodeDir::new(),
&mut wam.op_dir,
&mut wam.modules);
},
TopLevelPacket::Decl(TopLevel::Declaration(decl), _) => {
let mut compiler = ListingCompiler::new();
- let mut indices = default_machine_code_indices!();
+ let mut indices = default_machine_code_indices!(wam.atom_tbl.clone());
try_eval_session!(compiler.process_decl(decl, wam, &mut indices));
try_eval_session!(compiler.add_code(wam, vec![], indices));
mut toplevel_indices: MachineCodeIndices<'a>)
-> EvalSession
{
- let mut worker = TopLevelBatchWorker::new(src, wam.atom_tbl(), wam.machine_flags(),
+ let mut worker = TopLevelBatchWorker::new(src, wam.atom_tbl.clone(),
+ wam.machine_flags(),
wam.code_dir.clone());
let mut compiler = ListingCompiler::new();
let mut toplevel_results = vec![];
}
pub fn compile_user_module<R: Read>(wam: &mut Machine, src: R) -> EvalSession {
- let mut indices = default_machine_code_indices!();
+ let atom_tbl = wam.atom_tbl.clone();
+ let mut indices = default_machine_code_indices!(atom_tbl.clone());
+
try_eval_session!(setup_indices(&wam, &mut indices));
- compile_listing(wam, src, indices, default_machine_code_indices!())
+
+ compile_listing(wam, src, indices, default_machine_code_indices!(atom_tbl))
}
}
pub trait SubModuleUser {
+ fn atom_tbl(&self) -> TabledData<Atom>;
fn op_dir(&mut self) -> &mut OpDir;
fn remove_code_index(&mut self, PredicateKey);
fn get_code_index(&self, PredicateKey, ClauseName) -> Option<CodeIndex>;
if let Some(code_data) = submodule.code_dir.get(&(name.clone(), arity)) {
let name = name.with_table(submodule.atom_tbl.clone());
+
+ let mut atom_tbl = self.atom_tbl();
+ atom_tbl.borrow_mut().insert(name.to_rc());
+
self.insert_dir_entry(name, arity, code_data.clone());
true
} else {
}
impl SubModuleUser for Module {
+ fn atom_tbl(&self) -> TabledData<Atom> {
+ self.atom_tbl.clone()
+ }
+
fn op_dir(&mut self) -> &mut OpDir {
&mut self.op_dir
}
use prolog_parser::ast::*;
use prolog_parser::string_list::*;
-use prolog_parser::tabled_rc::*;
use prolog::instructions::*;
use prolog::and_stack::*;
}
pub struct MachineState {
- pub(crate) atom_tbl: TabledData<Atom>,
pub(super) s: usize,
pub(super) p: CodePtr,
pub(super) b: usize,
return_from_clause!(machine_st.last_call, machine_st)
},
&BuiltInClauseType::Read => {
- match machine_st.read(stdin(), &indices.op_dir) {
+ match machine_st.read(stdin(), indices.atom_tbl.clone(), &indices.op_dir) {
Ok(offset) => {
let addr = machine_st[temp_v!(1)].clone();
machine_st.unify(addr, Addr::HeapCell(offset));
use prolog_parser::ast::*;
use prolog_parser::string_list::StringList;
-use prolog_parser::tabled_rc::TabledData;
use prolog::instructions::*;
use prolog::and_stack::*;
impl MachineState {
pub(super) fn new() -> Self {
- MachineState {
- atom_tbl: TabledData::new(Rc::new("user".to_string())),
+ MachineState {
s: 0,
p: CodePtr::default(),
b: 0,
static BUILTINS: &str = include_str!("../lib/builtins.pl");
pub struct MachineCodeIndices<'a> {
+ pub(super) atom_tbl: TabledData<Atom>,
pub(super) code_dir: &'a mut CodeDir,
pub(super) op_dir: &'a mut OpDir,
pub(super) modules: &'a mut ModuleDir
call_policy: Box<CallPolicy>,
cut_policy: Box<CutPolicy>,
code: Code,
+ pub(super) atom_tbl: TabledData<Atom>,
pub(super) code_dir: Rc<RefCell<CodeDir>>,
pub(super) op_dir: OpDir,
term_dir: TermDir,
}
impl<'a> SubModuleUser for MachineCodeIndices<'a> {
+ fn atom_tbl(&self) -> TabledData<Atom> {
+ self.atom_tbl.clone()
+ }
+
fn op_dir(&mut self) -> &mut OpDir {
self.op_dir
}
call_policy: Box::new(DefaultCallPolicy {}),
cut_policy: Box::new(DefaultCutPolicy {}),
code: Code::new(),
+ atom_tbl: TabledData::new(Rc::new("user".to_string())),
code_dir: Rc::new(RefCell::new(CodeDir::new())),
op_dir: default_op_dir(),
term_dir: TermDir::new(),
cached_query: None
};
+ let atom_tbl = wam.atom_tbl.clone();
+
compile_listing(&mut wam, BUILTINS.as_bytes(),
- default_machine_code_indices!(),
- default_machine_code_indices!());
+ default_machine_code_indices!(atom_tbl.clone()),
+ default_machine_code_indices!(atom_tbl));
compile_user_module(&mut wam, LISTS.as_bytes());
compile_user_module(&mut wam, CONTROL.as_bytes());
self.ms.fail
}
- #[inline]
- pub fn atom_tbl(&self) -> TabledData<Atom> {
- self.ms.atom_tbl.clone()
- }
-
pub fn add_batched_code(&mut self, code: Code, code_dir: CodeDir) -> Result<(), SessionError>
{
for (ref key, ref idx) in code_dir.iter() {
#[inline]
pub fn remove_module(&mut self, module: &Module) {
- let mut indices = machine_code_indices!(&mut self.code_dir.borrow_mut(),
+ let mut indices = machine_code_indices!(self.atom_tbl.clone(),
+ &mut self.code_dir.borrow_mut(),
&mut self.op_dir,
&mut self.modules);
indices.remove_module(clause_name!("user"), module);
None => return
};
+ let atom_tbl = self.atom_tbl.clone();
+
match instr {
Line::Arithmetic(ref arith_instr) =>
self.ms.execute_arith_instr(arith_instr),
Line::Cut(ref cut_instr) =>
self.ms.execute_cut_instr(cut_instr, &mut self.cut_policy),
Line::Control(ref control_instr) => {
- let indices = machine_code_indices!(&mut self.code_dir.borrow_mut(),
+ let indices = machine_code_indices!(atom_tbl,
+ &mut self.code_dir.borrow_mut(),
&mut self.op_dir,
&mut self.modules);
}
macro_rules! machine_code_indices {
- ($code_dir:expr, $op_dir:expr, $modules:expr) => (
- MachineCodeIndices { code_dir: $code_dir,
+ ($atom_tbl:expr, $code_dir:expr, $op_dir:expr, $modules:expr) => (
+ MachineCodeIndices { atom_tbl: $atom_tbl,
+ code_dir: $code_dir,
op_dir: $op_dir,
modules: $modules }
)
}
macro_rules! default_machine_code_indices {
- () => (
- machine_code_indices!(&mut CodeDir::new(),
+ ($atom_tbl:expr) => (
+ machine_code_indices!($atom_tbl,
+ &mut CodeDir::new(),
&mut default_op_dir(),
&mut HashMap::new())
)
use prolog_parser::ast::*;
use prolog_parser::parser::*;
+use prolog_parser::tabled_rc::TabledData;
use prolog::instructions::*;
use prolog::iterators::*;
Ok(Input::Batch)
},
_ => {
- let mut term_stream = TermStream::new(stdin.lock(), wam.atom_tbl(), wam.machine_flags());
+ let mut term_stream = TermStream::new(stdin.lock(), wam.atom_tbl.clone(),
+ wam.machine_flags());
term_stream.add_to_top(buffer.as_str());
Ok(Input::Term(term_stream.read_term(wam, &OpDir::new())?))
}
impl MachineState {
- pub fn read<R: Read>(&mut self, inner: R, op_dir: &OpDir) -> Result<usize, ParserError>
+ pub fn read<R: Read>(&mut self, inner: R, atom_tbl: TabledData<Atom>, op_dir: &OpDir)
+ -> Result<usize, ParserError>
{
- let mut parser = Parser::new(inner, self.atom_tbl.clone(), self.flags);
+ let mut parser = Parser::new(inner, atom_tbl, self.flags);
let term = parser.read_term(composite_op!(op_dir))?;
Ok(write_term_to_heap(&term, self))
{
use prolog_parser::parser::*;
- let mut parser = Parser::new(buf, wam.atom_tbl(), wam.machine_flags());
+ let mut parser = Parser::new(buf, wam.atom_tbl.clone(), wam.machine_flags());
parser.read_term(composite_op!(&wam.op_dir))
}