]> Repositorios git - scryer-prolog.git/commitdiff
add qualified imports use_module library modules
authorMark Thom <[email protected]>
Fri, 19 Feb 2021 00:58:05 +0000 (17:58 -0700)
committerMark Thom <[email protected]>
Fri, 19 Feb 2021 00:58:16 +0000 (17:58 -0700)
src/clause_types.rs
src/loader.pl
src/machine/load_state.rs
src/machine/loader.rs

index dc619a91828cb047c46a9aebbd5662c1f825f46e..382dd6ae533d4c32c65c9b08d3c762ada31942c2 100644 (file)
@@ -760,7 +760,7 @@ impl SystemClauseType {
             ("$conclude_load", 1) => Some(SystemClauseType::REPL(REPLCodePtr::ConcludeLoad)),
             ("$use_module", 3) => Some(SystemClauseType::REPL(REPLCodePtr::UseModule)),
             ("$declare_module", 3) => Some(SystemClauseType::REPL(REPLCodePtr::DeclareModule)),
-            ("$load_compiled_library", 2) => {
+            ("$load_compiled_library", 3) => {
                 Some(SystemClauseType::REPL(REPLCodePtr::LoadCompiledLibrary))
             }
             ("$push_load_state_payload", 1) => {
index 95e0a052883ba894c4e5dacbdce7ecf0a865b5e1..09ea6dc9c1260b9194973493c81882244bc8724c 100644 (file)
@@ -428,7 +428,7 @@ use_module(Module, Exports, Evacuable) :-
        instantiation_error(load/1)
     ;  Module = library(Library) ->
        (  path_atom(Library, LibraryPath) ->
-          (  '$load_compiled_library'(LibraryPath, Evacuable) -> %% TODO: What about Exports?
+          (  '$load_compiled_library'(LibraryPath, Exports, Evacuable) ->
              true
           ;  '$load_library_as_stream'(LibraryPath, Stream, Path),
              file_load(Stream, Path, Subevacuable),
index 0a2fca5a08a749173ad198b6d37d796bba078ae9..d652724b0793530baca6096816318a3ff6bc5976 100644 (file)
@@ -235,6 +235,7 @@ fn import_qualified_module_exports(
     exports: &IndexSet<ModuleExport>,
     code_dir: &mut CodeDir,
     op_dir: &mut OpDir,
+    meta_predicates: &mut MetaPredicateDir,
 ) -> Result<(), SessionError> {
     for export in imported_module.module_decl.exports.iter() {
         if !exports.contains(export) {
@@ -245,6 +246,10 @@ fn import_qualified_module_exports(
             ModuleExport::PredicateKey((ref name, arity)) => {
                 let key = (name.clone(), *arity);
 
+                if let Some(meta_specs) = imported_module.meta_predicates.get(&key) {
+                    meta_predicates.insert(key.clone(), meta_specs.clone());
+                }
+
                 if let Some(src_code_index) = imported_module.code_dir.get(&key) {
                     let target_code_index = code_dir
                         .entry(key.clone())
@@ -281,6 +286,7 @@ fn import_qualified_module_exports_into_module(
     exports: &IndexSet<ModuleExport>,
     code_dir: &mut CodeDir,
     op_dir: &mut OpDir,
+    meta_predicates: &mut MetaPredicateDir,
     wam_op_dir: &mut OpDir,
     module_op_exports: &mut ModuleOpExports,
 ) -> Result<(), SessionError> {
@@ -293,6 +299,10 @@ fn import_qualified_module_exports_into_module(
             ModuleExport::PredicateKey((ref name, arity)) => {
                 let key = (name.clone(), *arity);
 
+                if let Some(meta_specs) = imported_module.meta_predicates.get(&key) {
+                    meta_predicates.insert(key.clone(), meta_specs.clone());
+                }
+
                 if let Some(src_code_index) = imported_module.code_dir.get(&key) {
                     let target_code_index = code_dir
                         .entry(key.clone())
@@ -1006,7 +1016,7 @@ impl<'a> LoadState<'a> {
         }
     }
 
-    fn import_qualified_module(
+    pub(super) fn import_qualified_module(
         &mut self,
         module_name: ClauseName,
         exports: IndexSet<ModuleExport>,
@@ -1021,6 +1031,7 @@ impl<'a> LoadState<'a> {
                         &exports,
                         &mut self.wam.indices.code_dir,
                         &mut self.wam.indices.op_dir,
+                        &mut self.wam.indices.meta_predicates,
                     )?;
                 }
                 CompilationTarget::Module(ref defining_module_name) => {
@@ -1033,6 +1044,7 @@ impl<'a> LoadState<'a> {
                                 &exports,
                                 &mut target_module.code_dir,
                                 &mut target_module.op_dir,
+                                &mut target_module.meta_predicates,
                                 &mut self.wam.indices.op_dir,
                                 &mut self.module_op_exports,
                             )?;
index 38797ba8d71b143ba9856d4c069dc011d6008aec..d4b5e6621521c6dd005f30efb30308e66440028b 100644 (file)
@@ -1247,10 +1247,17 @@ impl Machine {
                 return;
             }
 
-            let (mut loader, evacuable_h) = self.loader_from_heap_evacuable(temp_v!(2));
+            let (mut loader, evacuable_h) = self.loader_from_heap_evacuable(temp_v!(3));
 
             let import_module = || {
-                loader.load_state.import_module(library)?;
+                let export_list = loader.extract_module_export_list_from_heap(temp_v!(2))?;
+
+                if export_list.is_empty() {
+                    loader.load_state.import_module(library)?;
+                } else {
+                    loader.load_state.import_qualified_module(library, export_list)?;
+                }
+
                 LiveTermStream::evacuate(loader)
             };