Compare commits
No commits in common. "8beb98dd715bf64b7c2a8a4c3f517dc7d05c568b" and "b2f87350981e4dd5b2176eef2b62638c495692d9" have entirely different histories.
8beb98dd71
...
b2f8735098
|
|
@ -1 +0,0 @@
|
||||||
*.luo
|
|
||||||
2
LICENSE
2
LICENSE
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (C) 2022 by Enrico Lumetti
|
Copyright (C) YEAR by AUTHOR EMAIL
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
|
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
_(index)
|
|
||||||
_(newindex)
|
|
||||||
_(gc)
|
|
||||||
_(mode)
|
|
||||||
_(eq)
|
|
||||||
_(len)
|
|
||||||
_(lt)
|
|
||||||
_(le)
|
|
||||||
_(concat)
|
|
||||||
_(call)
|
|
||||||
_(add)
|
|
||||||
_(sub)
|
|
||||||
_(mul)
|
|
||||||
_(div)
|
|
||||||
_(mod)
|
|
||||||
_(pow)
|
|
||||||
_(unm)
|
|
||||||
_(metatable)
|
|
||||||
_(tostring)
|
|
||||||
MMDEF_FFI(_)
|
|
||||||
MMDEF_PAIRS(_)
|
|
||||||
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
local readbc = require('readbc')
|
|
||||||
|
|
||||||
fp = io.open('tests/test1.luo')
|
|
||||||
header = readbc.read_header(fp)
|
|
||||||
print(header.name)
|
|
||||||
99
opcodes.txt
99
opcodes.txt
|
|
@ -1,99 +0,0 @@
|
||||||
0 _(ISLT, var, ___, var, lt) \
|
|
||||||
1 _(ISGE, var, ___, var, lt) \
|
|
||||||
2 _(ISLE, var, ___, var, le) \
|
|
||||||
3 _(ISGT, var, ___, var, le) \
|
|
||||||
4 _(ISEQV, var, ___, var, eq) \
|
|
||||||
5 _(ISNEV, var, ___, var, eq) \
|
|
||||||
6 _(ISEQS, var, ___, str, eq) \
|
|
||||||
7 _(ISNES, var, ___, str, eq) \
|
|
||||||
8 _(ISEQN, var, ___, num, eq) \
|
|
||||||
9 _(ISNEN, var, ___, num, eq) \
|
|
||||||
10 _(ISEQP, var, ___, pri, eq) \
|
|
||||||
11 _(ISNEP, var, ___, pri, eq) \
|
|
||||||
12 _(ISTC, dst, ___, var, ___) \
|
|
||||||
13 _(ISFC, dst, ___, var, ___) \
|
|
||||||
14 _(IST, ___, ___, var, ___) \
|
|
||||||
15 _(ISF, ___, ___, var, ___) \
|
|
||||||
16 _(ISTYPE, var, ___, lit, ___) \
|
|
||||||
17 _(ISNUM, var, ___, lit, ___) \
|
|
||||||
18 _(MOV, dst, ___, var, ___) \
|
|
||||||
19 _(NOT, dst, ___, var, ___) \
|
|
||||||
20 _(UNM, dst, ___, var, unm) \
|
|
||||||
21 _(LEN, dst, ___, var, len) \
|
|
||||||
22 _(ADDVN, dst, var, num, add) \
|
|
||||||
23 _(SUBVN, dst, var, num, sub) \
|
|
||||||
24 _(MULVN, dst, var, num, mul) \
|
|
||||||
25 _(DIVVN, dst, var, num, div) \
|
|
||||||
26 _(MODVN, dst, var, num, mod) \
|
|
||||||
27 _(ADDNV, dst, var, num, add) \
|
|
||||||
28 _(SUBNV, dst, var, num, sub) \
|
|
||||||
29 _(MULNV, dst, var, num, mul) \
|
|
||||||
30 _(DIVNV, dst, var, num, div) \
|
|
||||||
31 _(MODNV, dst, var, num, mod) \
|
|
||||||
32 _(ADDVV, dst, var, var, add) \
|
|
||||||
33 _(SUBVV, dst, var, var, sub) \
|
|
||||||
34 _(MULVV, dst, var, var, mul) \
|
|
||||||
35 _(DIVVV, dst, var, var, div) \
|
|
||||||
36 _(MODVV, dst, var, var, mod) \
|
|
||||||
37 _(POW, dst, var, var, pow) \
|
|
||||||
38 _(CAT, dst, rbase, rbase, concat) \
|
|
||||||
39 _(KSTR, dst, ___, str, ___) \
|
|
||||||
40 _(KCDATA, dst, ___, cdata, ___) \
|
|
||||||
41 _(KSHORT, dst, ___, lits, ___) \
|
|
||||||
42 _(KNUM, dst, ___, num, ___) \
|
|
||||||
43 _(KPRI, dst, ___, pri, ___) \
|
|
||||||
44 _(KNIL, base, ___, base, ___) \
|
|
||||||
45 _(UGET, dst, ___, uv, ___) \
|
|
||||||
46 _(USETV, uv, ___, var, ___) \
|
|
||||||
47 _(USETS, uv, ___, str, ___) \
|
|
||||||
48 _(USETN, uv, ___, num, ___) \
|
|
||||||
49 _(USETP, uv, ___, pri, ___) \
|
|
||||||
50 _(UCLO, rbase, ___, jump, ___) \
|
|
||||||
51 _(FNEW, dst, ___, func, gc) \
|
|
||||||
52 _(TNEW, dst, ___, lit, gc) \
|
|
||||||
53 _(TDUP, dst, ___, tab, gc) \
|
|
||||||
54 _(GGET, dst, ___, str, index) \
|
|
||||||
55 _(GSET, var, ___, str, newindex) \
|
|
||||||
56 _(TGETV, dst, var, var, index) \
|
|
||||||
57 _(TGETS, dst, var, str, index) \
|
|
||||||
58 _(TGETB, dst, var, lit, index) \
|
|
||||||
59 _(TGETR, dst, var, var, index) \
|
|
||||||
60 _(TSETV, var, var, var, newindex) \
|
|
||||||
61 _(TSETS, var, var, str, newindex) \
|
|
||||||
62 _(TSETB, var, var, lit, newindex) \
|
|
||||||
63 _(TSETM, base, ___, num, newindex) \
|
|
||||||
64 _(TSETR, var, var, var, newindex) \
|
|
||||||
65 _(CALLM, base, lit, lit, call) \
|
|
||||||
66 _(CALL, base, lit, lit, call) \
|
|
||||||
67 _(CALLMT, base, ___, lit, call) \
|
|
||||||
68 _(CALLT, base, ___, lit, call) \
|
|
||||||
69 _(ITERC, base, lit, lit, call) \
|
|
||||||
70 _(ITERN, base, lit, lit, call) \
|
|
||||||
71 _(VARG, base, lit, lit, ___) \
|
|
||||||
72 _(ISNEXT, base, ___, jump, ___) \
|
|
||||||
73 _(RETM, base, ___, lit, ___) \
|
|
||||||
74 _(RET, rbase, ___, lit, ___) \
|
|
||||||
75 _(RET0, rbase, ___, lit, ___) \
|
|
||||||
76 _(RET1, rbase, ___, lit, ___) \
|
|
||||||
77 _(FORI, base, ___, jump, ___) \
|
|
||||||
78 _(JFORI, base, ___, jump, ___) \
|
|
||||||
79 _(FORL, base, ___, jump, ___) \
|
|
||||||
80 _(IFORL, base, ___, jump, ___) \
|
|
||||||
81 _(JFORL, base, ___, lit, ___) \
|
|
||||||
82 _(ITERL, base, ___, jump, ___) \
|
|
||||||
83 _(IITERL, base, ___, jump, ___) \
|
|
||||||
84 _(JITERL, base, ___, lit, ___) \
|
|
||||||
85 _(LOOP, rbase, ___, jump, ___) \
|
|
||||||
86 _(ILOOP, rbase, ___, jump, ___) \
|
|
||||||
87 _(JLOOP, rbase, ___, lit, ___) \
|
|
||||||
88 _(JMP, rbase, ___, jump, ___) \
|
|
||||||
89 _(FUNCF, rbase, ___, ___, ___) \
|
|
||||||
90 _(IFUNCF, rbase, ___, ___, ___) \
|
|
||||||
91 _(JFUNCF, rbase, ___, lit, ___) \
|
|
||||||
92 _(FUNCV, rbase, ___, ___, ___) \
|
|
||||||
93 _(IFUNCV, rbase, ___, ___, ___) \
|
|
||||||
94 _(JFUNCV, rbase, ___, lit, ___) \
|
|
||||||
95 _(FUNCC, rbase, ___, ___, ___) \
|
|
||||||
96 _(FUNCCW, rbase, ___, ___, ___)
|
|
||||||
|
|
||||||
|
|
||||||
51
readbc.lua
51
readbc.lua
|
|
@ -1,51 +0,0 @@
|
||||||
-- module for reading serialized lua bytecode
|
|
||||||
|
|
||||||
local bit=require('bit')
|
|
||||||
|
|
||||||
local HEADER_MAGIC = {27, string.byte('L'), string.byte('J')}
|
|
||||||
local HEADER_FLAG_STRIP = 0x02
|
|
||||||
|
|
||||||
local function read_uleb128(fp)
|
|
||||||
local last_byte = false
|
|
||||||
local res = 0
|
|
||||||
local shift = 0
|
|
||||||
-- the bytes are read from the LSB to the MSB
|
|
||||||
while not last_byte do
|
|
||||||
local uleb_byte = string.byte(fp:read(1))
|
|
||||||
res = bit.bor(res, bit.lshift(bit.band(uleb_byte, 0x7f), shift))
|
|
||||||
|
|
||||||
if bit.band(uleb_byte, 0x80) == 0 then
|
|
||||||
last_byte = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return res
|
|
||||||
end
|
|
||||||
|
|
||||||
local function read_header(fp)
|
|
||||||
local magic = { string.byte(fp:read(3), 1, 3) }
|
|
||||||
local version = string.byte(fp:read(1))
|
|
||||||
local flags = read_uleb128(fp)
|
|
||||||
|
|
||||||
local name
|
|
||||||
if bit.band(flags, HEADER_FLAG_STRIP) ~= 0 then
|
|
||||||
name = ''
|
|
||||||
else
|
|
||||||
local nameLen = read_uleb128(fp)
|
|
||||||
name = fp:read(nameLen)
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
magic = magic,
|
|
||||||
version = version,
|
|
||||||
flags = flags,
|
|
||||||
name = name,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function read_proto(fp)
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
read_header = read_header,
|
|
||||||
read_proto = read_proto,
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
for f in $(ls *.lua); do
|
|
||||||
luajit -bg $f "$(echo $f | cut -f 1 -d '.').luo"
|
|
||||||
done
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
local x = 24
|
|
||||||
73
vm.lua
73
vm.lua
|
|
@ -1,73 +0,0 @@
|
||||||
local funcbc = require('jit.util').funcbc
|
|
||||||
|
|
||||||
function opcode(id, name, a, b, c, metamethod)
|
|
||||||
return {
|
|
||||||
id=id,
|
|
||||||
name=name,
|
|
||||||
a=a,
|
|
||||||
b=b,
|
|
||||||
c=c,
|
|
||||||
methametod=metamethod,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
function gen_opcodes(tbl)
|
|
||||||
length = #tbl
|
|
||||||
res = {}
|
|
||||||
for i=1,length do
|
|
||||||
res[i] = i+1
|
|
||||||
end
|
|
||||||
return res
|
|
||||||
end
|
|
||||||
|
|
||||||
Mode = {
|
|
||||||
none = 0,
|
|
||||||
dst = 1,
|
|
||||||
base = 2,
|
|
||||||
var = 3,,
|
|
||||||
rbase = 4,
|
|
||||||
uv = 5,
|
|
||||||
lit = 6,
|
|
||||||
lits = 7,
|
|
||||||
pri = 8,
|
|
||||||
num = 9,
|
|
||||||
str = 10,
|
|
||||||
tab = 11,
|
|
||||||
func = 12,
|
|
||||||
jump = 13,
|
|
||||||
cdata = 14,
|
|
||||||
max = 15,
|
|
||||||
none = 15, -- same as max
|
|
||||||
}
|
|
||||||
|
|
||||||
Metamethod = {
|
|
||||||
index = 0,
|
|
||||||
newindex = 1,
|
|
||||||
gc = 2,
|
|
||||||
mode = 3,
|
|
||||||
eq = 4,
|
|
||||||
len = 5,
|
|
||||||
lt = 6,
|
|
||||||
le = 7,
|
|
||||||
concat = 8,
|
|
||||||
call = 9,
|
|
||||||
add = 10,
|
|
||||||
sub = 11,
|
|
||||||
mul = 12,
|
|
||||||
div = 13,
|
|
||||||
mod = 14,
|
|
||||||
pow = 15,
|
|
||||||
unm = 16,
|
|
||||||
metatable = 17,
|
|
||||||
tostring = 18,
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcodes = gen_opcodes {
|
|
||||||
opcode(37, 'POW', Mode.dst, Mode.none, Mode.lits, Metamethod.none),
|
|
||||||
opcode(41, 'KSHORT', Mode.dst, Mode.var, Mode.var, Metamethod.pow),
|
|
||||||
}
|
|
||||||
|
|
||||||
print(Opcodes[1])
|
|
||||||
ins, m = funcbc(test1, 3) -- TODO: what is m?
|
|
||||||
print(ins)
|
|
||||||
print(m)
|
|
||||||
Loading…
Reference in New Issue