diff --git a/musikr/src/main/jni/src/taglib/bridge.rs b/musikr/src/main/jni/src/taglib/bridge.rs index a1d6b2d56..39257f176 100644 --- a/musikr/src/main/jni/src/taglib/bridge.rs +++ b/musikr/src/main/jni/src/taglib/bridge.rs @@ -138,8 +138,10 @@ mod bridge_impl { #[namespace = "TagLib::Ogg"] #[cxx_name = "XiphComment"] type CPPXiphComment; + // Explicit lifecycle definition to state while the Pin is temporary, the CPPFieldListMap + // ref returned actually has the same lifetime as the CPPXiphComment. #[cxx_name = "fieldListMap"] - fn fieldListMap(self: Pin<&CPPXiphComment>) -> &CPPFieldListMap; + fn fieldListMap<'slf, 'file_ref>(self: Pin<&'slf CPPXiphComment>) -> &'file_ref CPPFieldListMap; #[namespace = "TagLib"] #[cxx_name = "SimplePropertyMap"] diff --git a/musikr/src/main/jni/src/taglib/xiph.rs b/musikr/src/main/jni/src/taglib/xiph.rs index ac7e8a8c2..fe6029ad1 100644 --- a/musikr/src/main/jni/src/taglib/xiph.rs +++ b/musikr/src/main/jni/src/taglib/xiph.rs @@ -16,12 +16,9 @@ impl<'file_ref> XiphComment<'file_ref> { } pub fn field_list_map<'slf>(&'slf self) -> FieldListMap<'file_ref> { - let map: &'slf CPPFieldListMap = self.this.pin().fieldListMap(); - // CPPFieldListMap exists for as long as the XiphComment, so we can transmute it - // to the file_ref lifetime. - let extended_map: &'file_ref CPPFieldListMap = unsafe { std::mem::transmute(map) }; - let map_pin = unsafe { Pin::new_unchecked(extended_map) }; - FieldListMap::new(map_pin) + let map: &'file_ref CPPFieldListMap = self.this.pin().fieldListMap(); + let map_this = unsafe { RefThis::new(map) }; + FieldListMap::new(map_this) } pub fn picture_list(&mut self) -> Option> { @@ -32,18 +29,18 @@ impl<'file_ref> XiphComment<'file_ref> { } pub struct FieldListMap<'file_ref> { - this: Pin<&'file_ref CPPFieldListMap>, + this: RefThis<'file_ref, CPPFieldListMap>, } impl<'file_ref> FieldListMap<'file_ref> { - pub fn new(this: Pin<&'file_ref CPPFieldListMap>) -> Self { + pub fn new(this: RefThis<'file_ref, CPPFieldListMap>) -> Self { Self { this } } } impl<'file_ref> FieldListMap<'file_ref> { pub fn to_hashmap(&self) -> HashMap> { - let cxx_vec = FieldListMap_to_entries(self.this); + let cxx_vec = FieldListMap_to_entries(self.this.pin()); cxx_vec .iter() .map(|property| {