11#include " luaState.h"
22#include " lua/lua.h"
3+
34#include < classes/luaAPI.h>
45#include < classes/luaCallableExtra.h>
56#include < classes/luaCoroutine.h>
910
1011void LuaState::setState (lua_State *L, LuaAPI *api, bool bindAPI) {
1112 this ->L = L;
12- this ->api = api;
1313 if (!bindAPI) {
1414 return ;
1515 }
@@ -152,7 +152,7 @@ bool LuaState::luaFunctionExists(String functionName) {
152152
153153// get a value at the given index and return as a variant
154154Variant LuaState::getVar (int index) const {
155- return getVariant (L, index, api );
155+ return getVariant (L, index);
156156}
157157
158158// Pull a global variant from Lua to GDScript
@@ -406,6 +406,10 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
406406 Array argBinds = callable.get_bound_arguments ();
407407 if (argBinds.size () == 1 ) {
408408 lua_rawgeti (state, LUA_REGISTRYINDEX, (int )argBinds[0 ]);
409+ lua_State *refState = callObj->getState ();
410+ if (refState != state) {
411+ lua_xmove (refState, state, 1 );
412+ }
409413 break ;
410414 }
411415 }
@@ -431,8 +435,9 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
431435}
432436
433437// gets a variant at a given index
434- Variant LuaState::getVariant (lua_State *state, int index, LuaAPI *api ) {
438+ Variant LuaState::getVariant (lua_State *state, int index) {
435439 Variant result;
440+
436441 int type = lua_type (state, index);
437442 switch (type) {
438443 case LUA_TSTRING:
@@ -465,7 +470,7 @@ Variant LuaState::getVariant(lua_State *state, int index, LuaAPI *api) {
465470#else
466471 lua_rawgeti (state, index, i);
467472#endif
468- array.push_back (getVariant (state, -1 , api ));
473+ array.push_back (getVariant (state, -1 ));
469474 lua_pop (state, 1 );
470475 }
471476 result = array;
@@ -475,8 +480,8 @@ Variant LuaState::getVariant(lua_State *state, int index, LuaAPI *api) {
475480 lua_pushnil (state); /* first key */
476481 Dictionary dict;
477482 while (lua_next (state, (index < 0 ) ? (index - 1 ) : (index)) != 0 ) {
478- Variant key = getVariant (state, -2 , api );
479- Variant value = getVariant (state, -1 , api );
483+ Variant key = getVariant (state, -2 );
484+ Variant value = getVariant (state, -1 );
480485 dict[key] = value;
481486 lua_pop (state, 1 );
482487 }
@@ -487,14 +492,14 @@ Variant LuaState::getVariant(lua_State *state, int index, LuaAPI *api) {
487492 lua_pushvalue (state, index);
488493 Array binds;
489494 binds.push_back (luaL_ref (state, LUA_REGISTRYINDEX));
490- result = Callable (api , " call_function_ref" ).bindv (binds);
495+ result = Callable (getAPI (state) , " call_function_ref" ).bindv (binds);
491496 break ;
492497 }
493498 case LUA_TTHREAD: {
494499 lua_State *tState = lua_tothread (state, index);
495500 Ref<LuaCoroutine> thread;
496501 thread.instantiate ();
497- thread->bindExisting (api , tState);
502+ thread->bindExisting (getAPI (state) , tState);
498503 result = thread;
499504 break ;
500505 }
@@ -691,10 +696,8 @@ int LuaState::luaPrint(lua_State *state) {
691696// Used as the __call metamethod for mt_Callable.
692697// All exposed gdscript functions are called vis this method.
693698int LuaState::luaCallableCall (lua_State *state) {
694- LuaAPI *api = getAPI (state);
695-
696699 int argc = lua_gettop (state) - 1 ; // We subtract 1 because the callable its self will be counted
697- Callable callable = (Callable)LuaState::getVariant (state, 1 , api );
700+ Callable callable = (Callable)LuaState::getVariant (state, 1 );
698701
699702 Array args;
700703 args.resize (argc);
@@ -703,7 +706,7 @@ int LuaState::luaCallableCall(lua_State *state) {
703706
704707 int index = 2 ; // we start at 2, 1 is the callable
705708 for (int i = 0 ; i < argc; i++) {
706- args[i] = LuaState::getVariant (state, index++, api );
709+ args[i] = LuaState::getVariant (state, index++);
707710 if (args[i].get_type () != Variant::Type::OBJECT) {
708711 if (LuaError *err = Object::cast_to<LuaError>(args[i].operator Object *()); err != nullptr ) {
709712 lua_pushstring (state, err->getMessage ().ascii ().get_data ());
@@ -752,15 +755,13 @@ int LuaState::luaCallableCall(lua_State *state) {
752755#else
753756
754757int LuaState::luaCallableCall (lua_State *state) {
755- LuaAPI *api = getAPI (state);
756-
757758 int argc = lua_gettop (state) - 1 ; // We subtract 1 because the callable its self will be counted
758- Callable callable = (Callable)LuaState::getVariant (state, 1 , api );
759+ Callable callable = (Callable)LuaState::getVariant (state, 1 );
759760
760761 Array args;
761762 int index = 2 ; // we start at 2, 1 is the callable
762763 for (int i = 0 ; i < argc; i++) {
763- Variant var = LuaState::getVariant (state, index++, api );
764+ Variant var = LuaState::getVariant (state, index++);
764765 if (var.get_type () == Variant::Type::OBJECT) {
765766 if (LuaError *err = dynamic_cast <LuaError *>(var.operator Object *()); err != nullptr ) {
766767 lua_pushstring (state, err->getMessage ().ascii ().get_data ());
@@ -797,18 +798,16 @@ int LuaState::luaCallableCall(lua_State *state) {
797798// This function is invoked whenever a function is called on one of the userdata types
798799// excluding mt_Callable or mt_Object if __index is overwritten
799800int LuaState::luaUserdataFuncCall (lua_State *state) {
800- LuaAPI *api = getAPI (state);
801-
802801 Variant *obj = (Variant *)lua_touserdata (state, lua_upvalueindex (1 ));
803- String fName = LuaState::getVariant (state, lua_upvalueindex (2 ), api );
802+ String fName = LuaState::getVariant (state, lua_upvalueindex (2 ));
804803
805804 int argc = lua_gettop (state);
806805 Array args;
807806 args.resize (argc);
808807 Vector<const Variant *> mem_args;
809808 mem_args.resize (argc);
810809 for (int i = 0 ; i < argc; i++) {
811- args[i] = LuaState::getVariant (state, i + 1 , api );
810+ args[i] = LuaState::getVariant (state, i + 1 );
812811 mem_args.write [i] = &args[i];
813812 }
814813
@@ -852,19 +851,17 @@ int LuaState::luaUserdataFuncCall(lua_State *state) {
852851}
853852
854853void LuaState::luaHook (lua_State *state, lua_Debug *ar) {
855- LuaAPI *api = getAPI (state);
856-
857854 lua_pushstring (state, " __HOOK" );
858855 lua_rawget (state, LUA_REGISTRYINDEX);
859- Callable hook = LuaState::getVariant (state, -1 , api );
856+ Callable hook = LuaState::getVariant (state, -1 );
860857 lua_pop (state, 1 );
861858
862859 if (hook.is_null ()) {
863860 return ;
864861 }
865862
866863 Array args;
867- args.append (Ref<LuaAPI>(api ));
864+ args.append (Ref<LuaAPI>(getAPI (state) ));
868865 args.append (ar->event );
869866 args.append (ar->currentline );
870867
0 commit comments