.
This commit is contained in:
2
.idea/tyche.iml
generated
Normal file
2
.idea/tyche.iml
generated
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module classpath="CIDR" type="CPP_MODULE" version="4" />
|
||||||
4
lua-temp/tests.lua
Normal file → Executable file
4
lua-temp/tests.lua
Normal file → Executable file
@@ -1,3 +1,5 @@
|
|||||||
|
#!/usr/bin/env lua
|
||||||
|
|
||||||
local pprint = require('pprint')
|
local pprint = require('pprint')
|
||||||
local assemble = require('tyche-as')
|
local assemble = require('tyche-as')
|
||||||
local VM = require('tyche-vm')
|
local VM = require('tyche-vm')
|
||||||
@@ -146,7 +148,7 @@ end
|
|||||||
|
|
||||||
----------------------
|
----------------------
|
||||||
-- --
|
-- --
|
||||||
-- VM ARITH --
|
-- VM --
|
||||||
-- --
|
-- --
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|||||||
@@ -14,20 +14,6 @@ local ARITH_LOGIC_OPS = {
|
|||||||
-- --
|
-- --
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
local function format_value(v)
|
|
||||||
if v.type == 'integer' or v.type == 'real' then
|
|
||||||
return tostring(v.value)
|
|
||||||
elseif v.type == 'string' then
|
|
||||||
return '"' .. v.value .. '"'
|
|
||||||
elseif v.type == 'function' then
|
|
||||||
return '@' .. tostring(v.value)
|
|
||||||
elseif v.type == 'nil' then
|
|
||||||
return 'nil'
|
|
||||||
else
|
|
||||||
return pprint.pformat(v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function validate_value(v)
|
local function validate_value(v)
|
||||||
assert(v, "value cannot be nil")
|
assert(v, "value cannot be nil")
|
||||||
assert(type(v) == 'table',
|
assert(type(v) == 'table',
|
||||||
@@ -134,17 +120,6 @@ function Stack:fp_level()
|
|||||||
return #self.fps
|
return #self.fps
|
||||||
end
|
end
|
||||||
|
|
||||||
function Stack:debug()
|
|
||||||
if #self.stack == 0 then return "empty" end
|
|
||||||
local ss = {}
|
|
||||||
for i,v in ipairs(self.stack) do
|
|
||||||
for _,fp in pairs(self.fps) do
|
|
||||||
if i == fp then table.insert(ss, '^ ') end
|
|
||||||
end
|
|
||||||
table.insert(ss, '[' .. format_value(v) .. '] ')
|
|
||||||
end
|
|
||||||
return table.concat(ss)
|
|
||||||
end
|
|
||||||
|
|
||||||
----------------------
|
----------------------
|
||||||
-- --
|
-- --
|
||||||
@@ -288,6 +263,33 @@ function VM:to_integer(idx)
|
|||||||
return value.value
|
return value.value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function VM:format_value(v)
|
||||||
|
if v.type == 'integer' or v.type == 'real' then
|
||||||
|
return tostring(v.value)
|
||||||
|
elseif v.type == 'string' then
|
||||||
|
return '"' .. v.value .. '"'
|
||||||
|
elseif v.type == 'function' then
|
||||||
|
return '@' .. tostring(v.value)
|
||||||
|
elseif v.type == 'nil' then
|
||||||
|
return 'nil'
|
||||||
|
else
|
||||||
|
return pprint.pformat(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function VM:debug_stack()
|
||||||
|
if #self.stack.stack == 0 then return "empty" end
|
||||||
|
local ss = {}
|
||||||
|
for i,v in ipairs(self.stack.stack) do
|
||||||
|
for _,fp in pairs(self.stack.fps) do
|
||||||
|
if i == fp then table.insert(ss, '^ ') end
|
||||||
|
end
|
||||||
|
table.insert(ss, '[' .. self:format_value(v) .. '] ')
|
||||||
|
end
|
||||||
|
return table.concat(ss)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- code execution
|
-- code execution
|
||||||
--
|
--
|
||||||
@@ -329,9 +331,9 @@ function VM:_run_until_return()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function VM:_debug_stack()
|
function VM:_print_stack()
|
||||||
if self.debug then
|
if self.debug then
|
||||||
print(self.stack:debug())
|
print(self:debug_stack())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -397,7 +399,7 @@ function VM:_step()
|
|||||||
self.stack:pop_fp()
|
self.stack:pop_fp()
|
||||||
self.stack:push(v)
|
self.stack:push(v)
|
||||||
table.remove(self.loc)
|
table.remove(self.loc)
|
||||||
self:_debug_stack()
|
self:_print_stack()
|
||||||
return
|
return
|
||||||
|
|
||||||
--
|
--
|
||||||
@@ -406,14 +408,14 @@ function VM:_step()
|
|||||||
|
|
||||||
elseif op.operator == 'jmp' then
|
elseif op.operator == 'jmp' then
|
||||||
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
||||||
self:_debug_stack()
|
self:_print_stack()
|
||||||
return
|
return
|
||||||
|
|
||||||
elseif op.operator == 'bz' then
|
elseif op.operator == 'bz' then
|
||||||
local v = self.stack:pop()
|
local v = self.stack:pop()
|
||||||
if is_zero(v) then
|
if is_zero(v) then
|
||||||
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
||||||
self:_debug_stack()
|
self:_print_stack()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -421,7 +423,7 @@ function VM:_step()
|
|||||||
local v = self.stack:pop()
|
local v = self.stack:pop()
|
||||||
if not is_zero(v) then
|
if not is_zero(v) then
|
||||||
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
loc.pc = self.code:find_label(loc.f_id, op.operand)
|
||||||
self:_debug_stack()
|
self:_print_stack()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -433,7 +435,7 @@ function VM:_step()
|
|||||||
error("Unknown operator '" .. tostring(op.operator) .. "'")
|
error("Unknown operator '" .. tostring(op.operator) .. "'")
|
||||||
end
|
end
|
||||||
|
|
||||||
self:_debug_stack()
|
self:_print_stack()
|
||||||
|
|
||||||
loc.pc = loc.pc + op.instruction_size
|
loc.pc = loc.pc + op.instruction_size
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user