@@ -39,20 +39,21 @@ impl<'a> StringCache<'a> {
39
39
return box_to_sname_ptr ( opaque_box) ;
40
40
}
41
41
42
- let string_name_from_string = self . builtin_lifecycle . string_name_from_string ;
43
- let string_destroy = self . builtin_lifecycle . string_destroy ;
44
-
45
- let mut string = MaybeUninit :: < sys:: types:: OpaqueString > :: uninit ( ) ;
46
- let string_ptr = string. as_mut_ptr ( ) ;
47
-
48
42
let mut sname = MaybeUninit :: < sys:: types:: OpaqueStringName > :: uninit ( ) ;
49
43
let sname_ptr = sname. as_mut_ptr ( ) ;
50
44
51
- let opaque = unsafe {
45
+ // For Godot 4.0 and 4.1, construct StringName via String + conversion.
46
+ #[ cfg( before_api = "4.2" ) ]
47
+ unsafe {
52
48
let string_new_with_latin1_chars_and_len = self
53
49
. interface
54
50
. string_new_with_latin1_chars_and_len
55
51
. unwrap_unchecked ( ) ;
52
+ let string_name_from_string = self . builtin_lifecycle . string_name_from_string ;
53
+ let string_destroy = self . builtin_lifecycle . string_destroy ;
54
+
55
+ let mut string = MaybeUninit :: < sys:: types:: OpaqueString > :: uninit ( ) ;
56
+ let string_ptr = string. as_mut_ptr ( ) ;
56
57
57
58
// Construct String.
58
59
string_new_with_latin1_chars_and_len (
@@ -69,10 +70,27 @@ impl<'a> StringCache<'a> {
69
70
70
71
// Destroy String.
71
72
string_destroy ( string_type_ptr ( string_ptr) ) ;
73
+ }
72
74
73
- // Return StringName.
74
- sname. assume_init ( )
75
- } ;
75
+ // For Godot 4.2+, construct StringName directly from C string.
76
+ #[ cfg( since_api = "4.2" ) ]
77
+ unsafe {
78
+ let string_name_new_with_utf8_chars_and_len = self
79
+ . interface
80
+ . string_name_new_with_utf8_chars_and_len
81
+ . unwrap_unchecked ( ) ;
82
+
83
+ // Construct StringName from string (non-static, we only need them during the cache's lifetime).
84
+ // There is no _latin_*() variant that takes length, so we have to use _utf8_*() instead.
85
+ string_name_new_with_utf8_chars_and_len (
86
+ sname_uninit_ptr ( sname_ptr) ,
87
+ key. as_ptr ( ) as * const std:: os:: raw:: c_char ,
88
+ key. len ( ) as sys:: GDExtensionInt ,
89
+ ) ;
90
+ }
91
+
92
+ // Return StringName.
93
+ let opaque = unsafe { sname. assume_init ( ) } ;
76
94
77
95
let mut opaque_box = Box :: new ( opaque) ;
78
96
let sname_ptr = box_to_sname_ptr ( & mut opaque_box) ;
@@ -108,20 +126,30 @@ fn box_to_sname_ptr(
108
126
opaque_ptr as sys:: GDExtensionStringNamePtr
109
127
}
110
128
129
+ #[ cfg( before_api = "4.2" ) ]
111
130
unsafe fn string_type_ptr ( opaque_ptr : * mut sys:: types:: OpaqueString ) -> sys:: GDExtensionTypePtr {
112
131
ptr:: addr_of_mut!( * opaque_ptr) as sys:: GDExtensionTypePtr
113
132
}
114
133
134
+ #[ cfg( before_api = "4.2" ) ]
115
135
unsafe fn string_uninit_ptr (
116
136
opaque_ptr : * mut sys:: types:: OpaqueString ,
117
137
) -> sys:: GDExtensionUninitializedStringPtr {
118
138
ptr:: addr_of_mut!( * opaque_ptr) as sys:: GDExtensionUninitializedStringPtr
119
139
}
120
140
141
+ #[ cfg( since_api = "4.2" ) ]
142
+ unsafe fn sname_uninit_ptr (
143
+ opaque_ptr : * mut sys:: types:: OpaqueStringName ,
144
+ ) -> sys:: GDExtensionUninitializedStringNamePtr {
145
+ ptr:: addr_of_mut!( * opaque_ptr) as sys:: GDExtensionUninitializedStringNamePtr
146
+ }
147
+
121
148
unsafe fn sname_type_ptr ( opaque_ptr : * mut sys:: types:: OpaqueStringName ) -> sys:: GDExtensionTypePtr {
122
149
ptr:: addr_of_mut!( * opaque_ptr) as sys:: GDExtensionTypePtr
123
150
}
124
151
152
+ #[ cfg( before_api = "4.2" ) ]
125
153
unsafe fn sname_uninit_type_ptr (
126
154
opaque_ptr : * mut sys:: types:: OpaqueStringName ,
127
155
) -> sys:: GDExtensionUninitializedTypePtr {
0 commit comments