]> Repositorios git - scryer-prolog.git/commitdiff
remove Option wrapper from cached_query
authorMark Thom <[email protected]>
Tue, 11 Dec 2018 04:21:15 +0000 (21:21 -0700)
committerMark Thom <[email protected]>
Tue, 11 Dec 2018 04:21:15 +0000 (21:21 -0700)
src/prolog/compile.rs
src/prolog/lib/builtins.pl
src/prolog/machine/mod.rs
src/prolog/machine/term_expansion.rs

index 021488af4067cea4b3a24de3035995d7f5defc4b..ffba84e987145afebef362c2a9697e8f3f10814c 100644 (file)
@@ -40,7 +40,8 @@ fn print_code(code: &Code) {
 }
 
 // throw errors if declaration or query found.
-fn compile_relation(tl: &TopLevel, non_counted_bt: bool, flags: MachineFlags) -> Result<Code, ParserError>
+fn compile_relation(tl: &TopLevel, non_counted_bt: bool, flags: MachineFlags)
+                    -> Result<Code, ParserError>
 {
     let mut cg = CodeGenerator::<DebrayAllocator>::new(non_counted_bt, flags);
 
@@ -307,7 +308,6 @@ impl ListingCompiler {
         let wam_indices = &mut wam.indices;
 
         let atom_tbl   = wam_indices.atom_tbl.clone();
-
         let mut worker = TopLevelBatchWorker::new(src, atom_tbl.clone(), flags,
                                                   wam_indices, &mut wam.policies,
                                                   &mut wam.code_repo);
index e6cfa3fba89dcc91c578159c64186c9dda474ae7..c7409209d035167809c9e39944be00c3bd66b975 100644 (file)
 :- op(700, xfx, >=).
 :- op(700, xfx, =<).
 
+% conditional operators.
+:- op(1050, xfy, ->).
+:- op(1100, xfy, ;).
+
 % control.
 :- op(700, xfx, =).
 :- op(900, fy, \+).
 :- op(700, xfx, =..).
 
-% conditional operators.
-:- op(1050, xfy, ->).
-:- op(1100, xfy, ;).
-
 % term comparison.
 :- op(700, xfx, ==).
 :- op(700, xfx, \==).
index 8676d9108e3bbdd8e65b8b70562f61193837736b..5dae9ff724089ff68d667288dd92576d96de3e6f 100644 (file)
@@ -101,7 +101,7 @@ impl IndexStore {
 }
 
 pub struct CodeRepo {
-    cached_query: Option<Code>,
+    cached_query: Code,
     pub(super) goal_expanders: Code,
     pub(super) term_expanders: Code,
     pub(super) code: Code,
@@ -112,7 +112,7 @@ impl CodeRepo {
     #[inline]
     fn new() -> Self {
         CodeRepo {
-            cached_query: None,
+            cached_query: vec![],
             goal_expanders: Code::new(),
             term_expanders: Code::new(),
             code: Code::new(),
@@ -122,10 +122,7 @@ impl CodeRepo {
 
     #[inline]
     fn size_of_cached_query(&self) -> usize {
-        match &self.cached_query {
-            &Some(ref query) => query.len(),
-            _ => 0
-        }
+        self.cached_query.len()
     }    
     
     fn lookup_instr<'a>(&'a self, last_call: bool, p: &CodePtr) -> Option<RefOrOwned<'a, Line>>
@@ -144,9 +141,10 @@ impl CodeRepo {
                     None
                 },
             &CodePtr::Local(LocalCodePtr::TopLevel(_, p)) =>
-                match &self.cached_query {
-                    &Some(ref cq) => Some(RefOrOwned::Borrowed(&cq[p])),
-                    &None => None
+                if p < self.cached_query.len() {
+                    Some(RefOrOwned::Borrowed(&self.cached_query[p]))
+                } else {
+                    None
                 },
             &CodePtr::Local(LocalCodePtr::DirEntry(p)) =>
                 Some(RefOrOwned::Borrowed(&self.code[p])),
@@ -191,12 +189,7 @@ impl Index<LocalCodePtr> for CodeRepo {
 
     fn index(&self, ptr: LocalCodePtr) -> &Self::Output {
         match ptr {
-            LocalCodePtr::TopLevel(_, p) => {
-                match &self.cached_query {
-                    &Some(ref cq) => &cq[p],
-                    &None => panic!("Out-of-bounds top level index.")
-                }
-            },
+            LocalCodePtr::TopLevel(_, p) => &self.cached_query[p],
             LocalCodePtr::DirEntry(p) => &self.code[p],
             LocalCodePtr::UserGoalExpansion(p) => &self.goal_expanders[p],
             LocalCodePtr::UserTermExpansion(p) => &self.term_expanders[p]
@@ -370,7 +363,7 @@ impl Machine {
     {
         let mut heap_locs = HashMap::new();
 
-        self.code_repo.cached_query = Some(code);
+        self.code_repo.cached_query = code;
         self.machine_st.run_query(&mut self.indices, &mut self.policies, &self.code_repo, &alloc_locs, &mut heap_locs);
 
         if self.machine_st.fail {
index 49152cfed074404fe338228bccade310c3633202..478c052f0202a87f0311e491b1b8cdee3793ff3b 100644 (file)
@@ -230,7 +230,7 @@ impl MachineState {
 
         let code = vec![call_clause!(ClauseType::Hook(hook), 2, 0, true)];
 
-        code_repo.cached_query = Some(code);
+        code_repo.cached_query = code;
         self.run_query(indices, policies, code_repo, &AllocVarDict::new(), &mut HeapVarDict::new());
 
         if self.fail {