lua-users home
lua-l archive

Re: Lua 5.2 beta: trap with lua_getglobal

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


On 22/10/2011 15:03, liam mail wrote:
I propose to rewrite the macro with something like:
#define lua_getglobal(L,s) \
 do { const char* S=s; lua_pushglobaltable(L); lua_getfield(L, -1, S);
lua_remove(L, -2); } while(0)
Yes this is correct as you are using a relative rather than absolute
address and your proposed solution looks good for relative indexes,
although I would question the do while block. The do while block scope
is recommended by numerous FAQs, books et al, yet with a high enough
compiler warning level and the wrong compiler it will generate user
warnings in code. *
The 'do {} while(0)' trick is not just about limiting scope, its primary purpose is to guarantee that you can safely use the macro like a regular function in all contexts. Without the dummy loop you'd get unexpected results e.g. when using:
if (foo)
 lua_getglobal(L, x);
I'd also expect the trick to be common enough to not generate a warning in most compilers, but that's only a guess. There is however another potential source of warnings: The variable 'S' might shadow another identifier declared outside. It should at least be changed to a less commonly used name.
I guess the only safe solution is to make lua_getglobal() a real function.
Regards,
Ingo

AltStyle によって変換されたページ (->オリジナル) /