11d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III/* 21d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III** $Id: ltm.c,v 2.14 2011/06/02 19:31:40 roberto Exp $ 31d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III** Tag methods 41d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III** See Copyright Notice in lua.h 51d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III*/ 61d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 71d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 81d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include <string.h> 91d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 101d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#define ltm_c 111d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#define LUA_CORE 121d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 131d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "lua.h" 141d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 151d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "lobject.h" 161d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "lstate.h" 171d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "lstring.h" 181d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "ltable.h" 191d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III#include "ltm.h" 201d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 211d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 221d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins IIIstatic const char udatatypename[] = "userdata"; 231d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 241d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins IIILUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = { 251d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "no value", 261d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "nil", "boolean", udatatypename, "number", 271d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "string", "table", "function", udatatypename, "thread", 281d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "proto", "upval" /* these last two cases are used for tests only */ 291d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III}; 301d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 311d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 321d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins IIIvoid luaT_init (lua_State *L) { 331d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III static const char *const luaT_eventname[] = { /* ORDER TM */ 341d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "__index", "__newindex", 351d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "__gc", "__mode", "__len", "__eq", 361d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "__add", "__sub", "__mul", "__div", "__mod", 371d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "__pow", "__unm", "__lt", "__le", 381d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III "__concat", "__call" 391d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III }; 401d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III int i; 411d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III for (i=0; i<TM_N; i++) { 421d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]); 431d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III luaS_fix(G(L)->tmname[i]); /* never collect these names */ 441d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III } 451d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III} 461d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 471d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 481d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III/* 491d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III** function to be used with macro "fasttm": optimized for absence of 501d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III** tag methods 511d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III*/ 521d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins IIIconst TValue *luaT_gettm (Table *events, TMS event, TString *ename) { 531d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III const TValue *tm = luaH_getstr(events, ename); 541d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III lua_assert(event <= TM_EQ); 551d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III if (ttisnil(tm)) { /* no tag method? */ 561d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III events->flags |= cast_byte(1u<<event); /* cache this fact */ 571d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III return NULL; 581d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III } 591d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III else return tm; 601d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III} 611d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 621d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 631d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins IIIconst TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { 641d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III Table *mt; 651d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III switch (ttypenv(o)) { 661d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III case LUA_TTABLE: 671d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III mt = hvalue(o)->metatable; 681d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III break; 691d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III case LUA_TUSERDATA: 701d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III mt = uvalue(o)->metatable; 711d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III break; 721d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III default: 731d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III mt = G(L)->mt[ttypenv(o)]; 741d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III } 751d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); 761d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III} 771d9a26b35628ec99e6b03380bdedec2a0135d5f9Leon Scroggins III 78