lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Hi Everybody

I have the idea of a multi user extendable programm. For this programm 
I have to be able to test if a user may call function y.x(). I made a test 
programm using a "index" tagmethod.

See test programm below.

I put the functions as global table (object y) with a tag and no actual
functions defined. If a function (x) is executed, the tagmethod is 

The tagmethod checks what function is executed and the users access
rights. If the user may access the function it is loaded from a datebase
in memory and is returned using a lua_dostring. If the user may not access
the function a generic function is returned which says that executing this
function isn't allowed.

By using this method I see a big performance problem, the function isn't 
just once compiled when it is defined. It is compiled each time the 
function is accessed. There for I thought I might use luac and 
luab_dostring. So I would keep a already compiled version of the script 
returning my function.

I would appreciate any comments or feedback. There are may be way better 
or simplier methods.

Some questions:

Would using the precompiled script reach almost the same perfomance as a 
normaly defined function?

Is anything to say against the trick using "return function()"?

Have I missed any problems?

Do you know a better method way?

Any better methods?



extern "C" {
#include "lua.h"
#include "lualib.h"

#include <stdio.h>

struct lua_State *L;

int intDoTag(lua_State *L);

int main(int argc, char* argv[])
        int c;

        L = lua_open(0);

        int otag = lua_newtag(L);

	// Set the tagmethod for the global object
        lua_pushcfunction(L, intDoTag);
        lua_settagmethod(L, otag, "index");

        lua_settag (L, otag);
	// Define a global object (table) to call functions on,
	// no actual function defined.
        lua_setglobal(L, "test");

	// Start a test script
        lua_dostring(L, "test.asdf(\"Hallo\")");

        c = getc(stdin);
        return 0;

int intDoTag(lua_State *L)
	// Test if user may execute the funtion
	// if yes, excute the funtion from a db (here hardcoded)
		lua_dostring(L, "return function (data)\nprint(data)\nend");
	// if the user may not execute the funtion return a error
	"return function (data)\nprint(\"Executing not allowed\")\nend");

	return 1;