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.)
117 lines
1.7 KiB
C
117 lines
1.7 KiB
C
/*
|
|
** $Id: ljumptab.h $
|
|
** Jump Table for the Lua interpreter
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
|
|
#undef vmdispatch
|
|
#undef vmcase
|
|
#undef vmbreak
|
|
|
|
#define vmdispatch(x) goto *disptab[x];
|
|
|
|
#define vmcase(l) L_##l:
|
|
|
|
#define vmbreak vmfetch(); vmdispatch(GET_OPCODE(i));
|
|
|
|
|
|
static void *disptab[NUM_OPCODES] = {
|
|
|
|
#if 0
|
|
** you can update the following list with this command:
|
|
**
|
|
** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h
|
|
**
|
|
#endif
|
|
|
|
&&L_OP_MOVE,
|
|
&&L_OP_LOADI,
|
|
&&L_OP_LOADF,
|
|
&&L_OP_LOADK,
|
|
&&L_OP_LOADKX,
|
|
&&L_OP_LOADBOOL,
|
|
&&L_OP_LOADNIL,
|
|
&&L_OP_GETUPVAL,
|
|
&&L_OP_SETUPVAL,
|
|
&&L_OP_GETTABUP,
|
|
&&L_OP_GETTABLE,
|
|
&&L_OP_GETI,
|
|
&&L_OP_GETFIELD,
|
|
&&L_OP_SETTABUP,
|
|
&&L_OP_SETTABLE,
|
|
&&L_OP_SETI,
|
|
&&L_OP_SETFIELD,
|
|
&&L_OP_NEWTABLE,
|
|
&&L_OP_SELF,
|
|
&&L_OP_ADDI,
|
|
&&L_OP_SUBI,
|
|
&&L_OP_MULI,
|
|
&&L_OP_MODI,
|
|
&&L_OP_POWI,
|
|
&&L_OP_DIVI,
|
|
&&L_OP_IDIVI,
|
|
&&L_OP_ADDK,
|
|
&&L_OP_SUBK,
|
|
&&L_OP_MULK,
|
|
&&L_OP_MODK,
|
|
&&L_OP_POWK,
|
|
&&L_OP_DIVK,
|
|
&&L_OP_IDIVK,
|
|
&&L_OP_BANDK,
|
|
&&L_OP_BORK,
|
|
&&L_OP_BXORK,
|
|
&&L_OP_SHRI,
|
|
&&L_OP_SHLI,
|
|
&&L_OP_ADD,
|
|
&&L_OP_SUB,
|
|
&&L_OP_MUL,
|
|
&&L_OP_MOD,
|
|
&&L_OP_POW,
|
|
&&L_OP_DIV,
|
|
&&L_OP_IDIV,
|
|
&&L_OP_BAND,
|
|
&&L_OP_BOR,
|
|
&&L_OP_BXOR,
|
|
&&L_OP_SHL,
|
|
&&L_OP_SHR,
|
|
&&L_OP_MMBIN,
|
|
&&L_OP_MMBINI,
|
|
&&L_OP_MMBINK,
|
|
&&L_OP_UNM,
|
|
&&L_OP_BNOT,
|
|
&&L_OP_NOT,
|
|
&&L_OP_LEN,
|
|
&&L_OP_CONCAT,
|
|
&&L_OP_CLOSE,
|
|
&&L_OP_TBC,
|
|
&&L_OP_JMP,
|
|
&&L_OP_EQ,
|
|
&&L_OP_LT,
|
|
&&L_OP_LE,
|
|
&&L_OP_EQK,
|
|
&&L_OP_EQI,
|
|
&&L_OP_LTI,
|
|
&&L_OP_LEI,
|
|
&&L_OP_GTI,
|
|
&&L_OP_GEI,
|
|
&&L_OP_TEST,
|
|
&&L_OP_TESTSET,
|
|
&&L_OP_CALL,
|
|
&&L_OP_TAILCALL,
|
|
&&L_OP_RETURN,
|
|
&&L_OP_RETURN0,
|
|
&&L_OP_RETURN1,
|
|
&&L_OP_FORLOOP,
|
|
&&L_OP_FORPREP,
|
|
&&L_OP_TFORPREP,
|
|
&&L_OP_TFORCALL,
|
|
&&L_OP_TFORLOOP,
|
|
&&L_OP_SETLIST,
|
|
&&L_OP_CLOSURE,
|
|
&&L_OP_VARARG,
|
|
&&L_OP_VARARGPREP,
|
|
&&L_OP_EXTRAARG
|
|
|
|
};
|