]> Repositorios git - scryer-prolog.git/commitdiff
fix 'drain lower bound was too large', store user-level expansions to modules (#416)
authorMark Thom <[email protected]>
Thu, 30 Apr 2020 06:01:00 +0000 (00:01 -0600)
committerMark Thom <[email protected]>
Thu, 30 Apr 2020 06:01:00 +0000 (00:01 -0600)
src/prolog/codegen.rs
src/prolog/lib/builtins.pl
src/prolog/machine/compile.rs
src/prolog/machine/dynamic_database.rs
src/prolog/machine/modules.rs
src/prolog/machine/toplevel.rs

index ffe9490d5a1a7e66907ffbf194276c82f3ad00a3..7e0bdd8604bdaf6303e435c46e84f479e1570995 100644 (file)
@@ -343,7 +343,9 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
                 &mut ControlInstruction::CallClause(_, _, _, ref mut last_call, _) => {
                     *last_call = true
                 }
-                &mut ControlInstruction::JmpBy(_, _, _, ref mut last_call) => *last_call = true,
+                &mut ControlInstruction::JmpBy(_, _, _, ref mut last_call) => {
+                    *last_call = true
+                }
                 &mut ControlInstruction::Proceed => {}
                 _ => dealloc_index += 1,
             },
index 7a1a706198a95bde267f9ebda820b1b77de41bb3..381c61318c51ed02bedf798af6a4feae64b22c0f 100644 (file)
@@ -569,18 +569,19 @@ setof(Template, Goal, Solution) :-
 
 clause(H, B) :-
     (  var(H) -> throw(error(instantiation_error, clause/2))
-    ;  functor(H, Name, Arity) -> (  Name == '.' -> throw(error(type_error(callable, H), clause/2))
-                                 ;  Name == (:), Arity =:= 2 ->
-                                    arg(1, H, Module),
-                                    arg(2, H, F),
-                                    '$module_clause'(F, B, Module)
-                                 %% '$no_such_predicate' fails if H is not callable.
-                                 ;  '$no_such_predicate'(H) -> '$fail'
-                                 ;  '$head_is_dynamic'(H) -> '$clause_body_is_valid'(B),
-                                                             '$get_clause'(H, B)
-                                 ;  throw(error(permission_error(access, private_procedure, Name/Arity),
-                                                clause/2))
-                                 )
+    ;  functor(H, Name, Arity) ->
+       (  Name == '.' -> throw(error(type_error(callable, H), clause/2))
+          ;  Name == (:), Arity =:= 2 ->
+                 arg(1, H, Module),
+                 arg(2, H, F),
+                 '$module_clause'(F, B, Module)
+          %% '$no_such_predicate' fails if H is not callable.
+          ;  '$no_such_predicate'(H) -> '$fail'
+          ;  '$head_is_dynamic'(H) -> '$clause_body_is_valid'(B),
+                                                              '$get_clause'(H, B)
+          ;  throw(error(permission_error(access, private_procedure, Name/Arity),
+                                         clause/2))
+          )
     ;  throw(error(type_error(callable, H), clause/2))
     ).
 
index 10bc46e936d4c8313e254939fdc2e6da20637a57..92d71d976cdb243b04920b52385cf43894de1194 100644 (file)
@@ -188,6 +188,8 @@ fn set_first_index(code: &mut Code) {
                 if *offset == 0 =>
             {
                 *offset = code_len - idx;
+                debug_assert!(*offset > 0);
+
                 break;
             }
             _ => {}
@@ -634,7 +636,7 @@ impl ListingCompiler {
                 .term_dir_entry_len((clause_name!("term_expansion"), 2)),
             orig_goal_expansion_lens: code_repo
                 .term_dir_entry_len((clause_name!("goal_expansion"), 2)),
-           initialization_goals: (vec![], VecDeque::from(vec![])),
+               initialization_goals: (vec![], VecDeque::from(vec![])),
             suppress_warnings,
             listing_src
         }
@@ -880,36 +882,25 @@ impl ListingCompiler {
 
         let (mut len, mut queue_len) = ((preds.0).0.len(), preds.1.len());
 
-        if self.module.is_some() && hook.has_module_scope() {
-            let module_preds = self
-                .user_term_dir
-                .entry(key.clone())
-                .or_insert((Predicate::new(), VecDeque::from(vec![])));
+        let module_preds = self
+            .user_term_dir
+            .entry(key.clone())
+            .or_insert((Predicate::new(), VecDeque::from(vec![])));
 
-            if let Some(ref mut module) = &mut self.module {
-                module.add_expansion_record(hook, clause.clone(), queue.clone());
-                module.add_local_expansion(hook, clause.clone(), queue.clone());
-            }
+        if let Some(ref mut module) = &mut self.module {
+            module.add_expansion_record(hook, clause.clone(), queue.clone());
+            module.add_local_expansion(hook, clause.clone(), queue.clone());
+        }
 
-            (module_preds.0).0.push(clause);
-            module_preds.1.extend(queue.into_iter());
+        (module_preds.0).0.push(clause);
+        module_preds.1.extend(queue.into_iter());
 
-            (preds.0).0.extend((module_preds.0).0.iter().cloned());
-            preds.1.extend(module_preds.1.iter().cloned());
-        } else {
-            let module_preds = self
-                .user_term_dir
-                .entry(key.clone())
-                .or_insert((Predicate::new(), VecDeque::from(vec![])));
+        (preds.0).0.extend((module_preds.0).0.iter().cloned());
+        preds.1.extend(module_preds.1.iter().cloned());
 
+        if !(self.module.is_some() && hook.has_module_scope()) {
             len += 1;
             queue_len += queue_len;
-
-            (preds.0).0.push(clause);
-            preds.1.extend(queue.into_iter());
-
-            (preds.0).0.extend((module_preds.0).0.iter().cloned());
-            preds.1.extend(module_preds.1.iter().cloned());
         }
 
         (len, queue_len)
@@ -980,12 +971,12 @@ impl ListingCompiler {
                     Err(SessionError::from(ParserError::InvalidModuleDecl))
                 }
             }
-           Declaration::ModuleInitialization(query_terms, queue) => {
-               self.initialization_goals.0.extend(query_terms.into_iter());
-               self.initialization_goals.1.extend(queue.into_iter());
+               Declaration::ModuleInitialization(query_terms, queue) => {
+                       self.initialization_goals.0.extend(query_terms.into_iter());
+                       self.initialization_goals.1.extend(queue.into_iter());
 
-               Ok(())
-           }
+                       Ok(())
+               }
             Declaration::MultiFile(..) => {
                 Ok(())
             }
index 7fd0a8c1450337adad20a63ef164354040a6b19b..c90a085a66075dc5056c10fd6174f38dad8268f6 100644 (file)
@@ -307,6 +307,12 @@ impl Machine {
                     }
                 }
             }
+            Addr::Usize(n) => {
+                n
+            }
+            Addr::Fixnum(n) => {
+                usize::try_from(n).unwrap()
+            }
             _ => {
                 unreachable!()
             }
index 4c54d39b4b7bf09e36f763542cf0376c5d3decb4..472723a4c36b02731ffa986f56d8b3a5143dbee3 100644 (file)
@@ -48,6 +48,7 @@ impl Module {
             (te.0)
                 .0
                 .extend((self.user_term_expansions.0).0.iter().cloned());
+
             te.1.extend(self.user_term_expansions.1.iter().cloned());
         }
 
@@ -60,6 +61,7 @@ impl Module {
             (ge.0)
                 .0
                 .extend((self.user_goal_expansions.0).0.iter().cloned());
+
             ge.1.extend(self.user_goal_expansions.1.iter().cloned());
         }
 
index c8004acad4fb609a4971cf6f4357219f361219a8..ccc7d452399a3ca1810829a2105ba6fed2c14c57 100644 (file)
@@ -872,6 +872,7 @@ impl RelationWorker {
                     let term = Term::Clause(Cell::default(), clause_name!(";"), terms, None);
                     let (stub, clauses) = self.fabricate_disjunct(term);
 
+                    debug_assert!(clauses.len() > 0);
                     self.queue.push_back(clauses);
                     Ok(QueryTerm::Jump(stub))
                 }