From 07ed16d76566b8d13485c6b06218657b669d1df1 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Wed, 16 May 2018 21:00:14 +0300 Subject: [PATCH] groundwork for interpreter platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit especially positioning makes the previous interpreter approach to fragile (too far off the real thing) Interpreter should be it’s own platform (still use the risc instructions), get a translator and use positions --- lib/risc/machine.rb | 26 +++++++++++--------------- lib/vool/vool_compiler.rb | 3 ++- test/risc/test_machine.rb | 2 ++ test/risc/test_text_writer.rb | 1 + test/risc/test_translator.rb | 4 +++- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/risc/machine.rb b/lib/risc/machine.rb index 8e7410ef..b47167d4 100644 --- a/lib/risc/machine.rb +++ b/lib/risc/machine.rb @@ -25,23 +25,18 @@ module Risc attr_reader :booted , :translated attr_reader :platform - # translate to arm, ie instantiate an arm translator and pass it to translate + # Translate code to whatever cpu is specified. + # Currently only :arm and :interpret # - # currently we have no machanism to translate to other cpu's (nor such translators) - # but the mechanism is ready - def translate_arm - @platform = Platform.for("Arm") - @translated = true - translate(@platform.translator) - end - - # translate code to whatever cpu the translator translates to - # this means translating the initial jump + # Translating means translating the initial jump # and then translating all methods - def translate( translator ) + def translate( platform ) + platform = platform.to_s.capitalize + @platform = Platform.for(platform) + @translated = true methods = Parfait.object_space.get_all_methods - translate_methods( methods , translator ) - @cpu_init = risc_init.to_cpu(translator) + translate_methods( methods , @platform.translator ) + @cpu_init = risc_init.to_cpu(@platform.translator) end # go through all methods and translate them to cpu, given the translator @@ -66,6 +61,7 @@ module Risc raise "Must be Parfait #{const}" unless const.is_a?(Parfait::Object) @constants << const end + # To create binaries, objects (and labels) need to have a position # (so objects can be loaded and branches know where to jump) # @@ -76,7 +72,7 @@ module Risc # As code length amy change during assembly, this way at least the objects stay # in place and we don't have to deal with chaning loading code def position_all - translate_arm unless @translated + raise "Not translated " unless @translated #need the initial jump at 0 and then functions Position.set(cpu_init , 0 , cpu_init) @code_start = position_objects( @platform.padding ) diff --git a/lib/vool/vool_compiler.rb b/lib/vool/vool_compiler.rb index 9652593f..582795f2 100644 --- a/lib/vool/vool_compiler.rb +++ b/lib/vool/vool_compiler.rb @@ -13,9 +13,10 @@ module Vool statements = self.ruby_to_vool(source) statements.to_mom(nil) end - def self.ruby_to_binary(source) + def self.ruby_to_binary(source , platform = :arm) machine = Risc.machine.boot self.ruby_to_vool(source) + machine.translate(platform) machine.position_all machine.create_binary end diff --git a/test/risc/test_machine.rb b/test/risc/test_machine.rb index e4cd0f0e..4e4d7976 100644 --- a/test/risc/test_machine.rb +++ b/test/risc/test_machine.rb @@ -21,6 +21,7 @@ module Risc class TestMachinePositions < MiniTest::Test def setup @machine = Risc.machine.boot + @machine.translate(:arm) @machine.position_all end def test_has_positions @@ -32,6 +33,7 @@ module Risc class TestMachineInit < MiniTest::Test def setup @machine = Risc.machine.boot + @machine.translate(:arm) @machine.position_all @machine.create_binary end diff --git a/test/risc/test_text_writer.rb b/test/risc/test_text_writer.rb index c77700b5..527a544f 100644 --- a/test/risc/test_text_writer.rb +++ b/test/risc/test_text_writer.rb @@ -18,6 +18,7 @@ module Risc def setup @machine = Risc.machine.boot + @machine.translate(:arm) @machine.position_all @text_writer = TextWriter.new(@machine) end diff --git a/test/risc/test_translator.rb b/test/risc/test_translator.rb index c23a7bcf..807c1604 100644 --- a/test/risc/test_translator.rb +++ b/test/risc/test_translator.rb @@ -17,10 +17,11 @@ module Risc end def test_translate_space - assert @machine.translate_arm + assert @machine.translate(:arm) end def test_no_loops_in_chain + @machine.translate(:arm) @machine.position_all init = Parfait.object_space.get_init all = [] @@ -30,6 +31,7 @@ module Risc end end def test_no_risc #by assembling, risc doesnt have assemble method + @machine.translate(:arm) @machine.position_all @machine.objects.each do |id , method| next unless method.is_a? Parfait::TypedMethod