@@ -275,3 +275,63 @@ impl PropertyInfo {
275
275
}
276
276
}
277
277
}
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