Skip to content
This repository was archived by the owner on Dec 29, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 16 additions & 13 deletions src/classes/luaCallableExtra.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ int LuaCallableExtra::call(lua_State *state) {
RefCounted* OBJ = (RefCounted*) lua_touserdata(state, -1);
lua_pop(state, 1);

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

Array p_args;
Array args;

if (func->wantsRef)
p_args.append(OBJ);
args.append(OBJ);

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

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

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

const Variant **p_args = (const Variant **)mem_args.ptr();

Variant returned;
#ifndef LAPI_GDEXTENSION
Callable::CallError error;
func->function.callp(args, p_args.size(), returned, error);
func->function.callp(p_args, args.size(), returned, error);
if (error.error != error.CALL_OK) {
LuaError* err = LuaState::handleError(func->function.get_method(), error, args, argc);
LuaError* err = LuaState::handleError(func->function.get_method(), error, p_args, args.size());
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return 0;
}
#else
returned = func->function.callv(p_args);
returned = func->function.callv(args);
#endif

LuaState::pushVariant(state, returned);
Expand Down
1 change: 1 addition & 0 deletions src/classes/luaCallableExtra.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "core/core_bind.h"
#else
#include <godot_cpp/classes/ref.hpp>
#include <godot_cpp/templates/vector.hpp>
#endif

#include <lua/lua.hpp>
Expand Down
74 changes: 43 additions & 31 deletions src/luaState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,8 @@ int LuaState::luaPrint(lua_State* state)

#ifndef LAPI_GDEXTENSION

#include <vector>

// Used as the __call metamethod for mt_Callable.
// All exposed gdscript functions are called vis this method.
int LuaState::luaCallableCall(lua_State* state) {
Expand All @@ -698,27 +700,32 @@ int LuaState::luaCallableCall(lua_State* state) {
int argc = lua_gettop(state)-1; // We subtract 1 becuase the callable its self will be counted
Callable callable = (Callable) LuaState::getVariant(state, 1, OBJ);

const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * argc);
Array args;
args.resize(argc);
Vector<const Variant*> mem_args;
mem_args.resize(argc);

int index = 2; // we start at 2, 1 is the callable
for (int i = 0; i < argc; i++) {
Variant* temp = memnew(Variant);
*temp = LuaState::getVariant(state, index++, OBJ);
if ((*temp).get_type() != Variant::Type::OBJECT) {
if (LuaError* err = Object::cast_to<LuaError>(temp->operator Object*()); err != nullptr) {
args[i] = LuaState::getVariant(state, index++, OBJ);
if (args[i].get_type() != Variant::Type::OBJECT) {
if (LuaError* err = Object::cast_to<LuaError>(args[i].operator Object*()); err != nullptr) {
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return 0;
}
}

args[i] = temp;
mem_args.write[i] = &args[i];
}

const Variant **p_args = (const Variant **)mem_args.ptr();

Variant returned;
Callable::CallError error;
callable.callp(args, argc, returned, error);
callable.callp(p_args, argc, returned, error);
if (error.error != error.CALL_OK) {
LuaError* err = LuaState::handleError(callable.get_method(), error, args, argc);
LuaError* err = LuaState::handleError(callable.get_method(), error, p_args, argc);
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return 0;
Expand Down Expand Up @@ -802,34 +809,37 @@ int LuaState::luaUserdataFuncCall(lua_State* state) {
RefCounted* OBJ = (RefCounted*) lua_touserdata(state, -1);
lua_pop(state, 1);

int argc = lua_gettop(state);
Variant* obj = (Variant*)lua_touserdata(state, lua_upvalueindex(1));
String fName = LuaState::getVariant(state, lua_upvalueindex(2), OBJ);

Array p_args;
const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * argc);
int index = 1;
int argc = lua_gettop(state);
Array args;
args.resize(argc);
Vector<const Variant*> mem_args;
mem_args.resize(argc);
for (int i = 0; i < argc; i++) {
p_args.append(LuaState::getVariant(state, index++, OBJ));
args[i] = &p_args[i];
args[i] = LuaState::getVariant(state, i+1, OBJ);
mem_args.write[i] = &args[i];
}

Variant* obj = (Variant*)lua_touserdata(state, lua_upvalueindex(1));
String fName = LuaState::getVariant(state, lua_upvalueindex(2), OBJ);

const Variant **p_args = (const Variant **)mem_args.ptr();

Variant returned;
#ifndef LAPI_GDEXTENSION
Callable::CallError error;
obj->callp(fName.ascii().get_data(), args, argc, returned, error);
obj->callp(fName.ascii().get_data(), p_args, argc, returned, error);
if (error.error != error.CALL_OK) {
LuaError* err = LuaState::handleError(fName, error, args, argc);
print_line("error: " + String::num(error.error));
LuaError* err = LuaState::handleError(fName, error, p_args, argc);
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return 0;
}
#else
GDExtensionCallError error;
obj->callp(fName.ascii().get_data(), args, argc, returned, error);
obj->callp(fName.ascii().get_data(), p_args, argc, returned, error);
if (error.error != GDEXTENSION_CALL_OK) {
LuaError* err = LuaState::handleError(fName, error, args, argc);
LuaError* err = LuaState::handleError(fName, error, p_args, argc);
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return 0;
Expand Down Expand Up @@ -864,21 +874,23 @@ void LuaCoroutine::luaHook(lua_State* state, lua_Debug* ar) {
}

#ifndef LAPI_GDEXTENSION
Array p_args;
p_args.append(OBJ);
p_args.append(ar->event);
p_args.append(ar->currentline);

const Variant **args = (const Variant**)alloca(sizeof(const Variant**) * p_args.size());
for (int i = 0; i < p_args.size(); i++) {
args[i] = &p_args[i];
Array args;
args.append(OBJ);
args.append(ar->event);
args.append(ar->currentline);

const int argc = 3;
const Variant *p_args[argc];
for (int i = 0; i < argc; i++) {
args[i] = LuaState::getVariant(state, i+1, OBJ);
p_args[i] = &args[i];
}

Variant returned;
Callable::CallError error;
hook.callp(args, p_args.size(), returned, error);
hook.callp(p_args, argc, returned, error);
if (error.error != error.CALL_OK) {
LuaError* err = LuaState::handleError(hook.get_method(), error, args, p_args.size());
LuaError* err = LuaState::handleError(hook.get_method(), error, p_args, argc);
lua_pushstring(state, err->getMessage().ascii().get_data());
lua_error(state);
return;
Expand Down
1 change: 1 addition & 0 deletions src/luaState.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <godot_cpp/classes/ref.hpp>
#include <classes/luaCallable.h>
#include <godot_cpp/templates/vmap.hpp>
#include <godot_cpp/templates/vector.hpp>
#endif

#include <lua/lua.hpp>
Expand Down