@@ -26,21 +26,38 @@ macro_rules! impl_variant_metadata {
26
26
}
27
27
} ;
28
28
}
29
-
29
+ // Certain types need to be passed as initialized pointers in their from_variant implementations in 4.0. Because
30
+ // 4.0 uses `*ptr = value` to return the type, and some types in c++ override `operator=` in c++ in a way
31
+ // that requires the pointer the be initialized. But some other types will cause a memory leak in 4.1 if
32
+ // initialized.
33
+ //
34
+ // Thus we can use `init` to indicate when it must be initialized in 4.0.
30
35
macro_rules! impl_variant_traits {
31
36
( $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident) => {
32
37
impl_variant_traits!( @@ $T, $from_fn, $to_fn, $variant_type; ) ;
33
38
} ;
34
39
35
- ( $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident, $param_metadata: ident) => {
40
+ ( $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident, init) => {
41
+ impl_variant_traits!( @@ $T, $from_fn, $to_fn, $variant_type, init; ) ;
42
+ } ;
43
+
44
+ ( $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident, metadata = $param_metadata: ident) => {
36
45
impl_variant_traits!( @@ $T, $from_fn, $to_fn, $variant_type;
37
46
fn param_metadata( ) -> sys:: GDExtensionClassMethodArgumentMetadata {
38
47
sys:: $param_metadata
39
48
}
40
49
) ;
41
50
} ;
42
51
43
- ( @@ $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident; $( $extra: tt) * ) => {
52
+ ( $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident, init, metadata = $param_metadata: ident) => {
53
+ impl_variant_traits!( @@ $T, $from_fn, $to_fn, $variant_type, init;
54
+ fn param_metadata( ) -> sys:: GDExtensionClassMethodArgumentMetadata {
55
+ sys:: $param_metadata
56
+ }
57
+ ) ;
58
+ } ;
59
+
60
+ ( @@ $T: ty, $from_fn: ident, $to_fn: ident, $variant_type: ident $( , $init: ident) ?; $( $extra: tt) * ) => {
44
61
impl ToVariant for $T {
45
62
fn to_variant( & self ) -> Variant {
46
63
let variant = unsafe {
@@ -70,10 +87,7 @@ macro_rules! impl_variant_traits {
70
87
//
71
88
// This was changed in 4.1.
72
89
let result = unsafe {
73
- #[ cfg( gdextension_api = "4.0" ) ]
74
- let from_sys_init = Self :: from_sys_init_default;
75
- #[ cfg( not( gdextension_api = "4.0" ) ) ]
76
- let from_sys_init = Self :: from_sys_init;
90
+ impl_variant_traits!( @@from_sys_init, from_sys_init $( , $init) ?) ;
77
91
78
92
from_sys_init( |self_ptr| {
79
93
let converter = sys:: builtin_fn!( $to_fn) ;
@@ -87,6 +101,17 @@ macro_rules! impl_variant_traits {
87
101
88
102
impl_variant_metadata!( $T, $variant_type; $( $extra) * ) ;
89
103
} ;
104
+
105
+ ( @@from_sys_init, $from_sys_init: ident, init) => {
106
+ #[ cfg( gdextension_api = "4.0" ) ]
107
+ let $from_sys_init = Self :: from_sys_init_default;
108
+ #[ cfg( not( gdextension_api = "4.0" ) ) ]
109
+ let $from_sys_init = Self :: from_sys_init;
110
+ } ;
111
+
112
+ ( @@from_sys_init, $from_sys_init: ident) => {
113
+ let $from_sys_init = Self :: from_sys_init;
114
+ } ;
90
115
}
91
116
92
117
macro_rules! impl_variant_traits_int {
@@ -154,28 +179,28 @@ mod impls {
154
179
impl_variant_traits ! ( Aabb , aabb_to_variant, aabb_from_variant, Aabb ) ;
155
180
impl_variant_traits ! ( bool , bool_to_variant, bool_from_variant, Bool ) ;
156
181
impl_variant_traits ! ( Basis , basis_to_variant, basis_from_variant, Basis ) ;
157
- impl_variant_traits ! ( Callable , callable_to_variant, callable_from_variant, Callable ) ;
182
+ impl_variant_traits ! ( Callable , callable_to_variant, callable_from_variant, Callable , init ) ;
158
183
impl_variant_traits ! ( Vector2 , vector2_to_variant, vector2_from_variant, Vector2 ) ;
159
184
impl_variant_traits ! ( Vector3 , vector3_to_variant, vector3_from_variant, Vector3 ) ;
160
185
impl_variant_traits ! ( Vector4 , vector4_to_variant, vector4_from_variant, Vector4 ) ;
161
186
impl_variant_traits ! ( Vector2i , vector2i_to_variant, vector2i_from_variant, Vector2i ) ;
162
187
impl_variant_traits ! ( Vector3i , vector3i_to_variant, vector3i_from_variant, Vector3i ) ;
163
188
impl_variant_traits ! ( Quaternion , quaternion_to_variant, quaternion_from_variant, Quaternion ) ;
164
189
impl_variant_traits ! ( Color , color_to_variant, color_from_variant, Color ) ;
165
- impl_variant_traits ! ( GodotString , string_to_variant, string_from_variant, String ) ;
190
+ impl_variant_traits ! ( GodotString , string_to_variant, string_from_variant, String , init ) ;
166
191
impl_variant_traits ! ( StringName , string_name_to_variant, string_name_from_variant, StringName ) ;
167
192
impl_variant_traits ! ( NodePath , node_path_to_variant, node_path_from_variant, NodePath ) ;
168
193
// TODO use impl_variant_traits!, as soon as `Default` is available. Also consider auto-generating.
169
194
impl_variant_metadata ! ( Signal , /* signal_to_variant, signal_from_variant, */ Signal ) ;
170
- impl_variant_traits ! ( PackedByteArray , packed_byte_array_to_variant, packed_byte_array_from_variant, PackedByteArray ) ;
171
- impl_variant_traits ! ( PackedInt32Array , packed_int32_array_to_variant, packed_int32_array_from_variant, PackedInt32Array ) ;
172
- impl_variant_traits ! ( PackedInt64Array , packed_int64_array_to_variant, packed_int64_array_from_variant, PackedInt64Array ) ;
173
- impl_variant_traits ! ( PackedFloat32Array , packed_float32_array_to_variant, packed_float32_array_from_variant, PackedFloat32Array ) ;
174
- impl_variant_traits ! ( PackedFloat64Array , packed_float64_array_to_variant, packed_float64_array_from_variant, PackedFloat64Array ) ;
175
- impl_variant_traits ! ( PackedStringArray , packed_string_array_to_variant, packed_string_array_from_variant, PackedStringArray ) ;
176
- impl_variant_traits ! ( PackedVector2Array , packed_vector2_array_to_variant, packed_vector2_array_from_variant, PackedVector2Array ) ;
177
- impl_variant_traits ! ( PackedVector3Array , packed_vector3_array_to_variant, packed_vector3_array_from_variant, PackedVector3Array ) ;
178
- impl_variant_traits ! ( PackedColorArray , packed_color_array_to_variant, packed_color_array_from_variant, PackedColorArray ) ;
195
+ impl_variant_traits ! ( PackedByteArray , packed_byte_array_to_variant, packed_byte_array_from_variant, PackedByteArray , init ) ;
196
+ impl_variant_traits ! ( PackedInt32Array , packed_int32_array_to_variant, packed_int32_array_from_variant, PackedInt32Array , init ) ;
197
+ impl_variant_traits ! ( PackedInt64Array , packed_int64_array_to_variant, packed_int64_array_from_variant, PackedInt64Array , init ) ;
198
+ impl_variant_traits ! ( PackedFloat32Array , packed_float32_array_to_variant, packed_float32_array_from_variant, PackedFloat32Array , init ) ;
199
+ impl_variant_traits ! ( PackedFloat64Array , packed_float64_array_to_variant, packed_float64_array_from_variant, PackedFloat64Array , init ) ;
200
+ impl_variant_traits ! ( PackedStringArray , packed_string_array_to_variant, packed_string_array_from_variant, PackedStringArray , init ) ;
201
+ impl_variant_traits ! ( PackedVector2Array , packed_vector2_array_to_variant, packed_vector2_array_from_variant, PackedVector2Array , init ) ;
202
+ impl_variant_traits ! ( PackedVector3Array , packed_vector3_array_to_variant, packed_vector3_array_from_variant, PackedVector3Array , init ) ;
203
+ impl_variant_traits ! ( PackedColorArray , packed_color_array_to_variant, packed_color_array_from_variant, PackedColorArray , init ) ;
179
204
impl_variant_traits ! ( Plane , plane_to_variant, plane_from_variant, Plane ) ;
180
205
impl_variant_traits ! ( Projection , projection_to_variant, projection_from_variant, Projection ) ;
181
206
impl_variant_traits ! ( Rid , rid_to_variant, rid_from_variant, Rid ) ;
@@ -185,7 +210,7 @@ mod impls {
185
210
impl_variant_traits ! ( Transform3D , transform_3d_to_variant, transform_3d_from_variant, Transform3D ) ;
186
211
impl_variant_traits ! ( Dictionary , dictionary_to_variant, dictionary_from_variant, Dictionary ) ;
187
212
188
- impl_variant_traits ! ( i64 , int_to_variant, int_from_variant, Int , GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64 ) ;
213
+ impl_variant_traits ! ( i64 , int_to_variant, int_from_variant, Int , metadata = GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64 ) ;
189
214
impl_variant_traits_int ! ( i8 , GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8 ) ;
190
215
impl_variant_traits_int ! ( i16 , GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16 ) ;
191
216
impl_variant_traits_int ! ( i32 , GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32 ) ;
@@ -195,7 +220,7 @@ mod impls {
195
220
impl_variant_traits_int ! ( u32 , GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32 ) ;
196
221
// u64 is not supported, because it cannot be represented on GDScript side, and implicitly converting to i64 is error-prone.
197
222
198
- impl_variant_traits ! ( f64 , float_to_variant, float_from_variant, Float , GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE ) ;
223
+ impl_variant_traits ! ( f64 , float_to_variant, float_from_variant, Float , metadata = GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE ) ;
199
224
impl_variant_traits_float ! ( f32 , GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT ) ;
200
225
}
201
226
0 commit comments