Skip to content

Commit ea444a7

Browse files
committed
Fix Lua/node memory issues
1 parent e3c9ba1 commit ea444a7

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

src/plugins/lua/src/lua_scripting.cpp

+38-14
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "lua_error.h"
1111
#include "lua_object.h"
1212
#include "lua_script.h"
13+
#include <cstring>
1314
#include <memory>
1415
#include <string>
1516
#include <string_view>
@@ -25,8 +26,15 @@ using Growl::Result;
2526
using Growl::Script;
2627
using Growl::ScriptingAPI;
2728
using Growl::ScriptingParam;
29+
using Growl::ScriptingType;
2830
using Growl::SystemAPI;
2931

32+
struct ScriptingSigLua {
33+
ScriptingType return_type;
34+
ScriptingType* args;
35+
int n_args;
36+
};
37+
3038
// return not actually used
3139
int checkArgMetatable(lua_State* state, int arg, const char* metatable) {
3240
luaL_checktype(state, arg, LUA_TTABLE);
@@ -201,9 +209,17 @@ Error LuaScriptingAPI::addConstructorToClass(
201209

202210
lua_pushlightuserdata(this->state, reinterpret_cast<void*>(fn));
203211
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));
207223
lua_pushstring(this->state, metatable_name.c_str());
208224
lua_pushcclosure(
209225
this->state,
@@ -212,13 +228,13 @@ Error LuaScriptingAPI::addConstructorToClass(
212228
const_cast<void*>(lua_topointer(state, lua_upvalueindex(1))));
213229
void* ctx =
214230
const_cast<void*>(lua_topointer(state, lua_upvalueindex(2)));
215-
ScriptingSignature* signature = static_cast<ScriptingSignature*>(
231+
ScriptingSigLua* signature = static_cast<ScriptingSigLua*>(
216232
lua_touserdata(state, lua_upvalueindex(3)));
217233
const char* metatable_name =
218234
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]) {
222238
case ScriptingType::String:
223239
luaL_checktype(state, i + 1, LUA_TSTRING);
224240
args[i] = std::string{lua_tostring(state, i + 1)};
@@ -280,9 +296,17 @@ Error LuaScriptingAPI::addMethodToClass(
280296
lua_pushstring(this->state, method_name.c_str());
281297
lua_pushlightuserdata(this->state, reinterpret_cast<void*>(fn));
282298
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));
286310
lua_pushinteger(this->state, stack_offset);
287311
lua_pushcclosure(
288312
this->state,
@@ -291,12 +315,12 @@ Error LuaScriptingAPI::addMethodToClass(
291315
const_cast<void*>(lua_topointer(state, lua_upvalueindex(1))));
292316
void* ctx =
293317
const_cast<void*>(lua_topointer(state, lua_upvalueindex(2)));
294-
ScriptingSignature* signature = static_cast<ScriptingSignature*>(
318+
ScriptingSigLua* signature = static_cast<ScriptingSigLua*>(
295319
lua_touserdata(state, lua_upvalueindex(3)));
296320
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]) {
300324
case ScriptingType::String:
301325
luaL_checktype(state, i + stack_offset, LUA_TSTRING);
302326
args[i] =

src/scene/include/growl/scene/node.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class Node : public InputProcessor {
4646
API* api;
4747
std::unique_ptr<Script> script;
4848
std::string label;
49-
Node* parent;
49+
Node* parent = nullptr;
5050
float x = 0;
5151
float y = 0;
5252
float w = 0;

0 commit comments

Comments
 (0)