.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user