176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** $Id: ltm.c,v 2.14.1.1 2013/04/12 18:48:47 roberto Exp $ 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Tag methods 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** See Copyright Notice in lua.h 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ltm_c 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LUA_CORE 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lua.h" 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lobject.h" 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstate.h" 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstring.h" 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltable.h" 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltm.h" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char udatatypename[] = "userdata"; 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = { 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "no value", 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "nil", "boolean", udatatypename, "number", 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "string", "table", "function", udatatypename, "thread", 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "proto", "upval" /* these last two cases are used for tests only */ 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaT_init (lua_State *L) { 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *const luaT_eventname[] = { /* ORDER TM */ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "__index", "__newindex", 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "__gc", "__mode", "__len", "__eq", 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "__add", "__sub", "__mul", "__div", "__mod", 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "__pow", "__unm", "__lt", "__le", 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "__concat", "__call" 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i=0; i<TM_N; i++) { 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]); 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaS_fix(G(L)->tmname[i]); /* never collect these names */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** function to be used with macro "fasttm": optimized for absence of 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** tag methods 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst TValue *luaT_gettm (Table *events, TMS event, TString *ename) { 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *tm = luaH_getstr(events, ename); 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(event <= TM_EQ); 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttisnil(tm)) { /* no tag method? */ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman events->flags |= cast_byte(1u<<event); /* cache this fact */ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return tm; 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *mt; 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttypenv(o)) { 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTABLE: 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = hvalue(o)->metatable; 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = uvalue(o)->metatable; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = G(L)->mt[ttypenv(o)]; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78