add clock and method name

This commit is contained in:
Torsten Ruger 2015-07-30 15:05:22 +03:00
parent e8a5a20db1
commit 4c4d90385f
2 changed files with 36 additions and 3 deletions

View File

@ -8,6 +8,9 @@ class Interpreter
# current instruction or pc
attr_reader :instruction
# current instruction or pc
attr_reader :clock
# an (arm style) link register. store the return address to return to
attr_reader :link
@ -26,6 +29,7 @@ class Interpreter
@state = "runnnig"
@stdout = ""
@registers = {}
@clock = 0
(0...16).each do |r|
set_register "r#{r}".to_sym , "r#{r}:unknown"
end
@ -68,6 +72,7 @@ class Interpreter
def tick
return unless @instruction
@clock += 1
name = @instruction.class.name.split("::").last
fetch = send "execute_#{name}"
return unless fetch
@ -136,6 +141,7 @@ class Interpreter
raise "save return has nothing to save" unless @link
trigger(:object_changed, @instruction.register )
object.internal_object_set @instruction.index , @link
@link = nil
true
end
@ -157,9 +163,9 @@ class Interpreter
def execute_FunctionReturn
object = object_for( @instruction.register )
#wouldn't need to assign to link, but makes tsting easier
@link = object.internal_object_get( @instruction.index )
@block , @instruction = @link
#wouldn't need to assign to link, but makes testing easier
link = object.internal_object_get( @instruction.index )
@block , @instruction = link
# we jump back to the call instruction. so it is as if the call never happened and we continue
true
end

View File

@ -10,19 +10,41 @@ module Main
init_classes
init_registers
init_blocks
init_source
end
def tick
@interpreter.tick
update_interpreter
end
def update_interpreter
page._interpreter._clock = @interpreter.clock
page._interpreter._state = @interpreter.state
page._interpreter._stdout = @interpreter.stdout
page._interpreter._link = @interpreter.link.to_s
page._method_name = method_name
page._block_name = @interpreter.block ? @interpreter.block.name : " "
end
private
def marker var
return "W" if var.is_a? String
var.class.name.split("::").last[0]
end
def method_name
bl = @interpreter.block
return " " unless bl
return bl.method if bl.method.is_a? String
"#{bl.method.for_class.name}.#{bl.method.name}"
end
def init_machine
machine = Virtual.machine.boot
code = Ast::ExpressionList.new( [Ast::CallSiteExpression.new(:putstring, [] ,Ast::StringExpression.new("Hello again"))])
Virtual::Compiler.compile( code , machine.space.get_main )
machine.run_before "Register::CallImplementation"
@interpreter = Interpreter.new
page._interpreter = { }
update_interpreter
@interpreter.start machine.init
end
def init_registers
@ -48,6 +70,11 @@ module Main
page._blocks = blocks
@interpreter.register_event(:instruction_changed, blocks)
end
def init_source
sources = SourceModel.new
page._sources = sources
@interpreter.register_event(:instruction_changed, sources)
end
# The main template contains a #template binding that shows another
# template. This is the path to that template. It may change based
# on the params._component, params._controller, and params._action values.