diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index a2d48b5b..7f503c23 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -9,7 +9,7 @@ static int l_get(lua::State* L) { std::string url(lua::require_lstring(L, 1)); lua::pushvalue(L, 2); - auto onResponse = lua::create_lambda(L); + auto onResponse = lua::create_lambda_nothrow(L); engine->getNetwork().get(url, [onResponse](std::vector bytes) { engine->postRunnable([=]() { @@ -23,7 +23,7 @@ static int l_get_binary(lua::State* L) { std::string url(lua::require_lstring(L, 1)); lua::pushvalue(L, 2); - auto onResponse = lua::create_lambda(L); + auto onResponse = lua::create_lambda_nothrow(L); engine->getNetwork().get(url, [onResponse](std::vector bytes) { auto buffer = std::make_shared>( @@ -40,7 +40,7 @@ static int l_connect(lua::State* L) { std::string address = lua::require_string(L, 1); int port = lua::tointeger(L, 2); lua::pushvalue(L, 3); - auto callback = lua::create_lambda(L); + auto callback = lua::create_lambda_nothrow(L); u64id_t id = engine->getNetwork().connect(address, port, [callback](u64id_t id) { engine->postRunnable([=]() { callback({id}); @@ -122,7 +122,7 @@ static int l_recv(lua::State* L) { static int l_open(lua::State* L) { int port = lua::tointeger(L, 1); lua::pushvalue(L, 2); - auto callback = lua::create_lambda(L); + auto callback = lua::create_lambda_nothrow(L); u64id_t id = engine->getNetwork().openServer(port, [callback](u64id_t id) { engine->postRunnable([=]() { callback({id}); diff --git a/src/logic/scripting/lua/lua_util.cpp b/src/logic/scripting/lua/lua_util.cpp index 86419906..8c83dc50 100644 --- a/src/logic/scripting/lua/lua_util.cpp +++ b/src/logic/scripting/lua/lua_util.cpp @@ -263,6 +263,23 @@ scripting::common_func lua::create_lambda(State* L) { }; } +scripting::common_func lua::create_lambda_nothrow(State* L) { + auto funcptr = create_lambda_handler(L); + return [=](const std::vector& args) -> dv::value { + getglobal(L, LAMBDAS_TABLE); + getfield(L, *funcptr); + for (const auto& arg : args) { + pushvalue(L, arg); + } + if (call_nothrow(L, args.size(), 1)) { + auto result = tovalue(L, -1); + pop(L); + return result; + } + return nullptr; + }; +} + int lua::create_environment(State* L, int parent) { int id = nextEnvironment++; diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index 70dd7705..983abb39 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -574,6 +574,7 @@ namespace lua { runnable create_runnable(lua::State*); scripting::common_func create_lambda(lua::State*); + scripting::common_func create_lambda_nothrow(lua::State*); inline int pushenv(lua::State* L, int env) { if (getglobal(L, env_name(env))) {