]> Repositorios git - scryer-prolog.git/commitdiff
clear ball before setting it (#246)
authorMark Thom <[email protected]>
Sun, 1 Dec 2019 10:04:01 +0000 (03:04 -0700)
committerMark Thom <[email protected]>
Sun, 1 Dec 2019 10:04:01 +0000 (03:04 -0700)
src/prolog/machine/and_stack.rs
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/toplevel.pl

index 002e6f68a6a3169fce8df760c377d2ff6f8defad..8a01a604a593cd8894de07914e7a6730f538cbe4 100644 (file)
@@ -42,18 +42,26 @@ impl AndStack {
         AndStack(mem::replace(&mut self.0, vec![]))
     }
 
+    #[inline]    
     pub fn push(&mut self, global_index: usize, e: usize, cp: LocalCodePtr, n: usize) {
         let len = self.0.len();
         self.0.push(Frame::new(global_index, len, e, cp, n));
     }
 
+    #[inline]
     pub fn len(&self) -> usize {
         self.0.len()
     }
 
+    #[inline]
     pub fn clear(&mut self) {
         self.0.clear()
     }
+    
+    #[inline]
+    pub fn top(&self) -> Option<&Frame> {
+        self.0.last()
+    }
 
     /* 
 
index fd506f3ccb03c93798666654f2649ba1db9e443d..deb79e0049588f49737aca9c5a82cf916cca3e62 100644 (file)
@@ -62,7 +62,7 @@ impl Ball {
             });
         }
 
-        stub        
+        stub
     }
 }
 
@@ -486,7 +486,6 @@ pub(crate) trait CallPolicy: Any {
         machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
 
         machine_st.pstr_trail.truncate(machine_st.pstr_tr);
-
         machine_st.heap.truncate(machine_st.or_stack[b].h);
 
         let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
@@ -532,7 +531,6 @@ pub(crate) trait CallPolicy: Any {
         machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
 
         machine_st.pstr_trail.truncate(machine_st.pstr_tr);
-
         machine_st.heap.truncate(machine_st.or_stack[b].h);
 
         let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
@@ -578,8 +576,8 @@ pub(crate) trait CallPolicy: Any {
         let curr_pstr_tr = machine_st.pstr_tr;
 
         machine_st.unwind_pstr_trail(old_pstr_tr, curr_pstr_tr);
-        machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
 
+        machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
         machine_st.pstr_trail.truncate(machine_st.pstr_tr);
 
         machine_st.heap.truncate(machine_st.or_stack[b].h);
@@ -591,7 +589,7 @@ pub(crate) trait CallPolicy: Any {
             attr_var_init_queue_b,
             attr_var_init_bindings_b,
         );
-        
+
         machine_st.b = machine_st.or_stack[b].b;
         machine_st.or_stack.truncate(machine_st.b);
 
index df22f68518fbae62d2c034606222a6cb5ea599d3..c98a80ed6750d5de2a24dd5c250003f264a5340f 100644 (file)
@@ -125,16 +125,14 @@ impl MachineState {
 
     pub(super) fn next_global_index(&self) -> usize {
         max(
-            if self.and_stack.len() > 0 {
-                self.and_stack[self.e].global_index
-            } else {
-                0
-            },
-            if self.b > 0 {
-                self.or_stack[self.b - 1].global_index
-            } else {
-                0
-            },
+            self.or_stack
+                .top()
+                .map(|or_fr| or_fr.global_index)
+                .unwrap_or(0),
+            self.and_stack
+                .top()
+                .map(|or_fr| or_fr.global_index)
+                .unwrap_or(0),
         ) + 1
     }
 
@@ -1074,18 +1072,18 @@ impl MachineState {
             (Number::Float(f), _) | (_, Number::Float(f)) => {
                 let n = Addr::Con(Constant::Float(f));
                 let stub = MachineError::functor_stub(clause_name!("gcd"), 2);
-                
+
                 Err(self.error_form(MachineError::type_error(ValidType::Integer, n), stub))
             }
             (Number::Rational(r), _) | (_, Number::Rational(r)) => {
                 let n = Addr::Con(Constant::Rational(r));
                 let stub = MachineError::functor_stub(clause_name!("gcd"), 2);
-                
+
                 Err(self.error_form(MachineError::type_error(ValidType::Integer, n), stub))
             }
         }
     }
-    
+
     fn float_pow(&self, n1: Number, n2: Number) -> Result<Number, MachineStub> {
         let f1 = result_f(&n1, rnd_f);
         let f2 = result_f(&n2, rnd_f);
@@ -2039,8 +2037,11 @@ impl MachineState {
     }
 
     pub(super) fn set_ball(&mut self) {
+        self.ball.reset();
+
         let addr = self[temp_v!(1)].clone();
         self.ball.boundary = self.heap.h;
+
         copy_term(
             CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut self.ball.stub),
             addr,
@@ -3127,14 +3128,14 @@ impl MachineState {
 
     pub(super) fn allocate(&mut self, num_cells: usize) {
         let gi = self.next_global_index();
-//        let new_e = self.e + 1;
+//      let new_e = self.e + 1;
 
         self.p += 1;
 
 /*
-        /* See issue #244 for an example of a program broken (at the 
-           top level) by the inclusion of this code. A proper GC must determine if an 
-           existing AND frame is safe to resize; the check here is not 
+        /* See issue #244 for an example of a program broken (at the
+           top level) by the inclusion of this code. A proper GC must determine if an
+           existing AND frame is safe to resize; the check here is not
            enough.
         */
 
@@ -3185,7 +3186,7 @@ impl MachineState {
             }
         }
     }
-
+    
     fn handle_call_clause(
         &mut self,
         indices: &mut IndexStore,
index 4700806a3170699fe6c39708ea1a0db3df6bf0af..6b3f771125af72bdb6472c19b8b629dfdd3a3bfd 100644 (file)
@@ -42,8 +42,7 @@
     (  expand_goals(Term0, Term) -> true
     ;  Term = Term0
     ),
-    (  '$get_b_value'(B), call(Term),
-       '$write_eqs_and_read_input'(B, VarList),
+    (  '$get_b_value'(B), call(Term), '$write_eqs_and_read_input'(B, VarList),
        !
     ;  write('false.'), nl
     ).