diff options
Diffstat (limited to 'ffi-macros')
-rw-r--r-- | ffi-macros/src/lib.rs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/ffi-macros/src/lib.rs b/ffi-macros/src/lib.rs index ad237238..ceb5d579 100644 --- a/ffi-macros/src/lib.rs +++ b/ffi-macros/src/lib.rs @@ -452,6 +452,28 @@ fn derive_conversion_functions(mut st: syn::ItemStruct, } } + impl RefMutRaw<Option<&'static mut #wrapped>> for ::Maybe<#wrapper> { + fn ref_mut_raw(self) -> Option<&'static mut #wrapped> { + if self.is_none() { + return None; + } + let wrapper = unsafe { + &mut (*self.unwrap().as_ptr()) + }; + wrapper.assert_tag(); + match wrapper.0 { + #ownership::Owned(ref mut o) => Some(o), + #ownership::Ref(r) => { + panic!("FFI contract violation: expected mutable \ + reference, got immutable reference: {:?}", r); + }, + #ownership::RefMut(r) => unsafe { + Some(&mut *r) + }, + } + } + } + impl #wrapper { fn wrap(obj: #ownership) -> *mut #wrapper { Box::into_raw(Box::new(#wrapper(obj, #magic_value, |