@@ -275,3 +275,63 @@ impl PropertyInfo {
275275        } 
276276    } 
277277} 
278+ 
279+ #[ derive( Debug ) ]  
280+ pub  struct  MethodInfo  { 
281+     pub  id :  i32 , 
282+     pub  method_name :  StringName , 
283+     pub  class_name :  ClassName , 
284+     pub  return_type :  PropertyInfo , 
285+     pub  arguments :  Vec < PropertyInfo > , 
286+     pub  default_arguments :  Vec < Variant > , 
287+     pub  flags :  global:: MethodFlags , 
288+ } 
289+ 
290+ impl  MethodInfo  { 
291+     /// Converts to the FFI type. Keep this object allocated while using that! 
292+      /// 
293+      /// The struct returned by this function contains pointers into the fields of `self`. `self` should therefore not be dropped while the 
294+      /// [`sys::GDExtensionMethodInfo`] is still in use. 
295+      /// 
296+      /// This function also leaks memory that has to be cleaned up by the caller once it is no longer used. Specifically the `arguments` and 
297+      /// `default_arguments` vectors have to be reconstructed from the pointer and length and then dropped/freed. 
298+      /// 
299+      /// Each vector can be reconstructed with `Vec::from_raw_parts` since the pointers were created with `Vec::into_boxed_slice`, which 
300+      /// guarantees that the vector capacity and length are equal. 
301+      pub  fn  method_sys ( & self )  -> sys:: GDExtensionMethodInfo  { 
302+         use  crate :: obj:: EngineBitfield  as  _; 
303+ 
304+         let  argument_count = self . arguments . len ( )  as  u32 ; 
305+         let  argument_vec = self 
306+             . arguments 
307+             . iter ( ) 
308+             . map ( |arg| arg. property_sys ( ) ) 
309+             . collect :: < Vec < _ > > ( ) 
310+             . into_boxed_slice ( ) ; 
311+ 
312+         // SAFETY: dereferencing the new box pointer is fine as it is guaranteed to not be null 
313+         let  arguments = unsafe  {  ( * Box :: into_raw ( argument_vec) ) . as_mut_ptr ( )  } ; 
314+ 
315+         let  default_argument_count = self . default_arguments . len ( )  as  u32 ; 
316+         let  default_argument_vec = self 
317+             . default_arguments 
318+             . iter ( ) 
319+             . map ( |arg| arg. var_sys ( ) ) 
320+             . collect :: < Vec < _ > > ( ) 
321+             . into_boxed_slice ( ) ; 
322+ 
323+         // SAFETY: dereferencing the new box pointer is fine as it is guaranteed to not be null 
324+         let  default_arguments = unsafe  {  ( * Box :: into_raw ( default_argument_vec) ) . as_mut_ptr ( )  } ; 
325+ 
326+         sys:: GDExtensionMethodInfo  { 
327+             id :  self . id , 
328+             name :  self . method_name . string_sys ( ) , 
329+             return_value :  self . return_type . property_sys ( ) , 
330+             argument_count, 
331+             arguments, 
332+             default_argument_count, 
333+             default_arguments, 
334+             flags :  u32:: try_from ( self . flags . ord ( ) ) . expect ( "flags should be valid" ) , 
335+         } 
336+     } 
337+ } 
0 commit comments