lua-users home
lua-l archive

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


Excerpts from Alexander Nasonov's message of 2014-09-14 21:42:07 +0200:
> Karel Tuma wrote:
> > Excerpts from Alexander Nasonov's message of 2014-09-14 20:19:08 +0200:
> > > Dirk Laurie wrote:
> > > > Is there any difference between *l and l[] in C?
> > > 
> > > There is no difference for function arguments but luaL_newlib()
> > > and luaL_newlibtable() are macros. Because the documentation
> > > emphasises that l must be an array, I suspect the implementation
> > > calculates sizeof(l) / sizeof(l[0]).
> > > 
> > > Alex
> > 
> > Luckily not, it looks for NULL terminator in the name field.
> 
> #define luaL_newlibtable(L,l)   \
>   lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
> 
> #define luaL_newlib(L,l)        (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
> 
> Alex

I suspect the macro "virtual decl" was pasted from actual declaration of
luaL_setfuncs, which uses a pointer, whereas luaL_newlibtable "virtual decl"
uses [] as an emphasis that the array will be used to compute hint, indeed the docs
can be perceived a bit misleading in that regard, though no harm done in the actual API.

Interestingly, with pointer the result always yields -1 (becaue l[0] is 2 pointers wide)
which makes lua_createtable ignore it. While not the case of Lua, this might be existing
int overflow bug to look for in other software..