xref: /aosp_15_r20/external/lua/src/ltm.h (revision 088332b5b69e7ab13924864b272aabfc2509d2d5)
1*088332b5SXin Li /*
2*088332b5SXin Li ** $Id: ltm.h $
3*088332b5SXin Li ** Tag methods
4*088332b5SXin Li ** See Copyright Notice in lua.h
5*088332b5SXin Li */
6*088332b5SXin Li 
7*088332b5SXin Li #ifndef ltm_h
8*088332b5SXin Li #define ltm_h
9*088332b5SXin Li 
10*088332b5SXin Li 
11*088332b5SXin Li #include "lobject.h"
12*088332b5SXin Li 
13*088332b5SXin Li 
14*088332b5SXin Li /*
15*088332b5SXin Li * WARNING: if you change the order of this enumeration,
16*088332b5SXin Li * grep "ORDER TM" and "ORDER OP"
17*088332b5SXin Li */
18*088332b5SXin Li typedef enum {
19*088332b5SXin Li   TM_INDEX,
20*088332b5SXin Li   TM_NEWINDEX,
21*088332b5SXin Li   TM_GC,
22*088332b5SXin Li   TM_MODE,
23*088332b5SXin Li   TM_LEN,
24*088332b5SXin Li   TM_EQ,  /* last tag method with fast access */
25*088332b5SXin Li   TM_ADD,
26*088332b5SXin Li   TM_SUB,
27*088332b5SXin Li   TM_MUL,
28*088332b5SXin Li   TM_MOD,
29*088332b5SXin Li   TM_POW,
30*088332b5SXin Li   TM_DIV,
31*088332b5SXin Li   TM_IDIV,
32*088332b5SXin Li   TM_BAND,
33*088332b5SXin Li   TM_BOR,
34*088332b5SXin Li   TM_BXOR,
35*088332b5SXin Li   TM_SHL,
36*088332b5SXin Li   TM_SHR,
37*088332b5SXin Li   TM_UNM,
38*088332b5SXin Li   TM_BNOT,
39*088332b5SXin Li   TM_LT,
40*088332b5SXin Li   TM_LE,
41*088332b5SXin Li   TM_CONCAT,
42*088332b5SXin Li   TM_CALL,
43*088332b5SXin Li   TM_CLOSE,
44*088332b5SXin Li   TM_N		/* number of elements in the enum */
45*088332b5SXin Li } TMS;
46*088332b5SXin Li 
47*088332b5SXin Li 
48*088332b5SXin Li /*
49*088332b5SXin Li ** Mask with 1 in all fast-access methods. A 1 in any of these bits
50*088332b5SXin Li ** in the flag of a (meta)table means the metatable does not have the
51*088332b5SXin Li ** corresponding metamethod field. (Bit 7 of the flag is used for
52*088332b5SXin Li ** 'isrealasize'.)
53*088332b5SXin Li */
54*088332b5SXin Li #define maskflags	(~(~0u << (TM_EQ + 1)))
55*088332b5SXin Li 
56*088332b5SXin Li 
57*088332b5SXin Li /*
58*088332b5SXin Li ** Test whether there is no tagmethod.
59*088332b5SXin Li ** (Because tagmethods use raw accesses, the result may be an "empty" nil.)
60*088332b5SXin Li */
61*088332b5SXin Li #define notm(tm)	ttisnil(tm)
62*088332b5SXin Li 
63*088332b5SXin Li 
64*088332b5SXin Li #define gfasttm(g,et,e) ((et) == NULL ? NULL : \
65*088332b5SXin Li   ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
66*088332b5SXin Li 
67*088332b5SXin Li #define fasttm(l,et,e)	gfasttm(G(l), et, e)
68*088332b5SXin Li 
69*088332b5SXin Li #define ttypename(x)	luaT_typenames_[(x) + 1]
70*088332b5SXin Li 
71*088332b5SXin Li LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTYPES];)
72*088332b5SXin Li 
73*088332b5SXin Li 
74*088332b5SXin Li LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o);
75*088332b5SXin Li 
76*088332b5SXin Li LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
77*088332b5SXin Li LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
78*088332b5SXin Li                                                        TMS event);
79*088332b5SXin Li LUAI_FUNC void luaT_init (lua_State *L);
80*088332b5SXin Li 
81*088332b5SXin Li LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
82*088332b5SXin Li                             const TValue *p2, const TValue *p3);
83*088332b5SXin Li LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f,
84*088332b5SXin Li                             const TValue *p1, const TValue *p2, StkId p3);
85*088332b5SXin Li LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
86*088332b5SXin Li                               StkId res, TMS event);
87*088332b5SXin Li LUAI_FUNC void luaT_tryconcatTM (lua_State *L);
88*088332b5SXin Li LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1,
89*088332b5SXin Li        const TValue *p2, int inv, StkId res, TMS event);
90*088332b5SXin Li LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2,
91*088332b5SXin Li                                int inv, StkId res, TMS event);
92*088332b5SXin Li LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,
93*088332b5SXin Li                                 const TValue *p2, TMS event);
94*088332b5SXin Li LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2,
95*088332b5SXin Li                                  int inv, int isfloat, TMS event);
96*088332b5SXin Li 
97*088332b5SXin Li LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams,
98*088332b5SXin Li                                    struct CallInfo *ci, const Proto *p);
99*088332b5SXin Li LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci,
100*088332b5SXin Li                                               StkId where, int wanted);
101*088332b5SXin Li 
102*088332b5SXin Li 
103*088332b5SXin Li #endif
104