mirror of
https://github.com/lua/lua
synced 2024-11-25 22:29:39 +03:00
df13f25948
In arithmetic/bitwise operators, the call to metamethods is made in a separate opcode following the main one. (The main opcode skips this next one when the operation succeeds.) This change reduces slightly the size of the binary and the complexity of the arithmetic/bitwise opcodes. It also simplfies the treatment of errors and yeld/resume in these operations, as there are much fewer cases to consider. (Only OP_MMBIN/OP_MMBINI/OP_MMBINK, instead of all variants of all arithmetic/bitwise operators.)
95 lines
2.6 KiB
C
95 lines
2.6 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;
|
|
|
|
|
|
/*
|
|
** Test whether there is no tagmethod.
|
|
** (Because tagmethods use raw accesses, the result may be an "empty" nil.)
|
|
*/
|
|
#define notm(tm) ttisnil(tm)
|
|
|
|
|
|
#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
|
|
((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
|
|
|
|
#define fasttm(l,et,e) gfasttm(G(l), et, e)
|
|
|
|
#define ttypename(x) luaT_typenames_[(x) + 1]
|
|
|
|
LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTAGS];)
|
|
|
|
|
|
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 void 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, int nfixparams,
|
|
struct CallInfo *ci, const Proto *p);
|
|
LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci,
|
|
StkId where, int wanted);
|
|
|
|
|
|
#endif
|