| 1 | /* | 
|---|
| 2 | ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ | 
|---|
| 3 | ** Tag methods | 
|---|
| 4 | ** See Copyright Notice in lua.h | 
|---|
| 5 | */ | 
|---|
| 6 |  | 
|---|
| 7 |  | 
|---|
| 8 | #include <string.h> | 
|---|
| 9 |  | 
|---|
| 10 | #define ltm_c | 
|---|
| 11 | #define LUA_CORE | 
|---|
| 12 |  | 
|---|
| 13 | #include "lua.h" | 
|---|
| 14 |  | 
|---|
| 15 | #include "lobject.h" | 
|---|
| 16 | #include "lstate.h" | 
|---|
| 17 | #include "lstring.h" | 
|---|
| 18 | #include "ltable.h" | 
|---|
| 19 | #include "ltm.h" | 
|---|
| 20 |  | 
|---|
| 21 |  | 
|---|
| 22 |  | 
|---|
| 23 | const char *const luaT_typenames[] = { | 
|---|
| 24 | "nil", "boolean", "userdata", "number", | 
|---|
| 25 | "string", "table", "function", "userdata", "thread", | 
|---|
| 26 | "proto", "upval" | 
|---|
| 27 | }; | 
|---|
| 28 |  | 
|---|
| 29 |  | 
|---|
| 30 | void luaT_init (lua_State *L) { | 
|---|
| 31 | static const char *const luaT_eventname[] = {  /* ORDER TM */ | 
|---|
| 32 | "__index", "__newindex", | 
|---|
| 33 | "__gc", "__mode", "__eq", | 
|---|
| 34 | "__add", "__sub", "__mul", "__div", "__mod", | 
|---|
| 35 | "__pow", "__unm", "__len", "__lt", "__le", | 
|---|
| 36 | "__concat", "__call" | 
|---|
| 37 | }; | 
|---|
| 38 | int i; | 
|---|
| 39 | for (i=0; i<TM_N; i++) { | 
|---|
| 40 | G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]); | 
|---|
| 41 | luaS_fix(G(L)->tmname[i]);  /* never collect these names */ | 
|---|
| 42 | } | 
|---|
| 43 | } | 
|---|
| 44 |  | 
|---|
| 45 |  | 
|---|
| 46 | /* | 
|---|
| 47 | ** function to be used with macro "fasttm": optimized for absence of | 
|---|
| 48 | ** tag methods | 
|---|
| 49 | */ | 
|---|
| 50 | const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { | 
|---|
| 51 | const TValue *tm = luaH_getstr(events, ename); | 
|---|
| 52 | lua_assert(event <= TM_EQ); | 
|---|
| 53 | if (ttisnil(tm)) {  /* no tag method? */ | 
|---|
| 54 | events->flags |= cast_byte(1u<<event);  /* cache this fact */ | 
|---|
| 55 | return NULL; | 
|---|
| 56 | } | 
|---|
| 57 | else return tm; | 
|---|
| 58 | } | 
|---|
| 59 |  | 
|---|
| 60 |  | 
|---|
| 61 | const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { | 
|---|
| 62 | Table *mt; | 
|---|
| 63 | switch (ttype(o)) { | 
|---|
| 64 | case LUA_TTABLE: | 
|---|
| 65 | mt = hvalue(o)->metatable; | 
|---|
| 66 | break; | 
|---|
| 67 | case LUA_TUSERDATA: | 
|---|
| 68 | mt = uvalue(o)->metatable; | 
|---|
| 69 | break; | 
|---|
| 70 | default: | 
|---|
| 71 | mt = G(L)->mt[ttype(o)]; | 
|---|
| 72 | } | 
|---|
| 73 | return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); | 
|---|
| 74 | } | 
|---|
| 75 |  | 
|---|