Skip to content

Commit ec164bc

Browse files
committed
Use field pointer instead of elem pointer
1 parent 1e8d2c8 commit ec164bc

3 files changed

Lines changed: 17 additions & 13 deletions

File tree

‎libcc2rs/src/cstr.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ mod tests {
357357
#[test]
358358
fn stops_at_first_nul_in_vec() {
359359
let v = std::rc::Rc::new(RefCell::new(EMBEDDED_NUL.to_vec()));
360-
check(&v.as_pointer());
360+
check(&v.as_pointer().decay());
361361
}
362362

363363
#[test]

‎libcc2rs/src/field.rs‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ macro_rules! array_field_ptr {
568568

569569
// Field `field` of the struct that a Ptr or a Value holds, to make a pointer
570570
// to with as_pointer(), e.g., `field_ref!(p, v).as_pointer()` for a vector
571-
// field `v`, which gives a pointer to the vector or to its first element.
571+
// field `v`, which gives a pointer to the vector.
572572
#[macro_export]
573573
macro_rules! field_ref {
574574
($base:expr, $field:ident) => {{
@@ -1006,7 +1006,8 @@ impl<S: Record, T: ByteRepr> VecElem<'_, S, T> {
10061006
let elems: Ptr<T> = self
10071007
.base
10081008
.field_ref(self.get, self.get_mut, self.offset)
1009-
.as_pointer();
1009+
.as_pointer()
1010+
.decay();
10101011
elems.offset(self.idx).upgrade()
10111012
}
10121013
}
@@ -1561,10 +1562,11 @@ mod tests {
15611562
}
15621563

15631564
#[test]
1564-
#[should_panic(expected = "too large for a pointer to its elements")]
15651565
fn far_vector_field_ptr() {
1566-
let far: Ptr<Far> = field_ptr!(holds_far(), far);
1567-
let _: Ptr<i32> = field_ref!(far, v).as_pointer();
1566+
let holder = holds_far();
1567+
let far: Ptr<Far> = field_ptr!(holder, far);
1568+
let v: Ptr<i32> = field_ref!(far, v).as_pointer().decay();
1569+
assert_eq!(v.offset(1).read(), 6);
15681570
}
15691571

15701572
#[test]
@@ -1574,7 +1576,7 @@ mod tests {
15741576
let s: Value<Far> = Rc::new(RefCell::new(holds_far().borrow().far.clone()));
15751577
let arr: Ptr<i32> = array_field_ptr!(s, arr);
15761578
assert_eq!(arr.offset(2).read(), 3);
1577-
let v: Ptr<i32> = field_ref!(s, v).as_pointer();
1579+
let v: Ptr<i32> = field_ref!(s, v).as_pointer().decay();
15781580
assert_eq!(v.offset(1).read(), 6);
15791581
}
15801582

@@ -1623,7 +1625,7 @@ mod tests {
16231625
assert_ne!(a.offset(1), b);
16241626
assert_eq!(b.offset(-2), a);
16251627
// The elements of a vector are not in the struct.
1626-
let v: Ptr<i32> = field_ref!(s, v).as_pointer();
1628+
let v: Ptr<i32> = field_ref!(s, v).as_pointer().decay();
16271629
assert_ne!(v.offset(6), field_ptr!(s, c));
16281630
}
16291631

‎libcc2rs/src/rc.rs‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,10 +1423,12 @@ impl<T: 'static> Ptr<Vec<T>> {
14231423
kind: PtrKind::HeapVec(weak.clone()),
14241424
},
14251425
// The elements of a field are reached through the struct.
1426-
PtrKind::Field(root, _, FieldShape::Single) => Ptr {
1427-
offset: 0,
1428-
kind: PtrKind::Field(root.clone(), field_offset(self.offset), FieldShape::Vec),
1429-
},
1426+
PtrKind::Field(root, _, FieldShape::Single) if u32::try_from(self.offset).is_ok() => {
1427+
Ptr {
1428+
offset: 0,
1429+
kind: PtrKind::Field(root.clone(), self.offset as u32, FieldShape::Vec),
1430+
}
1431+
}
14301432
PtrKind::StackVec(_)
14311433
| PtrKind::HeapVec(_)
14321434
| PtrKind::StackArray(_)
@@ -1654,7 +1656,7 @@ mod tests {
16541656
assert_eq!(pp.borrow().read(), 3);
16551657
pp_ptr.read().write(7);
16561658
assert_eq!(a.borrow()[2], 7);
1657-
pp_ptr.write(v.as_pointer().offset(1));
1659+
pp_ptr.write(v.as_pointer().decay().offset(1));
16581660
pp_ptr.read().write(8);
16591661
assert_eq!(*v.borrow(), vec![4, 8]);
16601662
}

0 commit comments

Comments
 (0)