Skip to content

Commit 27a3a7f

Browse files
committed
Variant FFI: use conditionally compiled from_var_sys_init[_default]
1 parent ede9046 commit 27a3a7f

File tree

2 files changed

+47
-93
lines changed

2 files changed

+47
-93
lines changed

godot-core/src/builtin/variant/impls.rs

+16-46
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,15 @@ macro_rules! impl_variant_traits {
3737
impl_variant_traits!(@@ $T, $from_fn, $to_fn, $variant_type;);
3838
};
3939

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) => {
40+
($T:ty, $from_fn:ident, $to_fn:ident, $variant_type:ident, $param_metadata:ident) => {
4541
impl_variant_traits!(@@ $T, $from_fn, $to_fn, $variant_type;
4642
fn param_metadata() -> sys::GDExtensionClassMethodArgumentMetadata {
4743
sys::$param_metadata
4844
}
4945
);
5046
};
5147

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)*) => {
48+
(@@ $T:ty, $from_fn:ident, $to_fn:ident, $variant_type:ident; $($extra:tt)*) => {
6149
impl ToVariant for $T {
6250
fn to_variant(&self) -> Variant {
6351
let variant = unsafe {
@@ -87,9 +75,7 @@ macro_rules! impl_variant_traits {
8775
//
8876
// This was changed in 4.1.
8977
let result = unsafe {
90-
impl_variant_traits!(@@from_sys_init, from_sys_init $(, $init)?);
91-
92-
from_sys_init(|self_ptr| {
78+
sys::from_sys_init_or_init_default(|self_ptr| {
9379
let converter = sys::builtin_fn!($to_fn);
9480
converter(self_ptr, variant.var_sys());
9581
})
@@ -101,22 +87,6 @@ macro_rules! impl_variant_traits {
10187

10288
impl_variant_metadata!($T, $variant_type; $($extra)*);
10389
};
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-
115-
#[cfg(gdextension_api = "4.0")]
116-
let $from_sys_init = Self::from_sys_init_default;
117-
#[cfg(not(gdextension_api = "4.0"))]
118-
let $from_sys_init = Self::from_sys_init;
119-
};
12090
}
12191

12292
macro_rules! impl_variant_traits_int {
@@ -184,28 +154,28 @@ mod impls {
184154
impl_variant_traits!(Aabb, aabb_to_variant, aabb_from_variant, Aabb);
185155
impl_variant_traits!(bool, bool_to_variant, bool_from_variant, Bool);
186156
impl_variant_traits!(Basis, basis_to_variant, basis_from_variant, Basis);
187-
impl_variant_traits!(Callable, callable_to_variant, callable_from_variant, Callable, init);
157+
impl_variant_traits!(Callable, callable_to_variant, callable_from_variant, Callable);
188158
impl_variant_traits!(Vector2, vector2_to_variant, vector2_from_variant, Vector2);
189159
impl_variant_traits!(Vector3, vector3_to_variant, vector3_from_variant, Vector3);
190160
impl_variant_traits!(Vector4, vector4_to_variant, vector4_from_variant, Vector4);
191161
impl_variant_traits!(Vector2i, vector2i_to_variant, vector2i_from_variant, Vector2i);
192162
impl_variant_traits!(Vector3i, vector3i_to_variant, vector3i_from_variant, Vector3i);
193163
impl_variant_traits!(Quaternion, quaternion_to_variant, quaternion_from_variant, Quaternion);
194164
impl_variant_traits!(Color, color_to_variant, color_from_variant, Color);
195-
impl_variant_traits!(GodotString, string_to_variant, string_from_variant, String, init);
165+
impl_variant_traits!(GodotString, string_to_variant, string_from_variant, String);
196166
impl_variant_traits!(StringName, string_name_to_variant, string_name_from_variant, StringName);
197167
impl_variant_traits!(NodePath, node_path_to_variant, node_path_from_variant, NodePath);
198168
// TODO use impl_variant_traits!, as soon as `Default` is available. Also consider auto-generating.
199169
impl_variant_metadata!(Signal, /* signal_to_variant, signal_from_variant, */ Signal);
200-
impl_variant_traits!(PackedByteArray, packed_byte_array_to_variant, packed_byte_array_from_variant, PackedByteArray, init);
201-
impl_variant_traits!(PackedInt32Array, packed_int32_array_to_variant, packed_int32_array_from_variant, PackedInt32Array, init);
202-
impl_variant_traits!(PackedInt64Array, packed_int64_array_to_variant, packed_int64_array_from_variant, PackedInt64Array, init);
203-
impl_variant_traits!(PackedFloat32Array, packed_float32_array_to_variant, packed_float32_array_from_variant, PackedFloat32Array, init);
204-
impl_variant_traits!(PackedFloat64Array, packed_float64_array_to_variant, packed_float64_array_from_variant, PackedFloat64Array, init);
205-
impl_variant_traits!(PackedStringArray, packed_string_array_to_variant, packed_string_array_from_variant, PackedStringArray, init);
206-
impl_variant_traits!(PackedVector2Array, packed_vector2_array_to_variant, packed_vector2_array_from_variant, PackedVector2Array, init);
207-
impl_variant_traits!(PackedVector3Array, packed_vector3_array_to_variant, packed_vector3_array_from_variant, PackedVector3Array, init);
208-
impl_variant_traits!(PackedColorArray, packed_color_array_to_variant, packed_color_array_from_variant, PackedColorArray, init);
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);
209179
impl_variant_traits!(Plane, plane_to_variant, plane_from_variant, Plane);
210180
impl_variant_traits!(Projection, projection_to_variant, projection_from_variant, Projection);
211181
impl_variant_traits!(Rid, rid_to_variant, rid_from_variant, Rid);
@@ -215,7 +185,7 @@ mod impls {
215185
impl_variant_traits!(Transform3D, transform_3d_to_variant, transform_3d_from_variant, Transform3D);
216186
impl_variant_traits!(Dictionary, dictionary_to_variant, dictionary_from_variant, Dictionary);
217187

218-
impl_variant_traits!(i64, int_to_variant, int_from_variant, Int, metadata = GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64);
188+
impl_variant_traits!(i64, int_to_variant, int_from_variant, Int, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64);
219189
impl_variant_traits_int!(i8, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8);
220190
impl_variant_traits_int!(i16, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16);
221191
impl_variant_traits_int!(i32, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32);
@@ -225,7 +195,7 @@ mod impls {
225195
impl_variant_traits_int!(u32, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32);
226196
// u64 is not supported, because it cannot be represented on GDScript side, and implicitly converting to i64 is error-prone.
227197

228-
impl_variant_traits!(f64, float_to_variant, float_from_variant, Float, metadata = GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE);
198+
impl_variant_traits!(f64, float_to_variant, float_from_variant, Float, GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE);
229199
impl_variant_traits_float!(f32, GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT);
230200
}
231201

godot-core/src/builtin/variant/mod.rs

+31-47
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,8 @@ impl Variant {
108108
let args_sys: Vec<_> = args.iter().map(|v| v.var_sys_const()).collect();
109109
let mut error = sys::default_call_error();
110110

111-
// #[cfg(gdextension_api = "4.0")]
112-
// let result = {
113-
// #[allow(unused_mut)]
114-
// let mut result = Variant::nil();
115-
//
116-
// use sys::AsUninit;
117-
// unsafe {
118-
// interface_fn!(variant_call)(
119-
// self.var_sys(),
120-
// method.string_sys(),
121-
// args_sys.as_ptr(),
122-
// args_sys.len() as i64,
123-
// result.var_sys().as_uninit(),
124-
// ptr::addr_of_mut!(error),
125-
// )
126-
// };
127-
// result
128-
// };
129-
//
130-
// #[cfg(not(gdextension_api = "4.0"))]
131111
let result = unsafe {
132-
Variant::from_var_sys_init(|variant_ptr| {
112+
Variant::from_var_sys_init_or_init_default(|variant_ptr| {
133113
interface_fn!(variant_call)(
134114
self.var_sys(),
135115
method.string_sys(),
@@ -152,24 +132,8 @@ impl Variant {
152132
let op_sys = op.sys();
153133
let mut is_valid = false as u8;
154134

155-
#[cfg(gdextension_api = "4.0")]
156-
let result = {
157-
#[allow(unused_mut)]
158-
let mut result = Variant::nil();
159-
unsafe {
160-
interface_fn!(variant_evaluate)(
161-
op_sys,
162-
self.var_sys(),
163-
rhs.var_sys(),
164-
result.var_sys(),
165-
ptr::addr_of_mut!(is_valid),
166-
)
167-
};
168-
result
169-
};
170-
#[cfg(not(gdextension_api = "4.0"))]
171135
let result = unsafe {
172-
Variant::from_var_sys_init(|variant_ptr| {
136+
Self::from_var_sys_init_or_init_default(|variant_ptr| {
173137
interface_fn!(variant_evaluate)(
174138
op_sys,
175139
self.var_sys(),
@@ -230,15 +194,35 @@ impl Variant {
230194
fn var_sys = sys;
231195
}
232196

233-
// #[doc(hidden)]
234-
// pub unsafe fn from_var_sys_init_default(
235-
// init_fn: impl FnOnce(sys::GDExtensionVariantPtr),
236-
// ) -> Self {
237-
// #[allow(unused_mut)]
238-
// let mut variant = Variant::nil();
239-
// init_fn(variant.var_sys());
240-
// variant
241-
// }
197+
#[doc(hidden)]
198+
pub unsafe fn from_var_sys_init_default(
199+
init_fn: impl FnOnce(sys::GDExtensionVariantPtr),
200+
) -> Self {
201+
#[allow(unused_mut)]
202+
let mut variant = Variant::nil();
203+
init_fn(variant.var_sys());
204+
variant
205+
}
206+
207+
/// # Safety
208+
///
209+
/// See [`GodotFfi::from_sys_init`] and [`GodotFfi::from_sys_init_default`].
210+
#[cfg(gdextension_api = "4.0")]
211+
pub unsafe fn from_var_sys_init_or_init_default(
212+
init_fn: impl FnOnce(sys::GDExtensionVariantPtr),
213+
) -> Self {
214+
Self::from_var_sys_init_default(init_fn)
215+
}
216+
217+
/// # Safety
218+
///
219+
/// See [`GodotFfi::from_sys_init`] and [`GodotFfi::from_sys_init_default`].
220+
#[cfg(not(gdextension_api = "4.0"))]
221+
pub unsafe fn from_var_sys_init_or_init_default(
222+
init_fn: impl FnOnce(sys::GDExtensionUninitializedVariantPtr),
223+
) -> Self {
224+
Self::from_var_sys_init(init_fn)
225+
}
242226

243227
#[doc(hidden)]
244228
pub fn var_sys_const(&self) -> sys::GDExtensionConstVariantPtr {

0 commit comments

Comments
 (0)