]> Repositorios git - scryer-prolog.git/commitdiff
properly support module imports from within modules.
authorMark Thom <[email protected]>
Wed, 25 Apr 2018 23:11:46 +0000 (17:11 -0600)
committerMark Thom <[email protected]>
Wed, 25 Apr 2018 23:11:46 +0000 (17:11 -0600)
src/prolog/ast.rs
src/prolog/io.rs
src/prolog/macros.rs
src/prolog/toplevel.rs

index 3bbe7178839a0217336e533b209474b652cbea7b..ade227a743b6a925a657b5e5465fb5be87e7ee45 100644 (file)
@@ -216,9 +216,9 @@ pub trait SubModuleUser {
         }
     }
 
-    fn use_qualified_module(&mut self, submodule: &Module, exports: Vec<PredicateKey>) -> EvalSession
+    fn use_qualified_module(&mut self, submodule: &Module, exports: &Vec<PredicateKey>) -> EvalSession
     {
-        for (name, arity) in exports {
+        for (name, arity) in exports.iter().cloned() {
             if !submodule.module_decl.exports.contains(&(name.clone(), arity)) {
                 continue;
             }
index 8459f1162788734d08ef6cdd4a3d79969881edf3..f134617a9679f95f6402e4260415f58ced2f8742 100644 (file)
@@ -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 {
index 7abe2ce0c8b083a599bf77bdd8b565dbc86984f8..799f666d6314299c2bb8ff843f4d141987404efb 100644 (file)
@@ -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 }
+    )
+}
index f7c9ce3a53e8ece497dff3c013acf21eda2b7153..dad3e1586b11d4a1aafdffd693c8466e50156514 100644 (file)
@@ -570,7 +570,7 @@ impl<R: Read> TopLevelWorker<R> {
 
     pub fn parse_batch(&mut self, op_dir: &mut OpDir) -> Result<Vec<TopLevelPacket>, 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();