From 4b42469fcffd3e2ba8f407859521d829aec1323a Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Fri, 18 Mar 2022 16:55:08 +0100 Subject: [PATCH] Make a safer conversion From for INTERFACE --- crates/libs/implement/src/lib.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/libs/implement/src/lib.rs b/crates/libs/implement/src/lib.rs index 0073e68897..2978393fc5 100644 --- a/crates/libs/implement/src/lib.rs +++ b/crates/libs/implement/src/lib.rs @@ -43,17 +43,15 @@ pub fn implement(attributes: proc_macro::TokenStream, original_type: proc_macro: let conversions = attributes.implement.iter().enumerate().map(|(enumerate, implement)| { let interface_ident = implement.to_ident(); - let offset: TokenStream = format!("{}", enumerate).into(); + let offset: TokenStream = enumerate.to_string().into(); quote! { impl <#constraints> ::core::convert::From<#original_ident::<#(#generics,)*>> for #interface_ident { fn from(this: #original_ident::<#(#generics,)*>) -> Self { - unsafe { - let this = #impl_ident::<#(#generics,)*>::new(this); - let ptr = ::std::boxed::Box::into_raw(::std::boxed::Box::new(this)); - ::core::mem::transmute_copy(&::core::ptr::NonNull::new_unchecked( - &mut (*ptr).vtables.#offset as *mut _ as _, - )) - } + let this = #impl_ident::<#(#generics,)*>::new(this); + let mut this = ::std::boxed::Box::new(this); + let vtable_ptr = &mut this.vtables.#offset as *mut *const <#interface_ident as ::windows::core::Interface>::Vtable; + let _ = ::std::boxed::Box::leak(this); + unsafe { ::core::mem::transmute_copy(&vtable_ptr) } } } impl <#constraints> ::windows::core::ToImpl<#interface_ident> for #original_ident::<#(#generics,)*> {