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

Commit 960cacf

Browse files
committed
getVariant no longer requires api ref (#142)
1 parent a1ad3ca commit 960cacf

7 files changed

Lines changed: 67 additions & 71 deletions

File tree

project/testing/tests/LuaAPI.expose_function.gd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,17 @@ func _process(delta):
8585

8686
var result1 = lua.pull_variant("result1")
8787
if not result1:
88-
errors.append("result1 is false")
88+
errors.append(LuaError.new_error("result1 is false"))
8989
fail()
9090

9191
var result2 = lua.pull_variant("result2")
9292
if not result2:
93-
errors.append("result2 is false")
93+
errors.append(LuaError.new_error("result2 is false"))
9494
fail()
9595

9696
var result3 = lua.pull_variant("result3")
9797
if not result3 == 10:
98-
errors.append("result3 is not 10 but is %d" % result3)
98+
errors.append(LuaError.new_error("result3 is not 10 but is %d" % result3))
9999
fail()
100100

101101
done = true

register_types.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ void initialize_luaAPI_module(ModuleInitializationLevel p_level) {
1515
}
1616

1717
ClassDB::register_class<LuaAPI>();
18+
ClassDB::register_class<LuaCallableExtra>();
1819
ClassDB::register_class<LuaCoroutine>();
1920
ClassDB::register_class<LuaError>();
2021
ClassDB::register_class<LuaTuple>();
21-
ClassDB::register_class<LuaCallableExtra>();
2222
}
2323

2424
void uninitialize_luaAPI_module(ModuleInitializationLevel p_level) {

src/classes/luaAPI.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ Variant LuaAPI::callFunctionRef(Array args, int funcRef) {
9898
if (ret != LUA_OK) {
9999
toReturn = LuaState::handleError(lState, ret);
100100
} else {
101-
toReturn = LuaState::getVariant(lState, -1, this);
101+
toReturn = LuaState::getVariant(lState, -1);
102102
}
103103

104104
lua_pop(lState, 1);

src/classes/luaCallableExtra.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,9 @@ int LuaCallableExtra::getArgc() {
6565

6666
// Used for the __call metamethod
6767
int LuaCallableExtra::call(lua_State *state) {
68-
LuaAPI *api = LuaState::getAPI(state);
69-
7068
int l_argc = lua_gettop(state) - 1; // We subtract 1 because the LuaCallableExtra is counted
7169
int noneMulty = l_argc;
72-
LuaCallableExtra *func = (LuaCallableExtra *)LuaState::getVariant(state, 1, api).operator Object *();
70+
LuaCallableExtra *func = (LuaCallableExtra *)LuaState::getVariant(state, 1).operator Object *();
7371
if (func == nullptr) {
7472
LuaError *err = LuaError::newError("Error during LuaCallableExtra::call func==null", LuaError::ERR_RUNTIME);
7573
lua_pushstring(state, err->getMessage().ascii().get_data());
@@ -83,18 +81,18 @@ int LuaCallableExtra::call(lua_State *state) {
8381
Array args;
8482

8583
if (func->wantsRef) {
86-
args.append(api);
84+
args.append(Ref<LuaAPI>(LuaState::getAPI(state)));
8785
}
8886

8987
int index = 2; // we start at 2 because the LuaCallableExtra is arg 1
9088
for (int i = 0; i < noneMulty; i++) {
91-
args.append(LuaState::getVariant(state, index++, api));
89+
args.append(LuaState::getVariant(state, index++));
9290
}
9391

9492
if (func->isTuple) {
9593
Array tupleArgs;
9694
for (int i = noneMulty; i < l_argc; i++) {
97-
tupleArgs.push_back(LuaState::getVariant(state, index++, api));
95+
tupleArgs.push_back(LuaState::getVariant(state, index++));
9896
}
9997
args.append(LuaTuple::fromArray(tupleArgs));
10098
}

src/luaState.cpp

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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>
@@ -9,7 +10,6 @@
910

1011
void 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
154154
Variant 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.
693698
int 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

754757
int 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
799800
int 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

854853
void 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

src/luaState.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class LuaState {
4343
#else
4444
static LuaError *handleError(const StringName &func, GDExtensionCallError error, const Variant **p_arguments, int argc);
4545
#endif
46-
static Variant getVariant(lua_State *state, int index, LuaAPI *api);
46+
static Variant getVariant(lua_State *state, int index);
4747

4848
// Lua functions
4949
static int luaErrorHandler(lua_State *state);
@@ -54,8 +54,6 @@ class LuaState {
5454
static void luaHook(lua_State *state, lua_Debug *ar);
5555

5656
private:
57-
LuaAPI *api = nullptr;
58-
5957
lua_State *L = nullptr;
6058

6159
void exposeConstructors();

0 commit comments

Comments
 (0)