diff options
author | faketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2011-10-03 21:25:04 +0200 |
---|---|---|
committer | faketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2011-10-03 21:25:04 +0200 |
commit | aafef187ef856a36c3f8e599afea2dee44f08904 (patch) | |
tree | c84762cc768da2800a0f80b902c704e782bd29ef /lua-5.1.4/src/ltm.c | |
parent | MCServer c++ source files (diff) | |
download | cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar.gz cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar.bz2 cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar.lz cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar.xz cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.tar.zst cuberite-aafef187ef856a36c3f8e599afea2dee44f08904.zip |
Diffstat (limited to '')
-rw-r--r-- | lua-5.1.4/src/ltm.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lua-5.1.4/src/ltm.c b/lua-5.1.4/src/ltm.c new file mode 100644 index 000000000..c27f0f6fa --- /dev/null +++ b/lua-5.1.4/src/ltm.c @@ -0,0 +1,75 @@ +/* +** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + + +#include <string.h> + +#define ltm_c +#define LUA_CORE + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +const char *const luaT_typenames[] = { + "nil", "boolean", "userdata", "number", + "string", "table", "function", "userdata", "thread", + "proto", "upval" +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__eq", + "__add", "__sub", "__mul", "__div", "__mod", + "__pow", "__unm", "__len", "__lt", "__le", + "__concat", "__call" + }; + int i; + for (i=0; i<TM_N; i++) { + G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]); + luaS_fix(G(L)->tmname[i]); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getstr(events, ename); + lua_assert(event <= TM_EQ); + if (ttisnil(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<<event); /* cache this fact */ + return NULL; + } + else return tm; +} + + +const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { + Table *mt; + switch (ttype(o)) { + case LUA_TTABLE: + mt = hvalue(o)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); +} + |