diff options
| author | Owen Avery <powerboat9.gamer@gmail.com> | 2025-09-16 19:31:39 -0400 |
|---|---|---|
| committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-10-30 21:30:51 +0100 |
| commit | 626812ff966a58fc5f233bbe5d4cdacc32a8db4f (patch) | |
| tree | 42915258476b3f5d70dc39ef88cb581149ff0309 /libgrust | |
| parent | 22baf6c75f43f84500c964e67417d07738177436 (diff) | |
gccrs: Improve FFIOpt
Also fixes https://github.com/Rust-GCC/gccrs/issues/4171.
gcc/rust/ChangeLog:
* ast/rust-fmt.h (class FFIOpt): Adjust internal structure to
match a repr(C) rust enum.
libgrust/ChangeLog:
* libformat_parser/src/lib.rs (struct FFIOpt): Likewise and
remove some now-redundant methods.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'libgrust')
| -rw-r--r-- | libgrust/libformat_parser/src/lib.rs | 84 |
1 files changed, 8 insertions, 76 deletions
diff --git a/libgrust/libformat_parser/src/lib.rs b/libgrust/libformat_parser/src/lib.rs index 049403db0b7..efb5d00f678 100644 --- a/libgrust/libformat_parser/src/lib.rs +++ b/libgrust/libformat_parser/src/lib.rs @@ -83,87 +83,19 @@ pub mod ffi { } } - #[repr(C)] - pub struct FFIOpt<T> { - val: MaybeUninit<T>, - is_some: bool - } - - impl<T> Clone for FFIOpt<T> - where - T: Clone - { - fn clone(&self) -> Self { - match self.get_opt_ref() { - Some(r) => FFIOpt::new_val(r.clone()), - None => FFIOpt::new_none() - } - } - } - - impl<T> PartialEq for FFIOpt<T> - where - T: PartialEq - { - fn eq(&self, other: &Self) -> bool { - match (self.get_opt_ref(), other.get_opt_ref()) { - (Some(a), Some(b)) => a.eq(b), - _ => false - } - } - } - - impl<T> Eq for FFIOpt<T> - where - T: Eq - {} - - impl<T> Drop for FFIOpt<T> - { - fn drop(&mut self) { - if self.is_some { - unsafe { std::ptr::drop_in_place(self.val.as_mut_ptr()) } - } - } + // https://github.com/rust-lang/rfcs/blob/master/text/2195-really-tagged-unions.md + #[repr(u8)] + #[derive(Copy, Clone, PartialEq, Eq)] + pub enum FFIOpt<T> { + Some(T), + None } impl<T> IntoFFI<FFIOpt<T>> for Option<T> { fn into_ffi(self) -> FFIOpt<T> { match self { - Some(v) => FFIOpt::new_val(v), - None => FFIOpt::new_none() - } - } - } - - impl<T> FFIOpt<T> { - pub fn new_val(v: T) -> Self { - FFIOpt { - val: MaybeUninit::new(v), - is_some: true - } - } - - pub fn new_none() -> Self { - FFIOpt { - val: MaybeUninit::uninit(), - is_some: false - } - } - - pub fn get_opt_ref(&self) -> Option<&T> { - if self.is_some { - Some(unsafe {&*self.val.as_ptr()}) - } else { - None - } - } - - pub fn get_opt_ref_mut(&mut self) -> Option<&mut T> { - if self.is_some { - Some(unsafe {&mut *self.val.as_mut_ptr()}) - } else { - None + Some(v) => FFIOpt::Some(v), + None => FFIOpt::None } } } |
