@@ -84,7 +84,9 @@ pluginscript_callbacks.wrap_callback = wrap_callback
84
84
-- void (*)(const godot_string *name, const godot_variant *value);
85
85
pluginscript_callbacks .language_add_global_constant = wrap_callback (function (name , value )
86
86
name = tostring (ffi_cast (' godot_string *' , name ))
87
+
87
88
lps_callstack :push (' add_global' , string_quote (name ))
89
+
88
90
_G [name ] = ffi_cast (' godot_variant *' , value ):unbox ()
89
91
end )
90
92
@@ -96,6 +98,7 @@ pluginscript_callbacks.script_init = wrap_callback(function(manifest, path, sour
96
98
err = ffi_cast (' godot_error *' , err )
97
99
98
100
lps_callstack :push (' script_load' , ' @' , string_quote (path ))
101
+
99
102
local script , err_message = loadstring (source , path )
100
103
if not script then
101
104
local line , msg = string_match (err_message , ERROR_LINE_MESSAGE_PATT )
@@ -115,6 +118,7 @@ pluginscript_callbacks.script_init = wrap_callback(function(manifest, path, sour
115
118
return
116
119
end
117
120
121
+ local base_class
118
122
local known_properties = {}
119
123
for k , v in pairs (script ) do
120
124
if k == ' class_name' then
@@ -130,7 +134,8 @@ pluginscript_callbacks.script_init = wrap_callback(function(manifest, path, sour
130
134
)
131
135
return
132
136
end
133
- manifest .base = ffi_gc (StringName (cls .class_name ), nil )
137
+ base_class = cls .class_name
138
+ manifest .base = ffi_gc (StringName (base_class ), nil )
134
139
elseif type (v ) == ' function' then
135
140
local method = method_to_dictionary (v )
136
141
method .name = String (k )
@@ -149,63 +154,70 @@ pluginscript_callbacks.script_init = wrap_callback(function(manifest, path, sour
149
154
manifest .properties :append (prop_dict )
150
155
end
151
156
end
152
- manifest .data = LuaScriptWrapper_new (path , known_properties , script )
157
+ manifest .data = LuaScriptWrapper_new (path , base_class , known_properties , script )
153
158
err [0 ] = Error .OK
154
159
end )
155
160
156
161
-- void (*)(godot_pluginscript_script_data *data);
157
162
pluginscript_callbacks .script_finish = wrap_callback (function (data )
158
163
local script = ffi_cast (' lps_lua_script *' , data )
164
+
159
165
lps_callstack :push (' script_finish' )
166
+
160
167
LuaScriptWrapper_destroy (script )
161
168
end )
162
169
163
- -- void (*)(godot_pluginscript_script_data *data, godot_object *owner);
164
- pluginscript_callbacks .instance_init = wrap_callback (function (data , owner )
170
+ -- void (*)(godot_pluginscript_script_data *data, godot_object *owner, void **result );
171
+ pluginscript_callbacks .instance_init = wrap_callback (function (data , owner , result )
165
172
local script = ffi_cast (' lps_lua_script *' , data )
166
173
owner = ffi_cast (' godot_object *' , owner )
174
+ result = ffi_cast (' lps_script_instance **' , result )
167
175
168
176
lps_callstack :push (' _init' , ' @' , string_quote (script .__path ))
169
- local instance = setmetatable ({
170
- __owner = owner ,
171
- __script = script ,
172
- }, ScriptInstance )
177
+
178
+ local instance = LuaScriptInstance_new (owner , script )
173
179
for name , prop in pairs (script .__properties ) do
174
180
if not prop .getter then
175
181
local property_initializer = property_initializer_for_type [prop .type ]
176
182
if property_initializer then
177
- rawset (instance , name , property_initializer (prop .default_value ))
183
+ instance : rawset (name , property_initializer (prop .default_value ))
178
184
end
179
185
end
180
186
end
181
187
local _init = script ._init
182
188
if _init then
183
189
_init (instance )
184
190
end
191
+ result [0 ] = instance
185
192
set_lua_instance (owner , instance )
186
193
end )
187
194
188
195
-- void (*)(godot_pluginscript_instance_data *data);
189
196
pluginscript_callbacks .instance_finish = wrap_callback (function (data )
197
+ local self = ffi_cast (' lps_script_instance *' , data )
198
+
190
199
lps_callstack :push (' finish' )
191
- set_lua_instance (data , nil )
200
+
201
+ set_lua_instance (self .__owner , nil )
202
+ LuaScriptInstance_destroy (self )
192
203
end )
193
204
194
205
-- godot_bool (*)(godot_pluginscript_instance_data *data, const godot_string *name, const godot_variant *value);
195
206
pluginscript_callbacks .instance_set_prop = wrap_callback (function (data , name , value )
196
- local self = get_lua_instance ( data )
207
+ local self = ffi_cast ( ' lps_script_instance * ' , data )
197
208
name = tostring (ffi_cast (' godot_string *' , name ))
198
209
value = ffi_cast (' godot_variant *' , value )
199
210
200
211
local script = self .__script
201
212
lps_callstack :push (' set' , string_quote (name ), ' @' , string_quote (script .__path ))
213
+
202
214
local prop = script .__properties [name ]
203
215
if prop then
204
216
local setter = prop .setter
205
217
if setter then
206
218
setter (self , value :unbox ())
207
219
else
208
- rawset (self , name , value :unbox ())
220
+ self : rawset (name , value :unbox ())
209
221
end
210
222
return true
211
223
else
@@ -219,20 +231,21 @@ end, false)
219
231
220
232
-- godot_bool (*)(godot_pluginscript_instance_data *data, const godot_string *name, godot_variant *ret);
221
233
pluginscript_callbacks .instance_get_prop = wrap_callback (function (data , name , ret )
222
- local self = get_lua_instance ( data )
234
+ local self = ffi_cast ( ' lps_script_instance * ' , data )
223
235
name = tostring (ffi_cast (' godot_string *' , name ))
224
236
ret = ffi_cast (' godot_variant *' , ret )
225
237
226
238
local script = self .__script
227
239
lps_callstack :push (' get' , string_quote (name ), ' @' , string_quote (script .__path ))
240
+
228
241
local prop = script .__properties [name ]
229
242
if prop then
230
243
local getter , value = prop .getter , nil
231
244
if getter then
232
245
value = getter (self )
233
246
else
234
247
-- Avoid infinite recursion from `self[name]`, since `__index` may call `Object:get`
235
- value = rawget (self , name )
248
+ value = self : rawget (name )
236
249
if value == nil then
237
250
value = prop .default_value
238
251
end
@@ -254,14 +267,15 @@ end, false)
254
267
255
268
-- void (*)(godot_pluginscript_instance_data *data, const godot_string_name *method, const godot_variant **args, int argcount, godot_variant *ret, godot_variant_call_error *error);
256
269
pluginscript_callbacks .instance_call_method = wrap_callback (function (data , name , args , argcount , ret , err )
257
- local self = get_lua_instance ( data )
270
+ local self = ffi_cast ( ' lps_script_instance * ' , data )
258
271
name = tostring (ffi_cast (' godot_string_name *' , name ))
259
272
args = ffi_cast (' godot_variant **' , args )
260
273
ret = ffi_cast (' godot_variant *' , ret )
261
274
err = ffi_cast (' godot_variant_call_error *' , err )
262
275
263
276
local script = self .__script
264
277
lps_callstack :push (' call' , name , ' @' , script .__path )
278
+
265
279
local method = script [name ]
266
280
if method ~= nil then
267
281
local args_table = {}
@@ -284,9 +298,11 @@ end)
284
298
285
299
-- void (*)(godot_pluginscript_instance_data *data, int notification);
286
300
pluginscript_callbacks .instance_notification = wrap_callback (function (data , what )
287
- local self = get_lua_instance (data )
301
+ local self = ffi_cast (' lps_script_instance *' , data )
302
+
288
303
local script = self .__script
289
304
lps_callstack :push (' _notification' , ' @' , script .__path )
305
+
290
306
local _notification = script ._notification
291
307
if _notification then
292
308
return _notification (self , what )
0 commit comments