lua-users home
lua-l archive

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

You may push your constants as the upvalues of your c closure first ,
and you can use upvalue index (an integer identifier) later.

In my lua-bson lib ( ) ,
I use this way to avoid string interning .

2014-06-29 12:04 GMT+08:00 William Ahern <>:
> Something I've always wanted to see in Lua was the ability to push constant
> strings onto the stack using an integer identifier rather than for Lua to
> recompute the hash.
> For example, consider the type() builtin. In C, lua_type returns a constant
> integer, which makes conditionals quick.
> In Lua, type() is implemented as
>         lua_pushstring(L, lua_typename(L, lua_type(L, 1)))
> The string hashing makes using type() in conditionals more than 4x slower
> than an integer compare because it cannot benefit from Lua's string
> interning.
> It would be nice if there were an interface like
>   enum {
>     LUA_CSTRING,   // "string"
>     LUA_CTABLE,    // "table"
>     LUA_CFUNCTION, // "function"
>     LUA_CUSERDATA, // "userdata"
>     ...
>   };
>   void lua_pushconstant(L, int);
> where Lua would use a mapping built when the VM was instantiated to quickly
> push the string onto the stack.
> I was originally going to suggest a more generic API that allowed deriving
> an integer identifier for any string, but I remembered that user C code can
> always just use upvalues for caching strings. I already do that for
> metatables in places where it matters. luaB_type could also simply be
> rewritten to use upvalue memoization.