compare TypedArenaPtr<T> by value not pointer (#1362)
This commit is contained in:
14
src/arena.rs
14
src/arena.rs
@@ -72,9 +72,15 @@ impl ArenaHeader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialOrd, Ord)]
|
#[derive(Debug)]
|
||||||
pub struct TypedArenaPtr<T: ?Sized>(ptr::NonNull<T>);
|
pub struct TypedArenaPtr<T: ?Sized>(ptr::NonNull<T>);
|
||||||
|
|
||||||
|
impl<T: ?Sized + PartialOrd> PartialOrd for TypedArenaPtr<T> {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
(**self).partial_cmp(&**other)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: ?Sized + PartialEq> PartialEq for TypedArenaPtr<T> {
|
impl<T: ?Sized + PartialEq> PartialEq for TypedArenaPtr<T> {
|
||||||
fn eq(&self, other: &TypedArenaPtr<T>) -> bool {
|
fn eq(&self, other: &TypedArenaPtr<T>) -> bool {
|
||||||
self.0 == other.0 || &**self == &**other
|
self.0 == other.0 || &**self == &**other
|
||||||
@@ -83,6 +89,12 @@ impl<T: ?Sized + PartialEq> PartialEq for TypedArenaPtr<T> {
|
|||||||
|
|
||||||
impl<T: ?Sized + PartialEq> Eq for TypedArenaPtr<T> {}
|
impl<T: ?Sized + PartialEq> Eq for TypedArenaPtr<T> {}
|
||||||
|
|
||||||
|
impl<T: ?Sized + Ord> Ord for TypedArenaPtr<T> {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
(**self).cmp(&**other)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: ?Sized + Hash> Hash for TypedArenaPtr<T> {
|
impl<T: ?Sized + Hash> Hash for TypedArenaPtr<T> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn hash<H: Hasher>(&self, hasher: &mut H) {
|
fn hash<H: Hasher>(&self, hasher: &mut H) {
|
||||||
|
|||||||
@@ -147,8 +147,9 @@ impl MachineState {
|
|||||||
h as u64,
|
h as u64,
|
||||||
));
|
));
|
||||||
|
|
||||||
self.trail.push(TrailEntry::from_bytes(
|
self.trail.push(TrailEntry::build_with(
|
||||||
list_loc_as_cell!(l).into_bytes()
|
TrailEntryTag::TrailedAttachedValue,
|
||||||
|
l as u64,
|
||||||
));
|
));
|
||||||
|
|
||||||
self.tr += 2;
|
self.tr += 2;
|
||||||
@@ -2379,15 +2380,14 @@ impl MachineState {
|
|||||||
value: HeapCellValue,
|
value: HeapCellValue,
|
||||||
stub_gen: impl Fn() -> FunctorStub,
|
stub_gen: impl Fn() -> FunctorStub,
|
||||||
) -> Result<Vec<HeapCellValue>, MachineStub> {
|
) -> Result<Vec<HeapCellValue>, MachineStub> {
|
||||||
let deref_v = self.deref(value);
|
let value = self.store(self.deref(value));
|
||||||
let store_v = self.store(deref_v);
|
|
||||||
|
|
||||||
read_heap_cell!(store_v,
|
read_heap_cell!(value,
|
||||||
(HeapCellValueTag::Lis, l) => {
|
(HeapCellValueTag::Lis, l) => {
|
||||||
self.try_from_inner_list(vec![], l, stub_gen, store_v)
|
self.try_from_inner_list(vec![], l, stub_gen, value)
|
||||||
}
|
}
|
||||||
(HeapCellValueTag::PStrLoc, h) => {
|
(HeapCellValueTag::PStrLoc, h) => {
|
||||||
self.try_from_partial_string(vec![], h, stub_gen, store_v)
|
self.try_from_partial_string(vec![], h, stub_gen, value)
|
||||||
}
|
}
|
||||||
(HeapCellValueTag::AttrVar | HeapCellValueTag::StackVar | HeapCellValueTag::Var) => {
|
(HeapCellValueTag::AttrVar | HeapCellValueTag::StackVar | HeapCellValueTag::Var) => {
|
||||||
let err = self.instantiation_error();
|
let err = self.instantiation_error();
|
||||||
@@ -2397,7 +2397,7 @@ impl MachineState {
|
|||||||
if name == atom!("[]") && arity == 0 {
|
if name == atom!("[]") && arity == 0 {
|
||||||
Ok(vec![])
|
Ok(vec![])
|
||||||
} else {
|
} else {
|
||||||
let err = self.type_error(ValidType::List, store_v);
|
let err = self.type_error(ValidType::List, value);
|
||||||
Err(self.error_form(err, stub_gen()))
|
Err(self.error_form(err, stub_gen()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2406,7 +2406,7 @@ impl MachineState {
|
|||||||
Ok(cstr.chars().map(|c| char_as_cell!(c)).collect())
|
Ok(cstr.chars().map(|c| char_as_cell!(c)).collect())
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let err = self.type_error(ValidType::List, store_v);
|
let err = self.type_error(ValidType::List, value);
|
||||||
Err(self.error_form(err, stub_gen()))
|
Err(self.error_form(err, stub_gen()))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2423,16 +2423,15 @@ impl MachineState {
|
|||||||
l += 1;
|
l += 1;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let deref_v = self.deref(self.heap[l]);
|
let value = self.store(self.deref(self.heap[l]));
|
||||||
let store_v = self.store(self.heap[l]);
|
|
||||||
|
|
||||||
read_heap_cell!(store_v,
|
read_heap_cell!(value,
|
||||||
(HeapCellValueTag::Lis, hcp) => {
|
(HeapCellValueTag::Lis, hcp) => {
|
||||||
result.push(self.heap[hcp]);
|
result.push(self.heap[hcp]);
|
||||||
l = hcp + 1;
|
l = hcp + 1;
|
||||||
}
|
}
|
||||||
(HeapCellValueTag::PStrOffset) => {
|
(HeapCellValueTag::PStrLoc, l) => {
|
||||||
return self.try_from_partial_string(result, deref_v.get_value(), stub_gen, a1);
|
return self.try_from_partial_string(result, l, stub_gen, a1);
|
||||||
}
|
}
|
||||||
(HeapCellValueTag::Atom, (name, arity)) => {
|
(HeapCellValueTag::Atom, (name, arity)) => {
|
||||||
if name == atom!("[]") && arity == 0 {
|
if name == atom!("[]") && arity == 0 {
|
||||||
@@ -2443,7 +2442,7 @@ impl MachineState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if store_v.is_var() {
|
if value.is_var() {
|
||||||
let err = self.instantiation_error();
|
let err = self.instantiation_error();
|
||||||
return Err(self.error_form(err, stub_gen()));
|
return Err(self.error_form(err, stub_gen()));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -829,12 +829,12 @@ impl Machine {
|
|||||||
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
||||||
}
|
}
|
||||||
TrailEntryTag::TrailedAttrVarListLink => {
|
TrailEntryTag::TrailedAttrVarListLink => {
|
||||||
let value = HeapCellValue::from_bytes(
|
let l = self.machine_st.trail[i + 1].get_value() as usize;
|
||||||
self.machine_st.trail[i + 1].into_bytes()
|
|
||||||
);
|
|
||||||
|
|
||||||
if value.get_value() < self.machine_st.hb {
|
if l < self.machine_st.hb {
|
||||||
self.machine_st.heap[h] = value;
|
self.machine_st.heap[h] = list_loc_as_cell!(l);
|
||||||
|
} else {
|
||||||
|
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TrailEntryTag::TrailedBlackboardEntry => {
|
TrailEntryTag::TrailedBlackboardEntry => {
|
||||||
|
|||||||
@@ -2876,7 +2876,7 @@ impl Machine {
|
|||||||
debug_assert_eq!(addr.get_tag(), HeapCellValueTag::Lis);
|
debug_assert_eq!(addr.get_tag(), HeapCellValueTag::Lis);
|
||||||
|
|
||||||
let l = addr.get_value();
|
let l = addr.get_value();
|
||||||
let tail = self.machine_st.store(self.machine_st.deref(heap_loc_as_cell!(l + 1)));
|
let tail = self.machine_st.store(self.machine_st.deref(self.machine_st.heap[l + 1]));
|
||||||
|
|
||||||
let tail = if tail.is_var() {
|
let tail = if tail.is_var() {
|
||||||
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
||||||
|
|||||||
Reference in New Issue
Block a user