]> Repositorios git - scryer-prolog.git/commitdiff
provisional #3
authorMark Thom <[email protected]>
Thu, 13 Sep 2018 06:06:54 +0000 (00:06 -0600)
committerMark Thom <[email protected]>
Thu, 13 Sep 2018 06:06:54 +0000 (00:06 -0600)
src/prolog/compile.rs
src/prolog/machine/mod.rs

index 30f4b39dcb17201328531494c1daa2787ccd7b1e..f0332607f551b219ca7e7d48a7c56e2612483621 100644 (file)
@@ -9,6 +9,7 @@ use prolog::toplevel::*;
 use std::collections::{HashMap, HashSet, VecDeque};
 use std::io::Read;
 use std::mem;
+use std::ops::DerefMut;
 
 #[allow(dead_code)]
 fn print_code(code: &Code) {
@@ -97,7 +98,9 @@ fn compile_query(terms: Vec<QueryTerm>, queue: Vec<TopLevel>, flags: MachineFlag
 }
 
 fn package_term(wam: &mut Machine, term: Term) -> Result<TopLevelPacket, ParserError> {
-    let indices = machine_code_indices!(&mut wam.code_dir, &mut wam.op_dir, &mut wam.modules);
+    let mut code_dir = wam.code_dir.borrow_mut();
+    let indices = machine_code_indices!(code_dir.deref_mut(), &mut wam.op_dir, &mut wam.modules);
+    
     parse_term(term, indices)
 }
 
index 8f96705ef10ba439e445ed9d89e429a8e5e7ca71..6d1c226e422b54ae315d9e25493b675ff68d38ac 100644 (file)
@@ -13,6 +13,7 @@ mod system_calls;
 
 use prolog::machine::machine_state::*;
 
+use std::cell::RefCell;
 use std::collections::HashMap;
 use std::mem::swap;
 use std::ops::Index;
@@ -70,7 +71,7 @@ pub struct Machine {
     call_policy: Box<CallPolicy>,
     cut_policy: Box<CutPolicy>,
     code: Code,
-    pub(super) code_dir: CodeDir,
+    pub(super) code_dir: Rc<RefCell<CodeDir>>,
     pub(super) op_dir: OpDir,
     // term_dir: TermDir,
     pub(super) modules: ModuleDir,
@@ -143,7 +144,7 @@ impl Machine {
             call_policy: Box::new(DefaultCallPolicy {}),
             cut_policy: Box::new(DefaultCutPolicy {}),
             code: Code::new(),
-            code_dir: CodeDir::new(),
+            code_dir: Rc::new(RefCell::new(CodeDir::new())),
             op_dir: default_op_dir(),
             // term_dir: TermDir::new(),
             modules: HashMap::new(),
@@ -192,7 +193,7 @@ impl Machine {
                 continue;
             }
 
-            if let Some(ref existing_idx) = self.code_dir.get(&key) {
+            if let Some(ref existing_idx) = self.code_dir.borrow().get(&key) {
                 // ensure we don't try to overwrite an existing predicate from a different module.
                 if !existing_idx.is_undefined() {
                     if existing_idx.module_name() != idx.module_name() {
@@ -205,7 +206,7 @@ impl Machine {
         }
 
         self.code.extend(code.into_iter());
-        Ok(self.code_dir.extend(code_dir.into_iter()))
+        Ok(self.code_dir.borrow_mut().extend(code_dir.into_iter()))
     }
 
     #[inline]
@@ -215,7 +216,8 @@ impl Machine {
 
     #[inline]
     pub fn remove_module(&mut self, module: &Module) {
-        let mut indices = machine_code_indices!(&mut self.code_dir, &mut self.op_dir, &mut self.modules);
+        let mut indices = machine_code_indices!(&mut self.code_dir.borrow_mut(), &mut self.op_dir,
+                                                &mut self.modules);
         indices.remove_module(clause_name!("user"), module);
     }
 
@@ -278,10 +280,10 @@ impl Machine {
             Line::Cut(ref cut_instr) =>
                 self.ms.execute_cut_instr(cut_instr, &mut self.cut_policy),
             Line::Control(ref control_instr) => {
-                let indices = machine_code_indices!(&mut self.code_dir, &mut self.op_dir,
+                let indices = machine_code_indices!(&mut self.code_dir.borrow_mut(),
+                                                    &mut self.op_dir,
                                                     &mut self.modules);
-//                let code_dirs = CodeDirs::new(&self.code_dir, &self.op_dir,
-//                                              &self.modules);
+
                 self.ms.execute_ctrl_instr(indices, &mut self.call_policy,
                                            &mut self.cut_policy, control_instr)
             },