10
10
#include " lua_error.h"
11
11
#include " lua_object.h"
12
12
#include " lua_script.h"
13
+ #include < cstring>
13
14
#include < memory>
14
15
#include < string>
15
16
#include < string_view>
@@ -25,8 +26,15 @@ using Growl::Result;
25
26
using Growl::Script;
26
27
using Growl::ScriptingAPI;
27
28
using Growl::ScriptingParam;
29
+ using Growl::ScriptingType;
28
30
using Growl::SystemAPI;
29
31
32
+ struct ScriptingSigLua {
33
+ ScriptingType return_type;
34
+ ScriptingType* args;
35
+ int n_args;
36
+ };
37
+
30
38
// return not actually used
31
39
int checkArgMetatable (lua_State* state, int arg, const char * metatable) {
32
40
luaL_checktype (state, arg, LUA_TTABLE);
@@ -201,9 +209,17 @@ Error LuaScriptingAPI::addConstructorToClass(
201
209
202
210
lua_pushlightuserdata (this ->state , reinterpret_cast <void *>(fn));
203
211
lua_pushlightuserdata (this ->state , context);
204
- ScriptingSignature* sig = static_cast <ScriptingSignature*>(
205
- lua_newuserdata (this ->state , sizeof (signature)));
206
- *sig = signature;
212
+ void * buf = lua_newuserdata (
213
+ this ->state , sizeof (ScriptingSigLua) +
214
+ sizeof (ScriptingParam) * signature.arg_types .size ());
215
+ ScriptingSigLua* sig = new (buf) ScriptingSigLua ();
216
+ sig->return_type = signature.return_type ;
217
+ sig->n_args = signature.arg_types .size ();
218
+ sig->args = reinterpret_cast <ScriptingType*>(
219
+ static_cast <ScriptingSigLua*>(buf) + 1 );
220
+ std::memcpy (
221
+ sig->args , signature.arg_types .data (),
222
+ signature.arg_types .size () * sizeof (ScriptingType));
207
223
lua_pushstring (this ->state , metatable_name.c_str ());
208
224
lua_pushcclosure (
209
225
this ->state ,
@@ -212,13 +228,13 @@ Error LuaScriptingAPI::addConstructorToClass(
212
228
const_cast <void *>(lua_topointer (state, lua_upvalueindex (1 ))));
213
229
void * ctx =
214
230
const_cast <void *>(lua_topointer (state, lua_upvalueindex (2 )));
215
- ScriptingSignature * signature = static_cast <ScriptingSignature *>(
231
+ ScriptingSigLua * signature = static_cast <ScriptingSigLua *>(
216
232
lua_touserdata (state, lua_upvalueindex (3 )));
217
233
const char * metatable_name =
218
234
lua_tostring (state, lua_upvalueindex (4 ));
219
- std::vector<ScriptingParam> args (signature->arg_types . size () );
220
- for (size_t i = 0 ; i < signature->arg_types . size () ; i++) {
221
- switch (signature->arg_types [i]) {
235
+ std::vector<ScriptingParam> args (signature->n_args );
236
+ for (int i = 0 ; i < signature->n_args ; i++) {
237
+ switch (signature->args [i]) {
222
238
case ScriptingType::String:
223
239
luaL_checktype (state, i + 1 , LUA_TSTRING);
224
240
args[i] = std::string{lua_tostring (state, i + 1 )};
@@ -280,9 +296,17 @@ Error LuaScriptingAPI::addMethodToClass(
280
296
lua_pushstring (this ->state , method_name.c_str ());
281
297
lua_pushlightuserdata (this ->state , reinterpret_cast <void *>(fn));
282
298
lua_pushlightuserdata (this ->state , context);
283
- ScriptingSignature* sig = static_cast <ScriptingSignature*>(
284
- lua_newuserdata (this ->state , sizeof (signature)));
285
- *sig = signature;
299
+ void * buf = lua_newuserdata (
300
+ this ->state , sizeof (ScriptingSigLua) +
301
+ sizeof (ScriptingParam) * signature.arg_types .size ());
302
+ ScriptingSigLua* sig = new (buf) ScriptingSigLua ();
303
+ sig->return_type = signature.return_type ;
304
+ sig->n_args = signature.arg_types .size ();
305
+ sig->args = reinterpret_cast <ScriptingType*>(
306
+ static_cast <ScriptingSigLua*>(buf) + 1 );
307
+ std::memcpy (
308
+ sig->args , signature.arg_types .data (),
309
+ signature.arg_types .size () * sizeof (ScriptingType));
286
310
lua_pushinteger (this ->state , stack_offset);
287
311
lua_pushcclosure (
288
312
this ->state ,
@@ -291,12 +315,12 @@ Error LuaScriptingAPI::addMethodToClass(
291
315
const_cast <void *>(lua_topointer (state, lua_upvalueindex (1 ))));
292
316
void * ctx =
293
317
const_cast <void *>(lua_topointer (state, lua_upvalueindex (2 )));
294
- ScriptingSignature * signature = static_cast <ScriptingSignature *>(
318
+ ScriptingSigLua * signature = static_cast <ScriptingSigLua *>(
295
319
lua_touserdata (state, lua_upvalueindex (3 )));
296
320
int stack_offset = lua_tointeger (state, lua_upvalueindex (4 ));
297
- std::vector<ScriptingParam> args (signature->arg_types . size () );
298
- for (size_t i = 0 ; i < signature->arg_types . size () ; i++) {
299
- switch (signature->arg_types [i]) {
321
+ std::vector<ScriptingParam> args (signature->n_args );
322
+ for (int i = 0 ; i < signature->n_args ; i++) {
323
+ switch (signature->args [i]) {
300
324
case ScriptingType::String:
301
325
luaL_checktype (state, i + stack_offset, LUA_TSTRING);
302
326
args[i] =
0 commit comments