Re: Lua 5.2 beta: trap with lua_getglobal
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: Re: Lua 5.2 beta: trap with lua_getglobal
- From: Ingo van Lil <inguin@...>
- Date: 2011年10月22日 15:32:22 +0200
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