summaryrefslogtreecommitdiff
path: root/libgrust/libformat_parser
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2025-09-16 19:31:39 -0400
committerArthur Cohen <arthur.cohen@embecosm.com>2025-10-30 21:30:51 +0100
commit626812ff966a58fc5f233bbe5d4cdacc32a8db4f (patch)
tree42915258476b3f5d70dc39ef88cb581149ff0309 /libgrust/libformat_parser
parent22baf6c75f43f84500c964e67417d07738177436 (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/libformat_parser')
-rw-r--r--libgrust/libformat_parser/src/lib.rs84
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
}
}
}