Skip to content

Commit c805a2e

Browse files
committed
Revert OnceString addition
After checking Godot memory leaks (with --verbose), it turns out all that ceremony is not needed, and StringName instances are copied upon passing to FFI. This reverts commit 6419ab4.
1 parent d7e6135 commit c805a2e

File tree

12 files changed

+42
-141
lines changed

12 files changed

+42
-141
lines changed

godot-codegen/src/class_generator.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ fn make_constructor(class: &Class, ctx: &Context, class_name_str: &Literal) -> T
6969
quote! {
7070
pub fn singleton() -> Gd<Self> {
7171
unsafe {
72-
let class_name = OnceString::new(#class_name_str);
73-
let object_ptr = sys::interface_fn!(global_get_singleton)(class_name.leak_sys());
72+
let class_name = StringName::from(#class_name_str);
73+
let object_ptr = sys::interface_fn!(global_get_singleton)(class_name.string_sys());
7474
Gd::from_obj_sys(object_ptr)
7575
}
7676
}
@@ -83,8 +83,8 @@ fn make_constructor(class: &Class, ctx: &Context, class_name_str: &Literal) -> T
8383
quote! {
8484
pub fn new() -> Gd<Self> {
8585
unsafe {
86-
let class_name = OnceString::new(#class_name_str);
87-
let object_ptr = sys::interface_fn!(classdb_construct_object)(class_name.leak_sys());
86+
let class_name = StringName::from(#class_name_str);
87+
let object_ptr = sys::interface_fn!(classdb_construct_object)(class_name.string_sys());
8888
//let instance = Self { object_ptr };
8989
Gd::from_obj_sys(object_ptr)
9090
}
@@ -96,8 +96,8 @@ fn make_constructor(class: &Class, ctx: &Context, class_name_str: &Literal) -> T
9696
#[must_use]
9797
pub fn new_alloc() -> Gd<Self> {
9898
unsafe {
99-
let class_name = OnceString::new(#class_name_str);
100-
let object_ptr = sys::interface_fn!(classdb_construct_object)(class_name.leak_sys());
99+
let class_name = StringName::from(#class_name_str);
100+
let object_ptr = sys::interface_fn!(classdb_construct_object)(class_name.string_sys());
101101
Gd::from_obj_sys(object_ptr)
102102
}
103103
}
@@ -392,11 +392,11 @@ fn make_method_definition(method: &Method, class_name: &str, ctx: &mut Context)
392392
quote! {
393393
#vis fn #method_name( #receiver #(, #params )*, varargs: &[Variant]) #return_decl {
394394
unsafe {
395-
let class_name = OnceString::new(#class_name);
396-
let method_name = OnceString::new(#method_name_str);
395+
let class_name = StringName::from(#class_name);
396+
let method_name = StringName::from(#method_name_str);
397397
let method_bind = sys::interface_fn!(classdb_get_method_bind)(
398-
class_name.leak_sys(),
399-
method_name.leak_sys(),
398+
class_name.string_sys(),
399+
method_name.string_sys(),
400400
#hash
401401
);
402402
let call_fn = sys::interface_fn!(object_method_bind_call);
@@ -419,11 +419,11 @@ fn make_method_definition(method: &Method, class_name: &str, ctx: &mut Context)
419419
quote! {
420420
#vis fn #method_name( #receiver, #( #params ),* ) #return_decl {
421421
unsafe {
422-
let class_name = OnceString::new(#class_name);
423-
let method_name = OnceString::new(#method_name_str);
422+
let class_name = StringName::from(#class_name);
423+
let method_name = StringName::from(#method_name_str);
424424
let method_bind = sys::interface_fn!(classdb_get_method_bind)(
425-
class_name.leak_sys(),
426-
method_name.leak_sys(),
425+
class_name.string_sys(),
426+
method_name.string_sys(),
427427
#hash
428428
);
429429
let call_fn = sys::interface_fn!(object_method_bind_ptrcall);
@@ -461,8 +461,8 @@ pub(crate) fn make_function_definition(
461461
quote! {
462462
pub fn #function_name( #( #params ),* ) #return_decl {
463463
let result = unsafe {
464-
let function_name = OnceString::new(#function_name_str);
465-
let call_fn = sys::interface_fn!(variant_get_ptr_utility_function)(function_name.leak_sys(), #hash);
464+
let function_name = StringName::from(#function_name_str);
465+
let call_fn = sys::interface_fn!(variant_get_ptr_utility_function)(function_name.string_sys(), #hash);
466466
let call_fn = call_fn.unwrap_unchecked();
467467

468468
let args = [

godot-core/src/builtin/meta/class_name.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ impl ClassName {
3535
pub fn string_sys(&self) -> sys::GDNativeStringNamePtr {
3636
self.backing.string_sys()
3737
}
38-
39-
pub(crate) fn into_once(self) -> OnceString {
40-
OnceString::from_owned(self.backing)
41-
}
4238
}
4339

4440
impl Display for ClassName {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
*/
66

77
mod class_name;
8-
mod once_string;
98
mod signature;
109

1110
pub use class_name::*;
12-
pub use once_string::*;
1311
pub use signature::*;
1412

1513
use crate::builtin::*;

godot-core/src/builtin/meta/once_string.rs

Lines changed: 0 additions & 95 deletions
This file was deleted.

godot-core/src/builtin/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,3 @@ pub use variant::*;
3131
pub use vector2::*;
3232
pub use vector3::*;
3333
pub use vector4::*;
34-
35-
pub use meta::OnceString;

godot-core/src/builtin/node_path.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/*
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this
4+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
5+
*/
6+
17
use crate::builtin::GodotString;
28
use godot_ffi as sys;
39
use godot_ffi::{ffi_methods, GodotFfi};

godot-core/src/builtin/string.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ impl fmt::Debug for GodotString {
146146
}
147147
}
148148

149-
150149
// While this is a nice optimisation for ptrcalls, it's not easily possible
151150
// to pass in &GodotString when doing varcalls.
152151
/*

godot-core/src/log.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ macro_rules! godot_print {
6969

7070
pub use crate::{godot_error, godot_print, godot_script_error, godot_warn};
7171

72-
use crate::builtin::{OnceString, Variant};
72+
use crate::builtin::{StringName, Variant};
7373
use crate::sys::{self, GodotFfi};
7474

7575
pub fn print(varargs: &[Variant]) {
7676
unsafe {
77-
let method_name = OnceString::new("print");
77+
let method_name = StringName::from("print");
7878
let call_fn = sys::interface_fn!(variant_get_ptr_utility_function)(
79-
method_name.leak_sys(),
79+
method_name.string_sys(),
8080
2648703342i64,
8181
);
8282
let call_fn = call_fn.unwrap_unchecked();

godot-core/src/macros.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,14 @@ macro_rules! gdext_register_method_inner {
149149
let mut arguments_metadata: [sys::GDNativeExtensionClassMethodArgumentMetadata; NUM_ARGS]
150150
= std::array::from_fn(|i| Sig::param_metadata(i as i32));
151151

152-
let class_name = OnceString::new(stringify!($Class));
153-
let method_name = OnceString::new(stringify!($method_name));
152+
let class_name = StringName::from(stringify!($Class));
153+
let method_name = StringName::from(stringify!($method_name));
154154

155155
// println!("REG {class_name}::{method_name}");
156156
// println!(" ret {return_value_info:?}");
157157

158158
let method_info = sys::GDNativeExtensionClassMethodInfo {
159-
name: method_name.leak_sys(),
159+
name: method_name.string_sys(),
160160
method_userdata: std::ptr::null_mut(),
161161
call_func: Some(varcall_func),
162162
ptrcall_func: Some(ptrcall_func),
@@ -174,7 +174,7 @@ macro_rules! gdext_register_method_inner {
174174
$crate::out!(" Register fn: {}::{}", stringify!($Class), stringify!($method_name));
175175
sys::interface_fn!(classdb_register_extension_class_method)(
176176
sys::get_library(),
177-
class_name.leak_sys(),
177+
class_name.string_sys(),
178178
std::ptr::addr_of!(method_info),
179179
);
180180

godot-core/src/obj/gd.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ impl<T: GodotClass> Gd<T> {
331331
where
332332
U: GodotClass,
333333
{
334-
let class_name = ClassName::new::<U>().into_once();
335-
let class_tag = interface_fn!(classdb_get_class_tag)(class_name.leak_sys());
334+
let class_name = ClassName::new::<U>();
335+
let class_tag = interface_fn!(classdb_get_class_tag)(class_name.string_sys());
336336
let cast_object_ptr = interface_fn!(object_cast_to)(self.obj_sys(), class_tag);
337337

338338
if cast_object_ptr.is_null() {

godot-core/src/registry.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,17 +221,16 @@ fn fill_into<T>(dst: &mut Option<T>, src: Option<T>) {
221221
fn register_class_raw(info: ClassRegistrationInfo) {
222222
// First register class...
223223

224-
let class_name = info.class_name.into_once();
224+
let class_name = info.class_name;
225225
let parent_class_name = info
226226
.parent_class_name
227-
.expect("class defined (parent_class_name)")
228-
.into_once();
227+
.expect("class defined (parent_class_name)");
229228

230229
unsafe {
231230
interface_fn!(classdb_register_extension_class)(
232231
sys::get_library(),
233-
class_name.leak_sys(),
234-
parent_class_name.leak_sys(),
232+
class_name.string_sys(),
233+
parent_class_name.string_sys(),
235234
ptr::addr_of!(info.godot_params),
236235
);
237236
}
@@ -272,13 +271,13 @@ pub mod callbacks {
272271
T: GodotClass,
273272
F: FnOnce(Base<T::Base>) -> T,
274273
{
275-
let class_name = ClassName::new::<T>().into_once();
276-
let base_class_name = ClassName::new::<T::Base>().into_once();
274+
let class_name = ClassName::new::<T>();
275+
let base_class_name = ClassName::new::<T::Base>();
277276

278277
//out!("create callback: {}", class_name.backing);
279278

280279
let base_ptr =
281-
unsafe { interface_fn!(classdb_construct_object)(base_class_name.leak_sys()) };
280+
unsafe { interface_fn!(classdb_construct_object)(base_class_name.string_sys()) };
282281
let base = unsafe { Base::from_sys(base_ptr) };
283282

284283
let user_instance = make_user_instance(base);
@@ -288,7 +287,7 @@ pub mod callbacks {
288287

289288
let binding_data_callbacks = crate::storage::nop_instance_callbacks();
290289
unsafe {
291-
interface_fn!(object_set_instance)(base_ptr, class_name.leak_sys(), instance_ptr);
290+
interface_fn!(object_set_instance)(base_ptr, class_name.string_sys(), instance_ptr);
292291
interface_fn!(object_set_instance_binding)(
293292
base_ptr,
294293
sys::get_library(),

godot-macros/src/godot_api.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ fn transform_inherent_impl(mut decl: Impl) -> Result<TokenStream, Error> {
8585
)*
8686

8787
unsafe {
88-
let class_name = ::godot::builtin::OnceString::new(#class_name_str);
88+
let class_name = ::godot::builtin::StringName::from(#class_name_str);
8989
use ::godot::sys;
9090
#(
9191
let signal_name = ::godot::builtin::StringName::new(#signal_name_strs);
9292
sys::interface_fn!(classdb_register_extension_class_signal)(
9393
sys::get_library(),
94-
class_name.leak_sys(),
95-
signal_name.leak_sys(),
94+
class_name.string_sys(),
95+
signal_name.string_sys(),
9696
std::ptr::null(), // NULL only valid for zero parameters, in current impl; maybe better empty slice
9797
0,
9898
);

0 commit comments

Comments
 (0)