Em dom., 28 de fev. de 2021 às 22:11, Sean Conner <
sean@conman.org> escreveu:
It was thus said that the Great Ranier Vilela once stated:
> Em sex., 26 de fev. de 2021 às 22:25, Sean Conner <sean@conman.org>
> escreveu:
>
> > * You cleanup the stack, thus removing the stack entry with the
> > userdata.
> >
> In your opinion, this code is correct?
>
> if (lua_getmetatable(L, 2)) {
> lua_getfield(L, -1, "namefield");
> if (lua_isuserdata(L, -1)) {
> MyCtype func = (MyCtype) lua_touserdata(L, -1);
> int n = 1;
>
> if (func != NULL) {
> void * child = lua_touserdata(L, 2);
>
> control = (*func)(child);
> ++n; /* pop child */
> }
> lua_pop(L, n); /* pop child and MyCType */
> }
> }
I would write this as:
int mylua_func(lua_State *L)
{
MyCtype func = luaL_checkudata(L,2,"MyCtype");
/*-------------------------------------------------------------
; func will NOT be null, if the stack item isn't a userdata or
; have the proper metatable, luaL_checkudata() will throw an
; error. You also do NOT need the casts if you writing in C. If
; this is C++, then yes, you will need the cast.
;--------------------------------------------------------------*/
if (luaL_getmetafield(L,2,"namefield"))
{
/*-----------------------------------------------------------
; luaL_getmetafield() will return 1 if there is a field of the
; given name in the metatable, and push the item on the stack.
; It will return 0 and NOT push any data if the field doesn't
; exist.
;-------------------------------------------------------------*/
(*func)(luaL_checkudata(L,-1,"myothertype"));
lua_pop(L,1);
}
}
The auxilary library has a lot of convenience functions.
Hi Sean Conner,
The code stayed like this:
if (luaL_callmeta(L, 3, "__tocontrol")) { /* metafield? */
control = lua_touserdata(L, -1);
lua_pop(L, 1);
}
Thanks to your tips, the solution was similar to tostring.
regards,
Ranier Vilela