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] Control flow
- [x] Labels in Assembly - [x] Labels in Assembly
- [x] Recursion - [x] Recursion
- [ ] Strings - [x] Strings
- [ ] From constants - [x] From constants
- [ ] Garbage collection - [x] Garbage collection
- [ ] Arrays - [ ] Arrays
- [ ] Garbage collection - [ ] Garbage collection
- [ ] Tables - [ ] Tables

View File

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

View File

@@ -221,8 +221,8 @@ function Heap.new()
end end
function Heap:add_value(value) function Heap:add_value(value)
local key = math.random(math.mininteger, math.maxinteger) local key = math.random(1, math.maxinteger)
while self.items[key] do key = math.random(math.mininteger, math.maxinteger) end while self.items[key] do key = math.random(1, math.maxinteger) end
self.items[key] = value self.items[key] = value
return key return key
end end
@@ -237,8 +237,21 @@ function Heap:size()
return n return n
end end
function Heap:call_gc() function Heap:call_gc(roots)
-- TODO -- 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 end
---------------------- ----------------------
@@ -527,7 +540,7 @@ function VM:_step()
-- --
elseif op.operator == 'gc' then elseif op.operator == 'gc' then
self.heap:call_gc() self.heap:call_gc(self.stack.stack)
-- --
-- instruction not found -- instruction not found