| /* |
| ** $Id: ltm.h,v 1.25 2001/06/06 18:00:19 roberto Exp roberto $ |
| ** Tag methods |
| ** See Copyright Notice in lua.h |
| */ |
| |
| #ifndef ltm_h |
| #define ltm_h |
| |
| |
| #include "lobject.h" |
| #include "lstate.h" |
| |
| /* |
| * WARNING: if you change the order of this enumeration, |
| * grep "ORDER TM" |
| */ |
| typedef enum { |
| TM_GETTABLE = 0, |
| TM_SETTABLE, |
| TM_INDEX, |
| TM_GETGLOBAL, |
| TM_SETGLOBAL, |
| TM_ADD, |
| TM_SUB, |
| TM_MUL, |
| TM_DIV, |
| TM_POW, |
| TM_UNM, |
| TM_LT, |
| TM_CONCAT, |
| TM_GC, |
| TM_FUNCTION, |
| TM_N /* number of elements in the enum */ |
| } TMS; |
| |
| |
| |
| /* |
| ** masks for allowable tag methods |
| ** (see `luaT_validevents') |
| */ |
| #define HAS_TM_GETGLOBAL(L,t) (1<<(t) & ((1<<LUA_TUSERDATA) | \ |
| (1<<LUA_TTABLE) | \ |
| (1<<LUA_TNIL))) |
| |
| #define HAS_TM_SETGLOBAL(L,t) (1<<(t) & ((1<<LUA_TUSERDATA) | \ |
| (1<<LUA_TTABLE) | \ |
| (1<<LUA_TNIL) | \ |
| (1<<LUA_TFUNCTION))) |
| |
| |
| |
| struct TM { |
| Closure *method[TM_N]; |
| Udata *collected; /* list of garbage-collected udata with this tag */ |
| TString *name; /* type name */ |
| int basictype; |
| }; |
| |
| |
| #define luaT_gettm(G,tag,event) (G->TMtable[tag].method[event]) |
| #define luaT_gettmbyObj(G,o,e) (luaT_gettm((G),luaT_tag(o),(e))) |
| |
| #define typenamebytag(G, t) getstr(G->TMtable[t].name) |
| |
| |
| #define validtag(G,t) (NUM_TAGS <= (t) && (t) < G->ntag) |
| |
| extern const l_char *const luaT_eventname[]; |
| |
| |
| void luaT_init (lua_State *L); |
| int luaT_newtag (lua_State *L, const l_char *name, int basictype); |
| const l_char *luaT_typename (global_State *G, const TObject *o); |
| int luaT_tag (const TObject *o); |
| int luaT_validevent (int t, int e); /* used by compatibility module */ |
| |
| |
| #endif |