@@ -38,185 +38,15 @@ use std::marker::PhantomData;
3838use std:: ptr;
3939
4040use crate :: core_types:: { GodotString , Variant } ;
41- use crate :: export:: user_data:: UserData ;
4241use crate :: export:: * ;
43- use crate :: object:: { GodotObject , NewRef , RawObject , TRef } ;
42+ use crate :: object:: NewRef ;
4443use crate :: private:: get_api;
4544
46- /// A handle that can register new classes to the engine during initialization.
47- ///
48- /// See [`godot_nativescript_init`](macro.godot_nativescript_init.html) and
49- /// [`godot_init`](macro.godot_init.html).
50- #[ derive( Copy , Clone ) ]
51- pub struct InitHandle {
52- #[ doc( hidden) ]
53- handle : * mut libc:: c_void ,
54- }
55-
56- impl InitHandle {
57- #[ doc( hidden) ]
58- #[ inline]
59- pub unsafe fn new ( handle : * mut libc:: c_void ) -> Self {
60- InitHandle { handle }
61- }
62-
63- /// Registers a new class to the engine.
64- #[ inline]
65- pub fn add_class < C > ( self )
66- where
67- C : NativeClassMethods ,
68- {
69- self . add_maybe_tool_class :: < C > ( false )
70- }
71-
72- /// Registers a new tool class to the engine.
73- #[ inline]
74- pub fn add_tool_class < C > ( self )
75- where
76- C : NativeClassMethods ,
77- {
78- self . add_maybe_tool_class :: < C > ( true )
79- }
80-
81- #[ inline]
82- fn add_maybe_tool_class < C > ( self , is_tool : bool )
83- where
84- C : NativeClassMethods ,
85- {
86- if !class_registry:: register_class :: < C > ( ) {
87- panic ! (
88- "`{type_name}` has already been registered" ,
89- type_name = std:: any:: type_name:: <C >( )
90- ) ;
91- }
92- unsafe {
93- let class_name = CString :: new ( C :: class_name ( ) ) . unwrap ( ) ;
94- let base_name = CString :: new ( C :: Base :: class_name ( ) ) . unwrap ( ) ;
95-
96- let create = {
97- unsafe extern "C" fn constructor < C : NativeClass > (
98- this : * mut sys:: godot_object ,
99- _method_data : * mut libc:: c_void ,
100- ) -> * mut libc:: c_void {
101- use std:: panic:: { self , AssertUnwindSafe } ;
102-
103- let this = match ptr:: NonNull :: new ( this) {
104- Some ( this) => this,
105- None => {
106- godot_error ! (
107- "gdnative-core: error constructing {}: owner pointer is null" ,
108- C :: class_name( ) ,
109- ) ;
110-
111- return ptr:: null_mut ( ) ;
112- }
113- } ;
114-
115- let owner = match RawObject :: < C :: Base > :: try_from_sys_ref ( this) {
116- Some ( owner) => owner,
117- None => {
118- godot_error ! (
119- "gdnative-core: error constructing {}: incompatible owner type, expecting {}" ,
120- C :: class_name( ) ,
121- C :: Base :: class_name( ) ,
122- ) ;
123- return ptr:: null_mut ( ) ;
124- }
125- } ;
126-
127- let val = match panic:: catch_unwind ( AssertUnwindSafe ( || {
128- emplace:: take ( )
129- . unwrap_or_else ( || C :: init ( TRef :: new ( C :: Base :: cast_ref ( owner) ) ) )
130- } ) ) {
131- Ok ( val) => val,
132- Err ( _) => {
133- godot_error ! (
134- "gdnative-core: error constructing {}: constructor panicked" ,
135- C :: class_name( ) ,
136- ) ;
137- return ptr:: null_mut ( ) ;
138- }
139- } ;
140-
141- let wrapper = C :: UserData :: new ( val) ;
142- C :: UserData :: into_user_data ( wrapper) as * mut _
143- }
144-
145- sys:: godot_instance_create_func {
146- create_func : Some ( constructor :: < C > ) ,
147- method_data : ptr:: null_mut ( ) ,
148- free_func : None ,
149- }
150- } ;
151-
152- let destroy = {
153- unsafe extern "C" fn destructor < C : NativeClass > (
154- _this : * mut sys:: godot_object ,
155- _method_data : * mut libc:: c_void ,
156- user_data : * mut libc:: c_void ,
157- ) {
158- if user_data. is_null ( ) {
159- godot_error ! (
160- "gdnative-core: user data pointer for {} is null (did the constructor fail?)" ,
161- C :: class_name( ) ,
162- ) ;
163- return ;
164- }
165-
166- let wrapper = C :: UserData :: consume_user_data_unchecked ( user_data) ;
167- drop ( wrapper)
168- }
169-
170- sys:: godot_instance_destroy_func {
171- destroy_func : Some ( destructor :: < C > ) ,
172- method_data : ptr:: null_mut ( ) ,
173- free_func : None ,
174- }
175- } ;
176-
177- if is_tool {
178- ( get_api ( ) . godot_nativescript_register_tool_class ) (
179- self . handle as * mut _ ,
180- class_name. as_ptr ( ) as * const _ ,
181- base_name. as_ptr ( ) as * const _ ,
182- create,
183- destroy,
184- ) ;
185- } else {
186- ( get_api ( ) . godot_nativescript_register_class ) (
187- self . handle as * mut _ ,
188- class_name. as_ptr ( ) as * const _ ,
189- base_name. as_ptr ( ) as * const _ ,
190- create,
191- destroy,
192- ) ;
193- }
194-
195- ( get_api ( ) . godot_nativescript_set_type_tag ) (
196- self . handle as * mut _ ,
197- class_name. as_ptr ( ) as * const _ ,
198- crate :: export:: type_tag:: create :: < C > ( ) ,
199- ) ;
200-
201- let builder = ClassBuilder {
202- init_handle : self . handle ,
203- class_name,
204- _marker : PhantomData ,
205- } ;
206-
207- C :: register_properties ( & builder) ;
208-
209- // register methods
210- C :: register ( & builder) ;
211- }
212- }
213- }
214-
21545#[ derive( Debug ) ]
21646pub struct ClassBuilder < C > {
217- pub ( super ) init_handle : * mut libc:: c_void ,
218- pub ( super ) class_name : CString ,
219- _marker : PhantomData < C > ,
47+ pub ( crate ) init_handle : * mut libc:: c_void ,
48+ pub ( crate ) class_name : CString ,
49+ pub ( crate ) _marker : PhantomData < C > ,
22050}
22151
22252impl < C : NativeClass > ClassBuilder < C > {
0 commit comments