A vararg table can be virtual. If the vararg table is used only as a base in indexing expressions, the code does not need to create an actual table for it. Instead, it compiles the indexing expressions into direct accesses to the internal vararg data.
106 lines
3.0 KiB
C
106 lines
3.0 KiB
C
/*
|
|
** $Id: ltm.h $
|
|
** Tag methods
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef ltm_h
|
|
#define ltm_h
|
|
|
|
|
|
#include "lobject.h"
|
|
|
|
|
|
/*
|
|
* WARNING: if you change the order of this enumeration,
|
|
* grep "ORDER TM" and "ORDER OP"
|
|
*/
|
|
typedef enum {
|
|
TM_INDEX,
|
|
TM_NEWINDEX,
|
|
TM_GC,
|
|
TM_MODE,
|
|
TM_LEN,
|
|
TM_EQ, /* last tag method with fast access */
|
|
TM_ADD,
|
|
TM_SUB,
|
|
TM_MUL,
|
|
TM_MOD,
|
|
TM_POW,
|
|
TM_DIV,
|
|
TM_IDIV,
|
|
TM_BAND,
|
|
TM_BOR,
|
|
TM_BXOR,
|
|
TM_SHL,
|
|
TM_SHR,
|
|
TM_UNM,
|
|
TM_BNOT,
|
|
TM_LT,
|
|
TM_LE,
|
|
TM_CONCAT,
|
|
TM_CALL,
|
|
TM_CLOSE,
|
|
TM_N /* number of elements in the enum */
|
|
} TMS;
|
|
|
|
|
|
/*
|
|
** Mask with 1 in all fast-access methods. A 1 in any of these bits
|
|
** in the flag of a (meta)table means the metatable does not have the
|
|
** corresponding metamethod field. (Bit 6 of the flag indicates that
|
|
** the table is using the dummy node; bit 7 is used for 'isrealasize'.)
|
|
*/
|
|
#define maskflags cast_byte(~(~0u << (TM_EQ + 1)))
|
|
|
|
|
|
/*
|
|
** Test whether there is no tagmethod.
|
|
** (Because tagmethods use raw accesses, the result may be an "empty" nil.)
|
|
*/
|
|
#define notm(tm) ttisnil(tm)
|
|
|
|
#define checknoTM(mt,e) ((mt) == NULL || (mt)->flags & (1u<<(e)))
|
|
|
|
#define gfasttm(g,mt,e) \
|
|
(checknoTM(mt, e) ? NULL : luaT_gettm(mt, e, (g)->tmname[e]))
|
|
|
|
#define fasttm(l,mt,e) gfasttm(G(l), mt, e)
|
|
|
|
#define ttypename(x) luaT_typenames_[(x) + 1]
|
|
|
|
LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTYPES];)
|
|
|
|
|
|
LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o);
|
|
|
|
LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
|
|
LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
|
|
TMS event);
|
|
LUAI_FUNC void luaT_init (lua_State *L);
|
|
|
|
LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
|
|
const TValue *p2, const TValue *p3);
|
|
LUAI_FUNC lu_byte luaT_callTMres (lua_State *L, const TValue *f,
|
|
const TValue *p1, const TValue *p2, StkId p3);
|
|
LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
|
|
StkId res, TMS event);
|
|
LUAI_FUNC void luaT_tryconcatTM (lua_State *L);
|
|
LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1,
|
|
const TValue *p2, int inv, StkId res, TMS event);
|
|
LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2,
|
|
int inv, StkId res, TMS event);
|
|
LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,
|
|
const TValue *p2, TMS event);
|
|
LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2,
|
|
int inv, int isfloat, TMS event);
|
|
|
|
LUAI_FUNC void luaT_adjustvarargs (lua_State *L, struct CallInfo *ci,
|
|
const Proto *p);
|
|
LUAI_FUNC void luaT_getvararg (CallInfo *ci, StkId ra, TValue *rc);
|
|
LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci,
|
|
StkId where, int wanted);
|
|
|
|
|
|
#endif
|