From ed9689368d4d2f7f1995a9440658b4d6a0883178 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 25 Apr 2018 17:11:46 -0600 Subject: [PATCH] properly support module imports from within modules. --- src/prolog/ast.rs | 4 ++-- src/prolog/io.rs | 10 +++++++++- src/prolog/macros.rs | 6 ++++++ src/prolog/toplevel.rs | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 3bbe7178..ade227a7 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -216,9 +216,9 @@ pub trait SubModuleUser { } } - fn use_qualified_module(&mut self, submodule: &Module, exports: Vec) -> EvalSession + fn use_qualified_module(&mut self, submodule: &Module, exports: &Vec) -> EvalSession { - for (name, arity) in exports { + for (name, arity) in exports.iter().cloned() { if !submodule.module_decl.exports.contains(&(name.clone(), arity)) { continue; } diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 8459f116..f134617a 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -643,7 +643,11 @@ pub fn compile_listing(wam: &mut Machine, src_str: &str) -> EvalSession TopLevelPacket::Decl(TopLevel::Declaration(Declaration::UseModule(name)), _) => { if let Some(ref submodule) = wam.get_module(name.clone()) { if let Some(ref mut module) = module { + let mut code_index = machine_code_index!(&mut code_dir, &mut op_dir); + module.use_module(submodule); + code_index.use_module(submodule); + continue; } } else { @@ -655,7 +659,11 @@ pub fn compile_listing(wam: &mut Machine, src_str: &str) -> EvalSession TopLevelPacket::Decl(TopLevel::Declaration(Declaration::UseQualifiedModule(name, exports)), _) => { if let Some(ref submodule) = wam.get_module(name.clone()) { if let Some(ref mut module) = module { - module.use_qualified_module(submodule, exports); + let mut code_index = machine_code_index!(&mut code_dir, &mut op_dir); + + module.use_qualified_module(submodule, &exports); + code_index.use_qualified_module(submodule, &exports); + continue; } } else { diff --git a/src/prolog/macros.rs b/src/prolog/macros.rs index 7abe2ce0..799f666d 100644 --- a/src/prolog/macros.rs +++ b/src/prolog/macros.rs @@ -783,3 +783,9 @@ macro_rules! set_code_index { idx.1 = $mod_name.clone(); }} } + +macro_rules! machine_code_index { + ($code_dir:expr, $op_dir:expr) => ( + MachineCodeIndex { code_dir: $code_dir, op_dir: $op_dir } + ) +} diff --git a/src/prolog/toplevel.rs b/src/prolog/toplevel.rs index f7c9ce3a..dad3e158 100644 --- a/src/prolog/toplevel.rs +++ b/src/prolog/toplevel.rs @@ -570,7 +570,7 @@ impl TopLevelWorker { pub fn parse_batch(&mut self, op_dir: &mut OpDir) -> Result, EvalError> { - let mut preds = vec![]; + let mut preds = vec![]; let mut mod_name = clause_name!("user"); let mut results = vec![]; let mut rel_worker = RelationWorker::new(); -- 2.54.0