@@ -88,7 +88,7 @@ pub trait PtrcallSignatureTuple {
88
88
call_type : sys:: PtrcallType ,
89
89
) ;
90
90
91
- unsafe fn out_class_ptrcall < Rr : PtrcallReturn < Ret = Self :: Ret > > (
91
+ unsafe fn out_class_ptrcall (
92
92
method_bind : ClassMethodBind ,
93
93
// Separate parameters to reduce tokens in generated class API.
94
94
class_name : & ' static str ,
@@ -98,7 +98,7 @@ pub trait PtrcallSignatureTuple {
98
98
args : Self :: Params ,
99
99
) -> Self :: Ret ;
100
100
101
- unsafe fn out_builtin_ptrcall < Rr : PtrcallReturn < Ret = Self :: Ret > > (
101
+ unsafe fn out_builtin_ptrcall (
102
102
builtin_fn : BuiltinMethodBind ,
103
103
// Separate parameters to reduce tokens in generated class API.
104
104
class_name : & ' static str ,
@@ -306,7 +306,7 @@ macro_rules! impl_varcall_signature_for_tuple {
306
306
type_ptrs. extend( varargs. iter( ) . map( sys:: GodotFfi :: sys) ) ;
307
307
308
308
// Important: this calls from_sys_init_default().
309
- let result = PtrcallReturnT :: <$R> :: call ( |return_ptr| {
309
+ let result = new_from_ptrcall :: <Self :: Ret > ( |return_ptr| {
310
310
utility_fn( return_ptr, type_ptrs. as_ptr( ) , type_ptrs. len( ) as i32 ) ;
311
311
} ) ;
312
312
result. unwrap_or_else( |err| return_error:: <Self :: Ret >( & call_ctx, err) )
@@ -360,7 +360,7 @@ macro_rules! impl_ptrcall_signature_for_tuple {
360
360
}
361
361
362
362
#[ inline]
363
- unsafe fn out_class_ptrcall< Rr : PtrcallReturn < Ret = Self :: Ret >> (
363
+ unsafe fn out_class_ptrcall(
364
364
method_bind: ClassMethodBind ,
365
365
// Separate parameters to reduce tokens in generated class API.
366
366
class_name: & ' static str ,
@@ -391,14 +391,14 @@ macro_rules! impl_ptrcall_signature_for_tuple {
391
391
) *
392
392
] ;
393
393
394
- let result = Rr :: call ( |return_ptr| {
394
+ let result = new_from_ptrcall :: < Self :: Ret > ( |return_ptr| {
395
395
class_fn( method_bind. 0 , object_ptr, type_ptrs. as_ptr( ) , return_ptr) ;
396
396
} ) ;
397
397
result. unwrap_or_else( |err| return_error:: <Self :: Ret >( & call_ctx, err) )
398
398
}
399
399
400
400
#[ inline]
401
- unsafe fn out_builtin_ptrcall< Rr : PtrcallReturn < Ret = Self :: Ret >> (
401
+ unsafe fn out_builtin_ptrcall(
402
402
builtin_fn: BuiltinMethodBind ,
403
403
// Separate parameters to reduce tokens in generated class API.
404
404
class_name: & ' static str ,
@@ -422,7 +422,7 @@ macro_rules! impl_ptrcall_signature_for_tuple {
422
422
) *
423
423
] ;
424
424
425
- let result = Rr :: call ( |return_ptr| {
425
+ let result = new_from_ptrcall :: < Self :: Ret > ( |return_ptr| {
426
426
builtin_fn( type_ptr, type_ptrs. as_ptr( ) , return_ptr, type_ptrs. len( ) as i32 ) ;
427
427
} ) ;
428
428
result. unwrap_or_else( |err| return_error:: <Self :: Ret >( & call_ctx, err) )
@@ -450,7 +450,7 @@ macro_rules! impl_ptrcall_signature_for_tuple {
450
450
) *
451
451
] ;
452
452
453
- let result = PtrcallReturnT :: <$R> :: call ( |return_ptr| {
453
+ let result = new_from_ptrcall :: <Self :: Ret > ( |return_ptr| {
454
454
utility_fn( return_ptr, arg_ptrs. as_ptr( ) , arg_ptrs. len( ) as i32 ) ;
455
455
} ) ;
456
456
result. unwrap_or_else( |err| return_error:: <Self :: Ret >( & call_ctx, err) )
@@ -562,6 +562,16 @@ impl<T: FromGodot> FromVariantIndirect for T {
562
562
}
563
563
}
564
564
565
+ unsafe fn new_from_ptrcall < T : FromGodot > (
566
+ process_return_ptr : impl FnOnce ( sys:: GDExtensionTypePtr ) ,
567
+ ) -> Result < T , ConvertError > {
568
+ let ffi = <<T :: Via as GodotType >:: Ffi as sys:: GodotFfi >:: new_with_init ( |return_ptr| {
569
+ process_return_ptr ( return_ptr)
570
+ } ) ;
571
+
572
+ T :: Via :: try_from_ffi ( ffi) . and_then ( T :: try_from_godot)
573
+ }
574
+
565
575
// ----------------------------------------------------------------------------------------------------------------------------------------------
566
576
// Poor man's variadic templates.
567
577
// For example, RenderingServer::environment_set_volumetric_fog() has 14 parameters. We may need to extend this if the API adds more such methods.
0 commit comments