@@ -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.
692694int 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 ;
0 commit comments