From 6b80e5120a9edeebee4e266fc17c81e2a5ddaf40 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 1 Sep 2021 13:35:13 +0100 Subject: [Minor] Add function to get a lua_reference from a string returning a function --- src/lua/lua_common.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/lua/lua_common.c') diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index 06720c9f2..5d874d507 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -2292,6 +2292,56 @@ rspamd_lua_require_function (lua_State *L, const gchar *modname, return FALSE; } +gint +rspamd_lua_function_ref_from_str (lua_State *L, const gchar *str, gsize slen, + GError **err) +{ + gint err_idx, ref_idx; + + lua_pushcfunction (L, &rspamd_lua_traceback); + err_idx = lua_gettop (L); + + /* Load file */ + if (luaL_loadbuffer (L, str, slen, "lua_embedded_str") != 0) { + g_set_error (err, + lua_error_quark(), + EINVAL, + "cannot load lua script: %s", + lua_tostring (L, -1)); + lua_settop (L, err_idx - 1); /* Error function */ + + return LUA_NOREF; + } + + /* Now call it */ + if (lua_pcall (L, 0, 1, err_idx) != 0) { + g_set_error (err, + lua_error_quark(), + EINVAL, + "cannot init lua script: %s", + lua_tostring (L, -1)); + lua_settop (L, err_idx - 1); + + return LUA_NOREF; + } + + if (!lua_isfunction (L, -1)) { + g_set_error (err, + lua_error_quark(), + EINVAL, + "cannot init lua script: " + "must return function"); + lua_settop (L, err_idx - 1); + + return LUA_NOREF; + } + + ref_idx = luaL_ref (L, LUA_REGISTRYINDEX); + lua_settop (L, err_idx - 1); + + return ref_idx; +} + gboolean rspamd_lua_try_load_redis (lua_State *L, const ucl_object_t *obj, -- cgit v1.2.3