Mercurial > vba-clojure
view src/lua/ltm.c @ 237:ff37bc3004a7
continuing work on map-function-addresses.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 24 Mar 2012 23:38:21 -0500 |
parents | 27763b933818 |
children |
line wrap: on
line source
1 /*2 ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $3 ** Tag methods4 ** See Copyright Notice in lua.h5 */8 #include <string.h>10 #define ltm_c11 #define LUA_CORE13 #include "lua.h"15 #include "lobject.h"16 #include "lstate.h"17 #include "lstring.h"18 #include "ltable.h"19 #include "ltm.h"23 const char *const luaT_typenames[] = {24 "nil", "boolean", "userdata", "number",25 "string", "table", "function", "userdata", "thread",26 "proto", "upval"27 };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 }46 /*47 ** function to be used with macro "fasttm": optimized for absence of48 ** tag methods49 */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 }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 }