From: Donald Lee Date: Mon, 9 Aug 2021 23:07:06 +0000 (+0800) Subject: lib: Enable consecutive frrscript_call X-Git-Tag: base_8.1~215^2~2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2ed598ba6bdbd8b6b6c6e9a091faad15306d19de;p=matthieu%2Ffrr.git lib: Enable consecutive frrscript_call Previous: - frrscript_load: push Lua function onto stack - frrscript_call: calls Lua function Now: - frrscript_load: checks Lua function - frrscript_call: pushes and calls Lua function (first clear the stack) So now we just need one frrscript_load for consecutive frrscript_call. frrscript_call does not recompile or reload the script file, it just keys it from the global Lua table (where it should already be). Signed-off-by: Donald Lee --- diff --git a/lib/frrscript.c b/lib/frrscript.c index c9fc938997..0e0d3c030c 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -288,13 +288,16 @@ int frrscript_load(struct frrscript *fs, const char *function_name, goto fail; } - /* Push the Lua function we want */ + /* To check the Lua function, we get it from the global table */ lua_getglobal(L, function_name); if (lua_isfunction(L, lua_gettop(L)) == 0) { zlog_err("frrscript: loaded script '%s.lua' but %s not found", script_name, function_name); goto fail; } + /* Then pop the function (frrscript_call will push it when it needs it) + */ + lua_pop(L, 1); if (load_cb && (*load_cb)(fs) != 0) { zlog_err( diff --git a/lib/frrscript.h b/lib/frrscript.h index 540676c099..c089df61fc 100644 --- a/lib/frrscript.h +++ b/lib/frrscript.h @@ -203,8 +203,18 @@ const struct prefix * : lua_decode_noop \ int _frrscript_call_lua(struct lua_function_state *lfs, int nargs); /* - * Wrapper for calling Lua function state. Maps values passed in to their - * encoder and decoder types. + * Wrapper for calling Lua function state. + * + * The Lua function name (f) to run should have already been checked by + * frrscript_load. So this wrapper will: + * 1) Find the Lua function state, which contains the Lua state + * 2) Clear the Lua state (there may be leftovers items from previous call) + * 3) Push the Lua function (f) + * 4) Map frrscript_call arguments onto their encoder and decoders, push those + * 5) Call _frrscript_call_lua (Lua execution takes place) + * 6) Write back to frrscript_call arguments using their decoders + * + * This wrapper can be called multiple times (after one frrscript_load). * * fs * The struct frrscript in which the Lua fuction was loaded into @@ -226,6 +236,8 @@ int _frrscript_call_lua(struct lua_function_state *lfs, int nargs); 1; \ }) \ : ({ \ + lua_settop(lfs->L, 0); \ + lua_getglobal(lfs->L, f); \ MAP_LISTS(ENCODE_ARGS, ##__VA_ARGS__); \ _frrscript_call_lua( \ lfs, PP_NARG(__VA_ARGS__)); \