This commit is contained in:
2026-05-09 10:37:02 -05:00
parent 83b80f6e7d
commit 8a26ba5351
3 changed files with 25 additions and 11 deletions

View File

@@ -11,9 +11,9 @@ Progress of the Lua port:
- [x] Control flow
- [x] Labels in Assembly
- [x] Recursion
- [ ] Strings
- [ ] From constants
- [ ] Garbage collection
- [x] Strings
- [x] From constants
- [x] Garbage collection
- [ ] Arrays
- [ ] Garbage collection
- [ ] Tables

View File

@@ -302,7 +302,7 @@ do TEST "VM: managed strings"
assert_eq(vm:to_string(-1), "Hello")
end
do TEST "VM: concatenate strings"
do TEST "VM: concatenate strings (GC won't delete)"
local vm = VM.new():load(assemble [[
.const
0: "Hello "
@@ -311,6 +311,7 @@ do TEST "VM: concatenate strings"
pushc 0
pushc 1
sum
gc
ret
]]):call(0)
@@ -319,7 +320,7 @@ do TEST "VM: concatenate strings"
assert_eq(vm.heap:size(), 1)
end
do TEST "VM: collect strings"
do TEST "VM: GC strings"
local vm = VM.new():load(assemble [[
.const
0: "Hello "
@@ -334,7 +335,7 @@ do TEST "VM: collect strings"
ret
]]):call(0)
print(vm:debug_heap())
-- print(vm:debug_heap())
assert_eq(vm:is(-1, 'nil'), true)
assert_eq(vm.heap:size(), 0)
end

View File

@@ -221,8 +221,8 @@ function Heap.new()
end
function Heap:add_value(value)
local key = math.random(math.mininteger, math.maxinteger)
while self.items[key] do key = math.random(math.mininteger, math.maxinteger) end
local key = math.random(1, math.maxinteger)
while self.items[key] do key = math.random(1, math.maxinteger) end
self.items[key] = value
return key
end
@@ -237,8 +237,21 @@ function Heap:size()
return n
end
function Heap:call_gc()
-- TODO
function Heap:call_gc(roots)
-- mark
local marked = {}
for _,v in ipairs(roots) do -- TODO - recursive, add support to array
if v.type == 'string' and v.ref then
marked[v.ref] = true
end
end
-- sweep
for key,_ in pairs(self.items) do
if not marked[key] then
self.items[key] = nil
end
end
end
----------------------
@@ -527,7 +540,7 @@ function VM:_step()
--
elseif op.operator == 'gc' then
self.heap:call_gc()
self.heap:call_gc(self.stack.stack)
--
-- instruction not found