SHA256
1
0
Fork
You've already forked sil
0
No description
  • Zig 99%
  • Lua 1%
2025年12月02日 15:03:14 -06:00
src init 2025年12月02日 15:03:14 -06:00
.gitignore init 2025年12月02日 15:03:14 -06:00
build.zig init 2025年12月02日 15:03:14 -06:00
build.zig.zon init 2025年12月02日 15:03:14 -06:00
LICENSE init 2025年12月02日 15:03:14 -06:00
README.md init 2025年12月02日 15:03:14 -06:00

sil

Abandoned Lua 5.1 interpreter. Supports a few of the language features. Only open source to share the value representation and bytecode techniques.

Here's an example:

zig build run -- src/main.lua
if nil then
 print(9)
end
if true then
 print(7)
end
local x = 1 + 2 * 3
print("x is " .. x)
x = x + 1
print("x+1 is " .. x)
print("y (undefined) is " .. y)
i = 0
while i < 5 do
 print("i is " .. i)
 i = i + 1
end
if i == 5 then
 print("i is finally 5")
else
 error("unexpected")
end
person = {}
person.name = "John"
person.age = 21
print("person.name = " .. person.name)
print("person.age = " .. person.age)
person.age = person.age + 4
print("new person.age = " .. person.age)
robot = {}
robot.id = 42
setmetatable(robot, person)
print("setmetatable(robot, person)")
print("robot.name = " .. robot.name)
print("robot.age = " .. robot.age)
print("robot.id = " .. robot.id)
robot.name = robot.name .. " (Robot)"
print("new robot.name = " .. robot.name)
7
x is 7
x+1 is 8
y (undefined) is nil
i is 0
i is 1
i is 2
i is 3
i is 4
i is finally 5
person.name = John
person.age = 21
new person.age = 25
setmetatable(robot, person)
robot.name = John
robot.age = 25
robot.id = 42
new robot.name = John (Robot)
debug: bytecode={ 0, 0, 0, 28, 26, 0, 3, 3, 0, 6, 0, 0, 0, 1, 0, 6, 1, 0, 2, 0, 0, 30, 1, 0, 1, 0, 26, 3, 0, 0, 2, 0, 28, 26, 0, 3, 3, 0, 6, 2, 0, 0, 3, 0, 6, 3, 0, 2, 2, 0, 30, 3, 0, 1, 0, 26, 3, 0, 0, 4, 0, 6, 4, 0, 0, 5, 0, 6, 5, 0, 0, 6, 0, 12, 5, 0, 10, 4, 0, 6, 6, 0, 3, 3, 0, 6, 7, 0, 0, 7, 0, 6, 8, 0, 2, 6, 0, 25, 8, 0, 6, 9, 0, 2, 7, 0, 30, 9, 0, 1, 0, 2, 6, 0, 6, 10, 0, 0, 4, 0, 10, 10, 0, 6, 6, 0, 3, 3, 0, 6, 11, 0, 0, 8, 0, 6, 12, 0, 2, 6, 0, 25, 12, 0, 6, 13, 0, 2, 11, 0, 30, 13, 0, 1, 0, 3, 3, 0, 6, 14, 0, 0, 9, 0, 6, 15, 0, 3, 5, 0, 25, 15, 0, 6, 16, 0, 2, 14, 0, 30, 16, 0, 1, 0, 0, 10, 0, 7, 6, 0, 3, 6, 0, 6, 17, 0, 0, 11, 0, 19, 17, 0, 28, 50, 0, 3, 3, 0, 6, 18, 0, 0, 12, 0, 6, 19, 0, 3, 6, 0, 25, 19, 0, 6, 20, 0, 2, 18, 0, 30, 20, 0, 1, 0, 3, 6, 0, 6, 21, 0, 0, 4, 0, 10, 21, 0, 7, 6, 0, 26, 197, 255, 3, 6, 0, 6, 22, 0, 0, 11, 0, 17, 22, 0, 28, 26, 0, 3, 3, 0, 6, 23, 0, 0, 13, 0, 6, 24, 0, 2, 23, 0, 30, 24, 0, 1, 0, 26, 23, 0, 3, 2, 0, 6, 25, 0, 0, 14, 0, 6, 26, 0, 2, 25, 0, 30, 26, 0, 1, 0, 1, 7, 7, 0, 3, 7, 0, 6, 27, 0, 0, 15, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 16, 0, 0, 0, 0, 0, 3, 7, 0, 6, 28, 0, 0, 17, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 18, 0, 0, 0, 0, 0, 3, 3, 0, 6, 29, 0, 0, 19, 0, 6, 30, 0, 3, 7, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 25, 30, 0, 6, 31, 0, 2, 29, 0, 30, 31, 0, 1, 0, 3, 3, 0, 6, 32, 0, 0, 20, 0, 6, 33, 0, 3, 7, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 25, 33, 0, 6, 34, 0, 2, 32, 0, 30, 34, 0, 1, 0, 3, 7, 0, 6, 35, 0, 3, 7, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 142, 235, 27, 127, 0, 0, 6, 36, 0, 0, 21, 0, 10, 36, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 0, 0, 3, 3, 0, 6, 37, 0, 0, 22, 0, 6, 38, 0, 3, 7, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 25, 38, 0, 6, 39, 0, 2, 37, 0, 30, 39, 0, 1, 0, 1, 7, 8, 0, 3, 8, 0, 6, 40, 0, 0, 23, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 24, 0, 0, 0, 0, 0, 3, 4, 0, 6, 41, 0, 3, 8, 0, 6, 42, 0, 3, 7, 0, 6, 43, 0, 2, 41, 0, 30, 42, 0, 2, 0, 3, 3, 0, 6, 44, 0, 0, 25, 0, 6, 45, 0, 2, 44, 0, 30, 45, 0, 1, 0, 3, 3, 0, 6, 46, 0, 0, 26, 0, 6, 47, 0, 3, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 25, 47, 0, 6, 48, 0, 2, 46, 0, 30, 48, 0, 1, 0, 3, 3, 0, 6, 49, 0, 0, 27, 0, 6, 50, 0, 3, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 25, 50, 0, 6, 51, 0, 2, 49, 0, 30, 51, 0, 1, 0, 3, 3, 0, 6, 52, 0, 0, 28, 0, 6, 53, 0, 3, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 25, 53, 0, 6, 54, 0, 2, 52, 0, 30, 54, 0, 1, 0, 3, 8, 0, 6, 55, 0, 3, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 142, 235, 27, 127, 0, 0, 6, 56, 0, 0, 29, 0, 25, 56, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 16, 0, 0, 0, 0, 0, 3, 3, 0, 6, 57, 0, 0, 30, 0, 6, 58, 0, 3, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 25, 58, 0, 6, 59, 0, 2, 57, 0, 30, 59, 0, 1, 0, 32 }
debug: constants={ @enumFromInt(9221683186994511872), @enumFromInt(9221401712017801225), @enumFromInt(9221683186994511874), @enumFromInt(9221401712017801223), @enumFromInt(9221401712017801217), @enumFromInt(9221401712017801218), @enumFromInt(9221401712017801219), @enumFromInt(9222104419864543712), @enumFromInt(9222104419864543832), @enumFromInt(9222104419864543952), @enumFromInt(9221401712017801216), @enumFromInt(9221401712017801221), @enumFromInt(9222104419864544072), @enumFromInt(9222104419864544192), @enumFromInt(9222104419864544312), @enumFromInt(9222104419864544432), @enumFromInt(9222104419864544552), @enumFromInt(9221401712017801237), @enumFromInt(9222104419864544672), @enumFromInt(9222104419864544792), @enumFromInt(9222104419864545032), @enumFromInt(9221401712017801220), @enumFromInt(9222104419864545512), @enumFromInt(9221401712017801258), @enumFromInt(9222104419864545752), @enumFromInt(9222104419864545872), @enumFromInt(9222104419864545992), @enumFromInt(9222104419864546232), @enumFromInt(9222104419864546472), @enumFromInt(9222104419864546832), @enumFromInt(9222104419864547072) }
debug: 0 load_constant @enumFromInt(0)
debug: 3 jump_if_not @enumFromInt(26)
debug: 6 load_global @enumFromInt(3)
debug: 9 move_register @enumFromInt(0)
debug: 12 load_constant @enumFromInt(1)
debug: 15 move_register @enumFromInt(1)
debug: 18 load_register @enumFromInt(0)
debug: 21 call .{ .first_register = @enumFromInt(1), .args = 1 }
debug: 26 jump @enumFromInt(3)
debug: 29 load_constant @enumFromInt(2)
debug: 32 jump_if_not @enumFromInt(26)
debug: 35 load_global @enumFromInt(3)
debug: 38 move_register @enumFromInt(2)
debug: 41 load_constant @enumFromInt(3)
debug: 44 move_register @enumFromInt(3)
debug: 47 load_register @enumFromInt(2)
debug: 50 call .{ .first_register = @enumFromInt(3), .args = 1 }
debug: 55 jump @enumFromInt(3)
debug: 58 load_constant @enumFromInt(4)
debug: 61 move_register @enumFromInt(4)
debug: 64 load_constant @enumFromInt(5)
debug: 67 move_register @enumFromInt(5)
debug: 70 load_constant @enumFromInt(6)
debug: 73 multiplication @enumFromInt(5)
debug: 76 addition @enumFromInt(4)
debug: 79 move_register @enumFromInt(6)
debug: 82 load_global @enumFromInt(3)
debug: 85 move_register @enumFromInt(7)
debug: 88 load_constant @enumFromInt(7)
debug: 91 move_register @enumFromInt(8)
debug: 94 load_register @enumFromInt(6)
debug: 97 concatenation @enumFromInt(8)
debug: 100 move_register @enumFromInt(9)
debug: 103 load_register @enumFromInt(7)
debug: 106 call .{ .first_register = @enumFromInt(9), .args = 1 }
debug: 111 load_register @enumFromInt(6)
debug: 114 move_register @enumFromInt(10)
debug: 117 load_constant @enumFromInt(4)
debug: 120 addition @enumFromInt(10)
debug: 123 move_register @enumFromInt(6)
debug: 126 load_global @enumFromInt(3)
debug: 129 move_register @enumFromInt(11)
debug: 132 load_constant @enumFromInt(8)
debug: 135 move_register @enumFromInt(12)
debug: 138 load_register @enumFromInt(6)
debug: 141 concatenation @enumFromInt(12)
debug: 144 move_register @enumFromInt(13)
debug: 147 load_register @enumFromInt(11)
debug: 150 call .{ .first_register = @enumFromInt(13), .args = 1 }
debug: 155 load_global @enumFromInt(3)
debug: 158 move_register @enumFromInt(14)
debug: 161 load_constant @enumFromInt(9)
debug: 164 move_register @enumFromInt(15)
debug: 167 load_global @enumFromInt(5)
debug: 170 concatenation @enumFromInt(15)
debug: 173 move_register @enumFromInt(16)
debug: 176 load_register @enumFromInt(14)
debug: 179 call .{ .first_register = @enumFromInt(16), .args = 1 }
debug: 184 load_constant @enumFromInt(10)
debug: 187 move_global @enumFromInt(6)
debug: 190 load_global @enumFromInt(6)
debug: 193 move_register @enumFromInt(17)
debug: 196 load_constant @enumFromInt(11)
debug: 199 less_than @enumFromInt(17)
debug: 202 jump_if_not @enumFromInt(50)
debug: 205 load_global @enumFromInt(3)
debug: 208 move_register @enumFromInt(18)
debug: 211 load_constant @enumFromInt(12)
debug: 214 move_register @enumFromInt(19)
debug: 217 load_global @enumFromInt(6)
debug: 220 concatenation @enumFromInt(19)
debug: 223 move_register @enumFromInt(20)
debug: 226 load_register @enumFromInt(18)
debug: 229 call .{ .first_register = @enumFromInt(20), .args = 1 }
debug: 234 load_global @enumFromInt(6)
debug: 237 move_register @enumFromInt(21)
debug: 240 load_constant @enumFromInt(4)
debug: 243 addition @enumFromInt(21)
debug: 246 move_global @enumFromInt(6)
debug: 249 jump @enumFromInt(-59)
debug: 252 load_global @enumFromInt(6)
debug: 255 move_register @enumFromInt(22)
debug: 258 load_constant @enumFromInt(11)
debug: 261 equal @enumFromInt(22)
debug: 264 jump_if_not @enumFromInt(26)
debug: 267 load_global @enumFromInt(3)
debug: 270 move_register @enumFromInt(23)
debug: 273 load_constant @enumFromInt(13)
debug: 276 move_register @enumFromInt(24)
debug: 279 load_register @enumFromInt(23)
debug: 282 call .{ .first_register = @enumFromInt(24), .args = 1 }
debug: 287 jump @enumFromInt(23)
debug: 290 load_global @enumFromInt(2)
debug: 293 move_register @enumFromInt(25)
debug: 296 load_constant @enumFromInt(14)
debug: 299 move_register @enumFromInt(26)
debug: 302 load_register @enumFromInt(25)
debug: 305 call .{ .first_register = @enumFromInt(26), .args = 1 }
debug: 310 load_table void
debug: 311 move_global @enumFromInt(7)
debug: 314 load_global @enumFromInt(7)
debug: 317 move_register @enumFromInt(27)
debug: 320 load_constant @enumFromInt(15)
debug: 323 move_field .{ .table = @enumFromInt(27), .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 348 load_global @enumFromInt(7)
debug: 351 move_register @enumFromInt(28)
debug: 354 load_constant @enumFromInt(17)
debug: 357 move_field .{ .table = @enumFromInt(28), .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 382 load_global @enumFromInt(3)
debug: 385 move_register @enumFromInt(29)
debug: 388 load_constant @enumFromInt(19)
debug: 391 move_register @enumFromInt(30)
debug: 394 load_global @enumFromInt(7)
debug: 397 load_named_field .{ .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 422 concatenation @enumFromInt(30)
debug: 425 move_register @enumFromInt(31)
debug: 428 load_register @enumFromInt(29)
debug: 431 call .{ .first_register = @enumFromInt(31), .args = 1 }
debug: 436 load_global @enumFromInt(3)
debug: 439 move_register @enumFromInt(32)
debug: 442 load_constant @enumFromInt(20)
debug: 445 move_register @enumFromInt(33)
debug: 448 load_global @enumFromInt(7)
debug: 451 load_named_field .{ .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 476 concatenation @enumFromInt(33)
debug: 479 move_register @enumFromInt(34)
debug: 482 load_register @enumFromInt(32)
debug: 485 call .{ .first_register = @enumFromInt(34), .args = 1 }
debug: 490 load_global @enumFromInt(7)
debug: 493 move_register @enumFromInt(35)
debug: 496 load_global @enumFromInt(7)
debug: 499 load_named_field .{ .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 524 move_register @enumFromInt(36)
debug: 527 load_constant @enumFromInt(21)
debug: 530 addition @enumFromInt(36)
debug: 533 move_field .{ .table = @enumFromInt(35), .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 558 load_global @enumFromInt(3)
debug: 561 move_register @enumFromInt(37)
debug: 564 load_constant @enumFromInt(22)
debug: 567 move_register @enumFromInt(38)
debug: 570 load_global @enumFromInt(7)
debug: 573 load_named_field .{ .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 598 concatenation @enumFromInt(38)
debug: 601 move_register @enumFromInt(39)
debug: 604 load_register @enumFromInt(37)
debug: 607 call .{ .first_register = @enumFromInt(39), .args = 1 }
debug: 612 load_table void
debug: 613 move_global @enumFromInt(8)
debug: 616 load_global @enumFromInt(8)
debug: 619 move_register @enumFromInt(40)
debug: 622 load_constant @enumFromInt(23)
debug: 625 move_field .{ .table = @enumFromInt(40), .field = @enumFromInt(24), .ic = .{ .shape = null, .index = 0 } }
debug: 650 load_global @enumFromInt(4)
debug: 653 move_register @enumFromInt(41)
debug: 656 load_global @enumFromInt(8)
debug: 659 move_register @enumFromInt(42)
debug: 662 load_global @enumFromInt(7)
debug: 665 move_register @enumFromInt(43)
debug: 668 load_register @enumFromInt(41)
debug: 671 call .{ .first_register = @enumFromInt(42), .args = 2 }
debug: 676 load_global @enumFromInt(3)
debug: 679 move_register @enumFromInt(44)
debug: 682 load_constant @enumFromInt(25)
debug: 685 move_register @enumFromInt(45)
debug: 688 load_register @enumFromInt(44)
debug: 691 call .{ .first_register = @enumFromInt(45), .args = 1 }
debug: 696 load_global @enumFromInt(3)
debug: 699 move_register @enumFromInt(46)
debug: 702 load_constant @enumFromInt(26)
debug: 705 move_register @enumFromInt(47)
debug: 708 load_global @enumFromInt(8)
debug: 711 load_named_field .{ .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 736 concatenation @enumFromInt(47)
debug: 739 move_register @enumFromInt(48)
debug: 742 load_register @enumFromInt(46)
debug: 745 call .{ .first_register = @enumFromInt(48), .args = 1 }
debug: 750 load_global @enumFromInt(3)
debug: 753 move_register @enumFromInt(49)
debug: 756 load_constant @enumFromInt(27)
debug: 759 move_register @enumFromInt(50)
debug: 762 load_global @enumFromInt(8)
debug: 765 load_named_field .{ .field = @enumFromInt(18), .ic = .{ .shape = null, .index = 0 } }
debug: 790 concatenation @enumFromInt(50)
debug: 793 move_register @enumFromInt(51)
debug: 796 load_register @enumFromInt(49)
debug: 799 call .{ .first_register = @enumFromInt(51), .args = 1 }
debug: 804 load_global @enumFromInt(3)
debug: 807 move_register @enumFromInt(52)
debug: 810 load_constant @enumFromInt(28)
debug: 813 move_register @enumFromInt(53)
debug: 816 load_global @enumFromInt(8)
debug: 819 load_named_field .{ .field = @enumFromInt(24), .ic = .{ .shape = null, .index = 0 } }
debug: 844 concatenation @enumFromInt(53)
debug: 847 move_register @enumFromInt(54)
debug: 850 load_register @enumFromInt(52)
debug: 853 call .{ .first_register = @enumFromInt(54), .args = 1 }
debug: 858 load_global @enumFromInt(8)
debug: 861 move_register @enumFromInt(55)
debug: 864 load_global @enumFromInt(8)
debug: 867 load_named_field .{ .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 892 move_register @enumFromInt(56)
debug: 895 load_constant @enumFromInt(29)
debug: 898 concatenation @enumFromInt(56)
debug: 901 move_field .{ .table = @enumFromInt(55), .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 926 load_global @enumFromInt(3)
debug: 929 move_register @enumFromInt(57)
debug: 932 load_constant @enumFromInt(30)
debug: 935 move_register @enumFromInt(58)
debug: 938 load_global @enumFromInt(8)
debug: 941 load_named_field .{ .field = @enumFromInt(16), .ic = .{ .shape = null, .index = 0 } }
debug: 966 concatenation @enumFromInt(58)
debug: 969 move_register @enumFromInt(59)
debug: 972 load_register @enumFromInt(57)
debug: 975 call .{ .first_register = @enumFromInt(59), .args = 1 }
debug: 980 eof void