mirror of
https://github.com/lua/lua
synced 2024-11-25 22:29:39 +03:00
4cd1f4aac0
Start of the implementation of "scoped variables" or "to be closed" variables, local variables whose '__close' (or themselves) are called when they go out of scope. This commit implements the syntax, the opcode, and the creation of the corresponding upvalue, but it still does not call the finalizations when the variable goes out of scope (the most important part). Currently, the syntax is 'local scoped name = exp', but that will probably change.
102 lines
3.6 KiB
C
102 lines
3.6 KiB
C
/*
|
|
** $Id: lopcodes.c $
|
|
** Opcodes for Lua virtual machine
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#define lopcodes_c
|
|
#define LUA_CORE
|
|
|
|
#include "lprefix.h"
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "lopcodes.h"
|
|
|
|
|
|
/* ORDER OP */
|
|
|
|
LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
|
|
/* OT IT T A mode opcode */
|
|
opmode(0, 0, 0, 1, iABC) /* OP_MOVE */
|
|
,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADI */
|
|
,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADF */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_LOADK */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_LOADKX */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LOADBOOL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LOADNIL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETUPVAL */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETUPVAL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETTABUP */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETTABLE */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETFIELD */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETTABUP */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETTABLE */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETI */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETFIELD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_NEWTABLE */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SELF */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_ADDI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SUBI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MULI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MODI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_POWI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_DIVI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_IDIVI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BANDK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BORK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BXORK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHRI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHLI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_ADD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SUB */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MUL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MOD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_POW */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_DIV */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_IDIV */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BAND */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BOR */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BXOR */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHR */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_UNM */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BNOT */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_NOT */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LEN */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_CONCAT */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_CLOSE */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_TBC */
|
|
,opmode(0, 0, 0, 0, isJ) /* OP_JMP */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQ */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LT */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LE */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQK */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LTI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LEI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_GTI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_GEI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_TEST */
|
|
,opmode(0, 0, 1, 1, iABC) /* OP_TESTSET */
|
|
,opmode(1, 1, 0, 1, iABC) /* OP_CALL */
|
|
,opmode(1, 1, 0, 1, iABC) /* OP_TAILCALL */
|
|
,opmode(0, 1, 0, 0, iABC) /* OP_RETURN */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_RETURN0 */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_RETURN1 */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORLOOP1 */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORPREP1 */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORLOOP */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORPREP */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_TFORCALL */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_TFORLOOP */
|
|
,opmode(0, 1, 0, 0, iABC) /* OP_SETLIST */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_CLOSURE */
|
|
,opmode(1, 0, 0, 1, iABC) /* OP_VARARG */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_PREPVARARG */
|
|
,opmode(0, 0, 0, 0, iAx) /* OP_EXTRAARG */
|
|
};
|
|
|