]> Repositorios git - scryer-prolog.git/commitdiff
add comparisons between partial strings and string constants (#263)
authorMark Thom <[email protected]>
Sat, 22 Feb 2020 07:51:27 +0000 (00:51 -0700)
committerMark Thom <[email protected]>
Sat, 22 Feb 2020 07:51:27 +0000 (00:51 -0700)
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/stack.rs

index 3a994e9e3e2a04ddbff046840837847eb384737a..3cca936324b87ff4e5ad90bfd646bda356483968 100644 (file)
@@ -538,8 +538,8 @@ pub(crate) trait CallPolicy: Any {
             attr_var_init_bindings_b,
         );
 
-        machine_st.stack.truncate(machine_st.b);
         machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
+        machine_st.stack.truncate(b);
 
         machine_st.hb = machine_st.heap.h();
         machine_st.p += offset;
@@ -578,8 +578,8 @@ pub(crate) trait CallPolicy: Any {
             attr_var_init_bindings_b,
         );
 
-        machine_st.stack.truncate(machine_st.b);
         machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
+        machine_st.stack.truncate(b);
 
         machine_st.hb = machine_st.heap.h();
         machine_st.p += 1;
@@ -1032,7 +1032,7 @@ impl CWILCallPolicy {
 
 pub(crate) trait CutPolicy: Any {
     // returns true iff we fail or cut redirected the MachineState's p itself
-    fn cut(&mut self, _: &mut MachineState, _: RegType) -> bool;
+    fn cut(&mut self, machine_st: &mut MachineState, r: RegType) -> bool;
 }
 
 downcast!(dyn CutPolicy);
index 998f325250402cfceb90dec2ab41404c3a0774e2..c6db779b6c906df5faad95fb8794350445bddb0d 100644 (file)
@@ -2204,6 +2204,13 @@ impl MachineState {
                 (HeapCellValue::Addr(Addr::PStrLocation(..)),
                  HeapCellValue::Addr(Addr::PStrLocation(..))) =>
                     continue,
+                (HeapCellValue::Addr(Addr::PStrLocation(..)),
+                 HeapCellValue::Addr(Addr::Con(Constant::String(..))))
+              | (HeapCellValue::Addr(Addr::Con(Constant::String(..))),
+                 HeapCellValue::Addr(Addr::PStrLocation(..))) 
+                    if self.flags.double_quotes.is_chars() => {
+                        continue;
+                    }
                 (HeapCellValue::Addr(Addr::Lis(_)), HeapCellValue::Addr(Addr::Lis(_))) =>
                     continue,
                 (HeapCellValue::Addr(Addr::Con(Constant::EmptyList)),
index 9984dfe138ba31cfc439b6ba10ecf9e1add46edf..6e0731d51b4c48867756771c87846dbf46fa0c7e 100644 (file)
@@ -89,6 +89,8 @@ impl Index<usize> for AndFrame {
 
 impl IndexMut<usize> for AndFrame {
     fn index_mut(&mut self, index: usize) -> &mut Self::Output {
+        debug_assert!(self.prelude.univ_prelude.is_or_frame == 0);
+
         let prelude_offset = prelude_size::<AndFramePrelude>();
         let index_offset = (index - 1) * mem::size_of::<Addr>();
 
@@ -143,6 +145,8 @@ impl Index<usize> for OrFrame {
 
     #[inline]
     fn index(&self, index: usize) -> &Self::Output {
+        debug_assert!(self.prelude.univ_prelude.is_or_frame == 1);
+
         let prelude_offset = prelude_size::<OrFramePrelude>();
         let index_offset = index * mem::size_of::<Addr>();
 
@@ -158,6 +162,8 @@ impl Index<usize> for OrFrame {
 impl IndexMut<usize> for OrFrame {
     #[inline]
     fn index_mut(&mut self, index: usize) -> &mut Self::Output {
+        debug_assert!(self.prelude.univ_prelude.is_or_frame == 1);
+
         let prelude_offset = prelude_size::<OrFramePrelude>();
         let index_offset = index * mem::size_of::<Addr>();