Last active
September 21, 2024 18:27
-
-
Save TheGreatSageEqualToHeaven/35391fa59a37e89898232650c2290392 to your computer and use it in GitHub Desktop.
Lua 5.1 Opcode Case Test File
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- load | |
local math = math -- GETGLOBAL | |
local newproxy = newproxy -- GETGLOBAL | |
local ipairs = ipairs -- GETGLOBAL | |
local floor = math.floor -- GETTABLE KST(C) | |
local pi = math.pi -- GETTABLE KST(C) | |
local _nil = nil -- LOADNIL B -> C (1) | |
local _true = true -- LOADBOOL B(1) | |
local _false = false -- LOADBOOL B(0) | |
local _kst = "Hello World" -- LOADK | |
local _1 = 1 -- LOADK | |
local _2 = 2 -- LOADK | |
local _3 = 3 -- LOADK | |
local a,b,c,d,e,f,g,h,i,j,k -- LOADNIL B -> C (10) | |
NEW_GLOBAL = gbl; -- GETGLOBAL SETGLOBAL | |
local ds = pi + pi -- ADD | |
local ds = pi + 1 -- ADD KST(C) | |
local ds = 1 + pi -- ADD KST(B) | |
local ds = pi - pi -- SUB | |
local ds = pi - 1 -- SUB KST(C) | |
local ds = 1 - pi -- SUB KST(B) | |
local ds = pi * pi -- MUL | |
local ds = pi * 1 -- MUL KST(C) | |
local ds = 1 * pi -- MUL KST(B) | |
local ds = pi / pi -- DIV | |
local ds = pi / 1 -- DIV KST(C) | |
local ds = 1 / pi -- DIV KST(B) | |
local ds = pi ^ pi -- POW | |
local ds = pi ^ 1 -- POW KST(C) | |
local ds = 1 ^ pi -- POW KST(B) | |
local ds = pi % pi -- MOD | |
local ds = pi % 1 -- MOD KST(C) | |
local ds = 1 % pi -- MOD KST(B) | |
-- [[ MOVE's ]] -- | |
local ds = _kst .. _kst -- CONCAT B -> C (1) | |
local ds = _kst .. _kst .. _kst -- B -> C (2) | |
local ds = _kst .. _kst .. _kst .. _kst -- B -> C (3) | |
local ds = -_1; -- UNM | |
local ds = not _false; -- NOT | |
local ds = #_kst; -- LEN | |
-- cf | |
-- [[ LOADK / MOVE ]] -- | |
for ds = _1, _2 do -- sbx(-1) | |
end | |
for ds = _1, _2, _3 do -- sbx(-1) | |
end | |
for ds = _1, _2, _3 do -- sbx(-2) | |
local ds -- LOADNIL B -> C (0) | |
end | |
while _false do -- TEST C(0) JMP sbx(1) sbx(-3) | |
end | |
while _false do -- TEST C(0) JMP sbx(1) sbx(-4) | |
local ds -- LOADNIL B -> C (0) | |
end | |
while not _true do -- TEST C(1) JMP sbx(1) sbx(-4) | |
end | |
while not _true do -- TEST C(1) JMP sbx(1) sbx(-4) | |
local ds -- LOADNIL B -> C (0) | |
end | |
repeat | |
until _true -- TEST C(0) JMP sbx(-2) | |
repeat | |
local ds -- LOADNIL B -> C (0) | |
until _true -- TEST C(0) JMP sbx(-3) | |
repeat | |
until not _false -- TEST C(1) JMP sbx(-2) | |
repeat | |
local ds -- LOADNIL B -> C (0) | |
until not _false -- TEST C(1) JMP sbx(-3) | |
local ds = b or c -- TESTSET C(1) | |
local ds = not b or c -- TESTSET C(0) | |
-- [[ JMP sBx(1) LOADBOOL LOADBOOL ]] -- | |
local ds = pi == 1; -- EQ A(1) KST(C) | |
local ds = 1 == pi; -- EQ A(1) KST(B) | |
local ds = pi == pi; -- EQ A(1) EQ | |
local ds = 1 == 1; -- EQ A(1) KST(B) KST(C) | |
local ds = pi ~= 1; -- EQ A(0) KST(C) | |
local ds = 1 ~= pi; -- EQ A(0) KST(B) | |
local ds = pi ~= pi; -- EQ A(0) EQ | |
local ds = 1 ~= 1; -- EQ A(0) KST(B) KST(C) | |
local ds = pi <= 1; -- EQ A(1) KST(C) | |
local ds = 1 <= pi; -- EQ A(1) KST(B) | |
local ds = pi <= pi; -- EQ A(1) EQ | |
local ds = 1 <= 1; -- EQ A(1) KST(B) KST(C) | |
local ds = pi >= 1; -- EQ A(1) KST(C) | |
local ds = 1 >= pi; -- EQ A(1) KST(B) | |
local ds = pi >= pi; -- EQ A(1) EQ | |
local ds = 1 >= 1; -- EQ A(1) KST(B) KST(C) | |
-- [[ MOVE ]] -- | |
newproxy() -- CALL B(1) C(1) | |
local a = newproxy() -- CALL B(1) C(2) | |
local a,b = newproxy() -- CALL B(1) C(3) | |
local a,b,c = newproxy() -- CALL B(1) B(4) | |
-- [[ MOVE MOVE ]] -- | |
floor(pi) -- CALL B(2) C(1) | |
local a = floor(pi) -- CALL B(2) C(2) | |
local a,b = floor(pi) -- CALL B(2) C(3) | |
local a,b,c = floor(pi) -- CALL B(2) C(4) | |
-- [[ MOVE MOVE MOVE ]] -- | |
newproxy(_nil, _nil) -- CALL B(3) C(1) | |
local a = newproxy(_nil, _nil) -- CALL B(3) C(2) | |
local a,b = newproxy(_nil, _nil) -- CALL B(3) C(3) | |
local a,b,c = newproxy(_nil, _nil) -- CALL B(3) C(4) | |
local function b1() -- no upvalues | |
return n -- RETURN B(2) | |
end | |
local function b2() -- GETUPVAL | |
return _kst -- RETURN B(2) | |
end | |
local function b2m() -- GETUPVAL | |
_kst = "Goodbye World" -- SETUPVAL | |
return _kst -- RETURN B(2) | |
end | |
local function b3() -- GETUPVAL GETUPVAL | |
return _1, _2 -- RETURN B(3) | |
end | |
local function b3m() -- GETUPVAL GETUPVAL GETUPVAL | |
return _1, _2, _3 -- RETURN B(4) | |
end | |
local function b1e() | |
return _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1, _1 -- RETURN B(19) | |
end | |
local function tco(...) -- VARARG | |
return b3(...) -- TCO B(1) C = MULTI_RET | |
end | |
local function tco1() | |
return b3(_nil) -- TCO B(2) C = MULTI_RET | |
end | |
local function tco2() | |
return b3(_nil, _nil) -- TCO B(3) C = MULTI_RET | |
end | |
b1() -- CALL B(1) C(1) | |
local a = b2() -- CALL B(1) C(2) | |
b2m() -- CALL B(1) C(1) | |
local a,b = b3() -- CALL B(1) C(3) | |
local a,b,c = b3m() -- CALL B(1) C(4) | |
local a = tco() -- CALL B(1) C(2) | |
local a,b = tco1() -- CALL B(1) C(3) | |
local a,bc = tco2() -- CALL B(1) C(4) | |
local a,b,c,d,e,f,g,h,l = b1e() -- CALL B(1) C(9) | |
b1e(_nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil) -- CALL B(16) C(1) | |
local a,b,c,d,e,f,g,h,l = b1e() -- CALL B(1) C(9) | |
b1e(_nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil, _nil) -- CALL B(16) C(1) | |
-- tables | |
local _table = {} -- NEWTABLE | |
_table = { -- SETLIST B(3) C(1) | |
_1, _2, _3 | |
} | |
_table = {_1} -- SETLIST B(1) C(1) | |
_table = { -- SETLIST(B50) C(1) | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1 | |
} | |
_table = { -- SETLIST(B50) C(1) SETLIST B(50) (1) | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1 | |
,_1 | |
} | |
_table = { -- SETLIST B(50) C(1) SETLIST B(50) C(1) | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1 | |
} | |
_table = { -- SETLIST B(50) C(2 -> 4 | Encoded Block) | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
_1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, _2, _3, _1, | |
} | |
for i in ipairs(_table) do -- CALL TFORLOOP B(1) | |
end | |
for i,v in ipairs(_table) do -- CALL TFORLOOP B(2) | |
end | |
for i,v,k in ipairs(_table) do -- CALL TFORLOOP B(3) | |
end | |
for i,v,k,e in ipairs(_table) do -- CALL TFORLOOP B(2) | |
end | |
for i,v,k,e,f in ipairs(_table) do -- CALL TFORLOOP B(2) | |
end | |
_table[_kst] = _nil -- SETTABLE | |
local ds = _table[_kst] -- GETTABLE | |
_table["Index"] = _nil -- SETTABLE KST(B) | |
local ds = _table["Index"] -- GETTABLE KST(C) | |
_table[1] = _nil -- SETTABLE KST(B)N | |
local ds = _table[1] -- GETTABLE KST(C)N | |
_table = {["SELFCALL"]=function()end} -- NEWTABLE CLOSURE SETTABLE | |
_table:SELFCALL() -- SELF | |
print("PASSED") | |
return -- RETURN B(1) RETURN B(1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment