Lua 5.1.4: ltm.c


L0001    /*
L0002    ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
L0003    ** Tag methods
L0004    ** See Copyright Notice in lua.h
L0005    */
L0006    
L0007    
L0008    #include <string.h>
L0009    
L0010    #define ltm_c
L0011    #define LUA_CORE
L0012    
L0013    #include "lua.h"
L0014    
L0015    #include "lobject.h"
L0016    #include "lstate.h"
L0017    #include "lstring.h"
L0018    #include "ltable.h"
L0019    #include "ltm.h"
L0020    
L0021    
L0022    
L0023    const char *const luaT_typenames[] = {
L0024      "nil", "boolean", "userdata", "number",
L0025      "string", "table", "function", "userdata", "thread",
L0026      "proto", "upval"
L0027    };
L0028    
L0029    
L0030    void luaT_init (lua_State *L) {
L0031      static const char *const luaT_eventname[] = {  /* ORDER TM */
L0032        "__index", "__newindex",
L0033        "__gc", "__mode", "__eq",
L0034        "__add", "__sub", "__mul", "__div", "__mod",
L0035        "__pow", "__unm", "__len", "__lt", "__le",
L0036        "__concat", "__call"
L0037      };
L0038      int i;
L0039      for (i=0; i<TM_N; i++) {
L0040        G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
L0041        luaS_fix(G(L)->tmname[i]);  /* never collect these names */
L0042      }
L0043    }
L0044    
L0045    
L0046    /*
L0047    ** function to be used with macro "fasttm": optimized for absence of
L0048    ** tag methods
L0049    */
L0050    const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
L0051      const TValue *tm = luaH_getstr(events, ename);
L0052      lua_assert(event <= TM_EQ);
L0053      if (ttisnil(tm)) {  /* no tag method? */
L0054        events->flags |= cast_byte(1u<<event);  /* cache this fact */
L0055        return NULL;
L0056      }
L0057      else return tm;
L0058    }
L0059    
L0060    
L0061    const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
L0062      Table *mt;
L0063      switch (ttype(o)) {
L0064        case LUA_TTABLE:
L0065          mt = hvalue(o)->metatable;
L0066          break;
L0067        case LUA_TUSERDATA:
L0068          mt = uvalue(o)->metatable;
L0069          break;
L0070        default:
L0071          mt = G(L)->mt[ttype(o)];
L0072      }
L0073      return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);
L0074    }
L0075    

Generated by pretty.lua