Skip to content

Commit b21bdf1

Browse files
committed
Allow nullptr conversions between any ptr types
1 parent 6209876 commit b21bdf1

1 file changed

Lines changed: 14 additions & 4 deletions

File tree

libcc2rs/src/rc.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,7 @@ trait ErasedPtr: std::any::Any {
10091009
fn memcpy(&self, src: &dyn ErasedPtr, len: usize);
10101010
fn as_any(&self) -> &dyn std::any::Any;
10111011
fn equals(&self, other: &dyn ErasedPtr) -> Option<bool>;
1012+
fn is_null(&self) -> bool;
10121013
}
10131014

10141015
impl<T> ErasedPtr for Ptr<T>
@@ -1048,6 +1049,10 @@ where
10481049

10491050
None
10501051
}
1052+
1053+
fn is_null(&self) -> bool {
1054+
Ptr::is_null(self)
1055+
}
10511056
}
10521057

10531058
#[derive(Clone)]
@@ -1071,10 +1076,8 @@ impl Default for AnyPtr {
10711076

10721077
impl AnyPtr {
10731078
pub fn cast<T: 'static>(&self) -> Option<Ptr<T>> {
1074-
if let Some(p) = self.ptr.as_any().downcast_ref::<Ptr<()>>() {
1075-
if p.is_null() {
1076-
return Some(Ptr::<T>::null());
1077-
}
1079+
if self.ptr.is_null() {
1080+
return Some(Ptr::<T>::null());
10781081
}
10791082
self.ptr.as_any().downcast_ref::<Ptr<T>>().cloned()
10801083
}
@@ -1272,6 +1275,7 @@ mod tests {
12721275

12731276
#[test]
12741277
fn anyptr_null_cast() {
1278+
// void* nullptr
12751279
let any = Ptr::<()>::null().to_any();
12761280
let p: Option<Ptr<u32>> = any.cast::<u32>();
12771281
assert!(p.is_some());
@@ -1280,6 +1284,12 @@ mod tests {
12801284
let p2: Option<Ptr<u8>> = any.cast::<u8>();
12811285
assert!(p2.is_some());
12821286
assert!(p2.unwrap().is_null());
1287+
1288+
// int* nullptr
1289+
let any2 = Ptr::<i32>::null().to_any();
1290+
let p3: Option<Ptr<f32>> = any2.cast::<f32>();
1291+
assert!(p3.is_some());
1292+
assert!(p3.unwrap().is_null());
12831293
}
12841294

12851295
#[test]

0 commit comments

Comments
 (0)