[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: checking types without tags
- From: "Peter Shook" <pshook@...>
- Date: Thu, 23 May 2002 13:56:51 -0400
>Why is the metatable at upvalueindex(1)?
>In: "im:ColorAllocate(255, 255, 255)" the 'gettable' event is called
and it
>calls 'ColorAllocate' in the 'gettable' table. But in wich moment
appears
>the metatable in upvalueindex(1)? Is that something that the gettable
does
>automatically?
The methods are closures that get bound to a reference to the metatable
just before I stuff them into the gettable table.
#define set_closure(L,n,f,index) \
(lua_pushvalue(L, index), \ <-- push metatable onto
top of stack
lua_pushcclosure(L, f, 1), \ <-- make closure right
here
lua_pushstring(L, n), \ <-- push name of method
lua_insert(L, -2), /* swap name with closure */ \
lua_settable(L, -3)) <-- stuff into gettable
table
static void set_closures (lua_State *L, const luaL_reg *l, int n, int
index)
{
int i;
for (i=0; i<n; i++)
set_closure(L, l[i].name, l[i].func, index);
}
static const luaL_reg image_methods[] = {
{"ColorAllocate", image_color_allocate},
{"Line", image_line},
{"PNG", image_png},
};
metatable = my_newtable(L); /* metatable */
methods = my_newtable(L); /* Image methods */ <-- gettable table
set_closures(L, image_methods, NUMOF(image_methods), metatable);
- Peter