···11+local frame = {}
22+33+frame.StackFrame = {
44+ funcIndex = 0,
55+ locals = {},
66+ pc = 1, -- program counter
77+}
88+99+function frame.StackFrame:new(funcIndex)
1010+ local f = {}
1111+ setmetatable(f, {__index = self})
1212+ f.funcIndex = funcIndex
1313+ return f
1414+end
1515+1616+return frame
+48
intutil.lua
···11+local intutil = {}
22+33+function intutil.fromle32(tab, idx)
44+ local n = tab[idx]
55+ n = n | tab[idx+1] << 8
66+ n = n | tab[idx+2] << 16
77+ n = n | tab[idx+3] << 24
88+ return n
99+end
1010+1111+function intutil.tole32(tab, idx, n)
1212+ tab[idx] = n & 0xFF
1313+ tab[idx+1] = (n >> 8) & 0xFF
1414+ tab[idx+2] = (n >> 16) & 0xFF
1515+ tab[idx+3] = (n >> 24) & 0xFF
1616+end
1717+1818+function intutil.fromle64(tab, idx)
1919+ local n = tab[idx]
2020+ n = n | tab[idx+1] << 8
2121+ n = n | tab[idx+2] << 16
2222+ n = n | tab[idx+3] << 24
2323+ n = n | tab[idx+4] << 32
2424+ n = n | tab[idx+5] << 40
2525+ n = n | tab[idx+6] << 48
2626+ n = n | tab[idx+7] << 56
2727+ return n
2828+end
2929+3030+function intutil.fromle64(tab, idx, n)
3131+ tab[idx] = n & 0xFF
3232+ tab[idx+1] = (n >> 8) & 0xFF
3333+ tab[idx+2] = (n >> 16) & 0xFF
3434+ tab[idx+3] = (n >> 24) & 0xFF
3535+ tab[idx+4] = (n >> 32) & 0xFF
3636+ tab[idx+5] = (n >> 40) & 0xFF
3737+ tab[idx+6] = (n >> 48) & 0xFF
3838+ tab[idx+7] = (n >> 56) & 0xFF
3939+end
4040+4141+function intutil.signexti32(n)
4242+ if (n & 0x80000000) ~= 0 then
4343+ n = n | 0xFFFFFFFF00000000
4444+ end
4545+ return n
4646+end
4747+4848+return intutil
+207-4
ops.lua
···11local ops = {}
2233+local constants = require("constants")
44+local intutil = require("intutil")
55+66+function ops.select(a, b, c)
77+ return (c ~= 0) and a or b
88+end
99+1010+--[[ i64 ]]
1111+312function ops.i64_eqz(a)
413 return (a == 0) and 1 or 0
514end
···5766 if (a & 0x8000000000000000) == 0 then
5867 n = n + 1
5968 end
6060-6169 return n
6270end
6371···117125end
118126119127function ops.i64_div_s(a, b)
120120- return a / b
128128+ return a // b
121129end
122130123131function ops.i64_rem_s(a, b)
···137145end
138146139147function ops.i64_shl(a, b)
140140- return a >> b
148148+ return a << b
141149end
142150143151function ops.i64_shr_s(a, b)
144144- return a << b
152152+ return a >> b
145153end
146154147155function ops.i64_rotl(a, b)
···152160function ops.i64_rotr(a, b)
153161 local c = b % 64
154162 return (a >> c) | (a << (64 - c))
163163+end
164164+165165+--[[ i32 ]]
166166+167167+function ops.i32_eqz(a)
168168+ return (a == 0) and 1 or 0
169169+end
170170+171171+function ops.i32_eq(a, b)
172172+ return (a == b) and 1 or 0
173173+end
174174+175175+function ops.i32_ne(a, b)
176176+ return (a ~= b) and 1 or 0
177177+end
178178+179179+function ops.i32_lt_s(a, b)
180180+ a = intutil.signexti32(a)
181181+ b = intutil.signexti32(b)
182182+ return (a < b) and 1 or 0
183183+end
184184+185185+function ops.i32_lt_s(a, b)
186186+ a = intutil.signexti32(a)
187187+ b = intutil.signexti32(b)
188188+ return (a < b) and 1 or 0
189189+end
190190+191191+function ops.i32_lt_u(a, b)
192192+ return (a < b) and 1 or 0
193193+end
194194+195195+function ops.i32_gt_s(a, b)
196196+ a = intutil.signexti32(a)
197197+ b = intutil.signexti32(b)
198198+ return (a > b) and 1 or 0
199199+end
200200+201201+function ops.i32_gt_u(a, b)
202202+ return (a > b) and 1 or 0
203203+end
204204+205205+function ops.i32_le_s(a, b)
206206+ a = intutil.signexti32(a)
207207+ b = intutil.signexti32(b)
208208+ return (a <= b) and 1 or 0
209209+end
210210+211211+function ops.i32_le_u(a, b)
212212+ return (a <= b) and 1 or 0
213213+end
214214+215215+function ops.i32_ge_s(a, b)
216216+ a = intutil.signexti32(a)
217217+ b = intutil.signexti32(b)
218218+ return (a >= b) and 1 or 0
219219+end
220220+221221+function ops.i32_ge_u(a, b)
222222+ return (a >= b) and 1 or 0
223223+end
224224+225225+function ops.i32_clz(a)
226226+ if a == 0 then
227227+ return 32
228228+ end
229229+230230+ local n = 0
231231+ if (a & 0xFFFF0000) == 0 then
232232+ n = n + 16
233233+ a = a << 16
234234+ end
235235+ if (a & 0xFF000000) == 0 then
236236+ n = n + 8
237237+ a = a << 8
238238+ end
239239+ if (a & 0xF0000000) == 0 then
240240+ n = n + 4
241241+ a = a << 4
242242+ end
243243+ if (a & 0xC0000000) == 0 then
244244+ n = n + 2
245245+ a = a << 2
246246+ end
247247+ if (a & 0x80000000) == 0 then
248248+ n = n + 1
249249+ end
250250+ return n
251251+end
252252+253253+function ops.i32_ctz(a)
254254+ if a == 0 then
255255+ return 64
256256+ end
257257+258258+ local n = 0
259259+ if (a & 0x0000FFFF) == 0 then
260260+ n = n + 16
261261+ a = a >> 16
262262+ end
263263+ if (a & 0x000000FF) == 0 then
264264+ n = n + 8
265265+ a = a >> 8
266266+ end
267267+ if (a & 0x0000000F) == 0 then
268268+ n = n + 4
269269+ a = a >> 4
270270+ end
271271+ if (a & 0x00000003) == 0 then
272272+ n = n + 2
273273+ a = a >> 2
274274+ end
275275+ if (a & 0x00000001) == 0 then
276276+ n = n + 1
277277+ end
278278+ return n
279279+end
280280+281281+function ops.i32_popcnt(a)
282282+ local n = 0
283283+ for _ = 1, 32 do
284284+ if (a & 1) == 1 then
285285+ n = n + 1
286286+ end
287287+ a = a >> 1
288288+ end
289289+ return n
290290+end
291291+292292+function ops.i32_add(a, b)
293293+ return (a + b) & constants.I32_MAX
294294+end
295295+296296+function ops.i32_sub(a, b)
297297+ return (a - b) & constants.I32_MAX
298298+end
299299+300300+function ops.i32_mul(a, b)
301301+ return (a * b) & constants.I32_MAX
302302+end
303303+304304+function ops.i32_div_s(a, b)
305305+ a = intutil.signexti32(a)
306306+ b = intutil.signexti32(b)
307307+ return (a // b) & constants.I32_MAX
308308+end
309309+310310+function ops.i32_div_u(a, b)
311311+ return (a // b) & constants.I32_MAX
312312+end
313313+314314+function ops.i32_rem_s(a, b)
315315+ a = intutil.signexti32(a)
316316+ b = intutil.signexti32(b)
317317+ return (a % b) & constants.I32_MAX
318318+end
319319+320320+function ops.i32_rem_u(a, b)
321321+ return (a % b) & constants.I32_MAX
322322+end
323323+324324+function ops.i32_and(a, b)
325325+ return a & b
326326+end
327327+328328+function ops.i32_or(a, b)
329329+ return a | b
330330+end
331331+332332+function ops.i32_xor(a, b)
333333+ return a ~ b
334334+end
335335+336336+function ops.i32_shl(a, b)
337337+ return (a << b) & constants.I32_MAX
338338+end
339339+340340+function ops.i32_shr_s(a, b)
341341+ a = intutil.signexti32(a)
342342+ b = intutil.signexti32(b)
343343+ return (a >> b) & constants.I32_MAX
344344+end
345345+346346+function ops.i32_shr_u(a, b)
347347+ return (a >> b) & constants.I32_MAX
348348+end
349349+350350+function ops.i32_rotl(a, b)
351351+ local c = b % 32
352352+ return ((a << c) | (a >> (32 - c))) & constants.I32_MAX
353353+end
354354+355355+function ops.i32_rotr(a, b)
356356+ local c = b % 32
357357+ return ((a >> c) | (a << (32 - c))) & constants.I32_MAX
155358end
156359157360return ops