add comparisons between partial strings and string constants (#263)
This commit is contained in:
@@ -538,8 +538,8 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
attr_var_init_bindings_b,
|
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.b = machine_st.stack.index_or_frame(b).prelude.b;
|
||||||
|
machine_st.stack.truncate(b);
|
||||||
|
|
||||||
machine_st.hb = machine_st.heap.h();
|
machine_st.hb = machine_st.heap.h();
|
||||||
machine_st.p += offset;
|
machine_st.p += offset;
|
||||||
@@ -578,8 +578,8 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
attr_var_init_bindings_b,
|
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.b = machine_st.stack.index_or_frame(b).prelude.b;
|
||||||
|
machine_st.stack.truncate(b);
|
||||||
|
|
||||||
machine_st.hb = machine_st.heap.h();
|
machine_st.hb = machine_st.heap.h();
|
||||||
machine_st.p += 1;
|
machine_st.p += 1;
|
||||||
@@ -1032,7 +1032,7 @@ impl CWILCallPolicy {
|
|||||||
|
|
||||||
pub(crate) trait CutPolicy: Any {
|
pub(crate) trait CutPolicy: Any {
|
||||||
// returns true iff we fail or cut redirected the MachineState's p itself
|
// 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);
|
downcast!(dyn CutPolicy);
|
||||||
|
|||||||
@@ -2204,6 +2204,13 @@ impl MachineState {
|
|||||||
(HeapCellValue::Addr(Addr::PStrLocation(..)),
|
(HeapCellValue::Addr(Addr::PStrLocation(..)),
|
||||||
HeapCellValue::Addr(Addr::PStrLocation(..))) =>
|
HeapCellValue::Addr(Addr::PStrLocation(..))) =>
|
||||||
continue,
|
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(_))) =>
|
(HeapCellValue::Addr(Addr::Lis(_)), HeapCellValue::Addr(Addr::Lis(_))) =>
|
||||||
continue,
|
continue,
|
||||||
(HeapCellValue::Addr(Addr::Con(Constant::EmptyList)),
|
(HeapCellValue::Addr(Addr::Con(Constant::EmptyList)),
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ impl Index<usize> for AndFrame {
|
|||||||
|
|
||||||
impl IndexMut<usize> for AndFrame {
|
impl IndexMut<usize> for AndFrame {
|
||||||
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
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 prelude_offset = prelude_size::<AndFramePrelude>();
|
||||||
let index_offset = (index - 1) * mem::size_of::<Addr>();
|
let index_offset = (index - 1) * mem::size_of::<Addr>();
|
||||||
|
|
||||||
@@ -143,6 +145,8 @@ impl Index<usize> for OrFrame {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn index(&self, index: usize) -> &Self::Output {
|
fn index(&self, index: usize) -> &Self::Output {
|
||||||
|
debug_assert!(self.prelude.univ_prelude.is_or_frame == 1);
|
||||||
|
|
||||||
let prelude_offset = prelude_size::<OrFramePrelude>();
|
let prelude_offset = prelude_size::<OrFramePrelude>();
|
||||||
let index_offset = index * mem::size_of::<Addr>();
|
let index_offset = index * mem::size_of::<Addr>();
|
||||||
|
|
||||||
@@ -158,6 +162,8 @@ impl Index<usize> for OrFrame {
|
|||||||
impl IndexMut<usize> for OrFrame {
|
impl IndexMut<usize> for OrFrame {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
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 prelude_offset = prelude_size::<OrFramePrelude>();
|
||||||
let index_offset = index * mem::size_of::<Addr>();
|
let index_offset = index * mem::size_of::<Addr>();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user