Skip to content
This repository was archived by the owner on Dec 29, 2024. It is now read-only.

Commit 0b32618

Browse files
authored
Moved callp args off heap (#116)
1 parent ab968d3 commit 0b32618

4 files changed

Lines changed: 61 additions & 44 deletions

File tree

src/classes/luaCallableExtra.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ int LuaCallableExtra::call(lua_State *state) {
6868
RefCounted* OBJ = (RefCounted*) lua_touserdata(state, -1);
6969
lua_pop(state, 1);
7070

71-
int argc = lua_gettop(state)-1; // We subtract 1 becuase the LuaCallableExtra is counted
72-
int noneMulty = argc;
71+
int l_argc = lua_gettop(state)-1; // We subtract 1 becuase the LuaCallableExtra is counted
72+
int noneMulty = l_argc;
7373
LuaCallableExtra* func = (LuaCallableExtra*) LuaState::getVariant(state, 1, OBJ).operator Object*();
7474
if (func == nullptr) {
7575
LuaError* err = LuaError::newError("Error during LuaCallableExtra::call fun==null", LuaError::ERR_RUNTIME);
@@ -80,41 +80,44 @@ int LuaCallableExtra::call(lua_State *state) {
8080
if (func->isTuple)
8181
noneMulty=func->argc-1; // We subtract one becuase the tuple is countedA
8282

83-
Array p_args;
83+
Array args;
8484

8585
if (func->wantsRef)
86-
p_args.append(OBJ);
86+
args.append(OBJ);
8787

8888
int index = 2; // we start at 2 becuase the LuaCallableExtra is arg 1
8989
for (int i = 0; i < noneMulty; i++) {
90-
p_args.append(LuaState::getVariant(state, index++, OBJ));
90+
args.append(LuaState::getVariant(state, index++, OBJ));
9191
}
9292

9393
if (func->isTuple) {
9494
Array tupleArgs;
95-
for (int i = noneMulty; i < argc; i++) {
95+
for (int i = noneMulty; i < l_argc; i++) {
9696
tupleArgs.push_back(LuaState::getVariant(state, index++, OBJ));
9797
}
98-
p_args.append(LuaTuple::fromArray(tupleArgs));
98+
args.append(LuaTuple::fromArray(tupleArgs));
9999
}
100100

101-
const Variant **args = (const Variant**)alloca(sizeof(const Variant**) * p_args.size());
102-
for (int i = 0; i < p_args.size(); i++) {
103-
args[i] = &p_args[i];
101+
Vector<const Variant*> mem_args;
102+
mem_args.resize(args.size());
103+
for (int i = 0; i < args.size(); i++) {
104+
mem_args.write[i] = &args[i];
104105
}
105106

107+
const Variant **p_args = (const Variant **)mem_args.ptr();
108+
106109
Variant returned;
107110
#ifndef LAPI_GDEXTENSION
108111
Callable::CallError error;
109-
func->function.callp(args, p_args.size(), returned, error);
112+
func->function.callp(p_args, args.size(), returned, error);
110113
if (error.error != error.CALL_OK) {
111-
LuaError* err = LuaState::handleError(func->function.get_method(), error, args, argc);
114+
LuaError* err = LuaState::handleError(func->function.get_method(), error, p_args, args.size());
112115
lua_pushstring(state, err->getMessage().ascii().get_data());
113116
lua_error(state);
114117
return 0;
115118
}
116119
#else
117-
returned = func->function.callv(p_args);
120+
returned = func->function.callv(args);
118121
#endif
119122

120123
LuaState::pushVariant(state, returned);

src/classes/luaCallableExtra.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "core/core_bind.h"
77
#else
88
#include <godot_cpp/classes/ref.hpp>
9+
#include <godot_cpp/templates/vector.hpp>
910
#endif
1011

1112
#include <lua/lua.hpp>

src/luaState.cpp

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,8 @@ int LuaState::luaPrint(lua_State* state)
687687

688688
#ifndef LAPI_GDEXTENSION
689689

690+
#include <vector>
691+
690692
// Used as the __call metamethod for mt_Callable.
691693
// All exposed gdscript functions are called vis this method.
692694
int LuaState::luaCallableCall(lua_State* state) {
@@ -698,27 +700,32 @@ int LuaState::luaCallableCall(lua_State* state) {
698700
int argc = lua_gettop(state)-1; // We subtract 1 becuase the callable its self will be counted
699701
Callable callable = (Callable) LuaState::getVariant(state, 1, OBJ);
700702

701-
const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * argc);
703+
Array args;
704+
args.resize(argc);
705+
Vector<const Variant*> mem_args;
706+
mem_args.resize(argc);
707+
702708
int index = 2; // we start at 2, 1 is the callable
703709
for (int i = 0; i < argc; i++) {
704-
Variant* temp = memnew(Variant);
705-
*temp = LuaState::getVariant(state, index++, OBJ);
706-
if ((*temp).get_type() != Variant::Type::OBJECT) {
707-
if (LuaError* err = Object::cast_to<LuaError>(temp->operator Object*()); err != nullptr) {
710+
args[i] = LuaState::getVariant(state, index++, OBJ);
711+
if (args[i].get_type() != Variant::Type::OBJECT) {
712+
if (LuaError* err = Object::cast_to<LuaError>(args[i].operator Object*()); err != nullptr) {
708713
lua_pushstring(state, err->getMessage().ascii().get_data());
709714
lua_error(state);
710715
return 0;
711716
}
712717
}
713718

714-
args[i] = temp;
719+
mem_args.write[i] = &args[i];
715720
}
716721

722+
const Variant **p_args = (const Variant **)mem_args.ptr();
723+
717724
Variant returned;
718725
Callable::CallError error;
719-
callable.callp(args, argc, returned, error);
726+
callable.callp(p_args, argc, returned, error);
720727
if (error.error != error.CALL_OK) {
721-
LuaError* err = LuaState::handleError(callable.get_method(), error, args, argc);
728+
LuaError* err = LuaState::handleError(callable.get_method(), error, p_args, argc);
722729
lua_pushstring(state, err->getMessage().ascii().get_data());
723730
lua_error(state);
724731
return 0;
@@ -802,34 +809,37 @@ int LuaState::luaUserdataFuncCall(lua_State* state) {
802809
RefCounted* OBJ = (RefCounted*) lua_touserdata(state, -1);
803810
lua_pop(state, 1);
804811

805-
int argc = lua_gettop(state);
812+
Variant* obj = (Variant*)lua_touserdata(state, lua_upvalueindex(1));
813+
String fName = LuaState::getVariant(state, lua_upvalueindex(2), OBJ);
806814

807-
Array p_args;
808-
const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * argc);
809-
int index = 1;
815+
int argc = lua_gettop(state);
816+
Array args;
817+
args.resize(argc);
818+
Vector<const Variant*> mem_args;
819+
mem_args.resize(argc);
810820
for (int i = 0; i < argc; i++) {
811-
p_args.append(LuaState::getVariant(state, index++, OBJ));
812-
args[i] = &p_args[i];
821+
args[i] = LuaState::getVariant(state, i+1, OBJ);
822+
mem_args.write[i] = &args[i];
813823
}
814-
815-
Variant* obj = (Variant*)lua_touserdata(state, lua_upvalueindex(1));
816-
String fName = LuaState::getVariant(state, lua_upvalueindex(2), OBJ);
824+
825+
const Variant **p_args = (const Variant **)mem_args.ptr();
817826

818827
Variant returned;
819828
#ifndef LAPI_GDEXTENSION
820829
Callable::CallError error;
821-
obj->callp(fName.ascii().get_data(), args, argc, returned, error);
830+
obj->callp(fName.ascii().get_data(), p_args, argc, returned, error);
822831
if (error.error != error.CALL_OK) {
823-
LuaError* err = LuaState::handleError(fName, error, args, argc);
832+
print_line("error: " + String::num(error.error));
833+
LuaError* err = LuaState::handleError(fName, error, p_args, argc);
824834
lua_pushstring(state, err->getMessage().ascii().get_data());
825835
lua_error(state);
826836
return 0;
827837
}
828838
#else
829839
GDExtensionCallError error;
830-
obj->callp(fName.ascii().get_data(), args, argc, returned, error);
840+
obj->callp(fName.ascii().get_data(), p_args, argc, returned, error);
831841
if (error.error != GDEXTENSION_CALL_OK) {
832-
LuaError* err = LuaState::handleError(fName, error, args, argc);
842+
LuaError* err = LuaState::handleError(fName, error, p_args, argc);
833843
lua_pushstring(state, err->getMessage().ascii().get_data());
834844
lua_error(state);
835845
return 0;
@@ -864,21 +874,23 @@ void LuaCoroutine::luaHook(lua_State* state, lua_Debug* ar) {
864874
}
865875

866876
#ifndef LAPI_GDEXTENSION
867-
Array p_args;
868-
p_args.append(OBJ);
869-
p_args.append(ar->event);
870-
p_args.append(ar->currentline);
871-
872-
const Variant **args = (const Variant**)alloca(sizeof(const Variant**) * p_args.size());
873-
for (int i = 0; i < p_args.size(); i++) {
874-
args[i] = &p_args[i];
877+
Array args;
878+
args.append(OBJ);
879+
args.append(ar->event);
880+
args.append(ar->currentline);
881+
882+
const int argc = 3;
883+
const Variant *p_args[argc];
884+
for (int i = 0; i < argc; i++) {
885+
args[i] = LuaState::getVariant(state, i+1, OBJ);
886+
p_args[i] = &args[i];
875887
}
876888

877889
Variant returned;
878890
Callable::CallError error;
879-
hook.callp(args, p_args.size(), returned, error);
891+
hook.callp(p_args, argc, returned, error);
880892
if (error.error != error.CALL_OK) {
881-
LuaError* err = LuaState::handleError(hook.get_method(), error, args, p_args.size());
893+
LuaError* err = LuaState::handleError(hook.get_method(), error, p_args, argc);
882894
lua_pushstring(state, err->getMessage().ascii().get_data());
883895
lua_error(state);
884896
return;

src/luaState.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <godot_cpp/classes/ref.hpp>
1010
#include <classes/luaCallable.h>
1111
#include <godot_cpp/templates/vmap.hpp>
12+
#include <godot_cpp/templates/vector.hpp>
1213
#endif
1314

1415
#include <lua/lua.hpp>

0 commit comments

Comments
 (0)