adds the risc instructions to the compiler

since they are not in the method anymore
This commit is contained in:
Torsten Ruger 2018-07-01 11:59:52 +03:00
parent 22b1fea587
commit 35b10c46a3
4 changed files with 59 additions and 16 deletions

View File

@ -4,14 +4,22 @@ module Risc
# and to instantiate the methods correctly. Most of the init is typed layer stuff, # and to instantiate the methods correctly. Most of the init is typed layer stuff,
# but there is some logic too. # but there is some logic too.
# - risc_instructions: The sequence of risc level instructions that mom was compiled to
# - cpu_instructions: The sequence of cpu specific instructions that the
# risc_instructions was compiled to
# Instructions derive from class Instruction and form a linked list
class MethodCompiler class MethodCompiler
def initialize( method ) def initialize( method )
@regs = [] @regs = []
@method = method @method = method
@current = @method.risc_instructions name = "#{method.for_type.name}.#{method.name}"
@risc_instructions = Risc.label(name, name)
@risc_instructions << Risc.label( name, "unreachable")
@current = @risc_instructions
end end
attr_reader :method attr_reader :method , :risc_instructions
# helper method for builtin mainly # helper method for builtin mainly
# the class_name is a symbol, which is resolved to the instance_type of that class # the class_name is a symbol, which is resolved to the instance_type of that class

View File

@ -0,0 +1,28 @@
require_relative "helper"
module Mom
class TestClassCompiler < MiniTest::Test
include MomCompile
def setup
Parfait.boot!
@comp = compile_mom( "class Test ; def main(); return 1; end; end;")
end
def test_class
assert_equal ClassCompiler , @comp.class
end
def test_compilers
assert_equal 1 , @comp.method_compilers.length
end
def test_has_translate
assert @comp.translate(:interpreter)
end
def test_translate_class
assert_equal Array , @comp.translate(:interpreter).class
end
def test_translate_assemblers
assert_equal Risc::Assembler , @comp.translate(:interpreter).first.class
end
end
end

View File

@ -8,9 +8,14 @@ module Risc
Parfait.boot! Parfait.boot!
end end
def create_method def in_test_vool(str)
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5;end") input = in_Test(str)
vool = RubyX::RubyXCompiler.new(input).ruby_to_vool
vool.to_mom(nil) vool.to_mom(nil)
vool
end
def create_method
vool = in_test_vool("def meth; @ivar = 5;end")
test = Parfait.object_space.get_class_by_name(:Test) test = Parfait.object_space.get_class_by_name(:Test)
test.get_method(:meth) test.get_method(:meth)
end end
@ -37,26 +42,27 @@ module Risc
end end
def test_creates_method_statement_in_class def test_creates_method_statement_in_class
clazz = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5 ;end") clazz = in_test_vool("def meth; @ivar = 5 ;end")
assert_equal Vool::Statements , clazz.body.class assert_equal Vool::Statements , clazz.body.class
assert_equal Vool::MethodStatement , clazz.body.first.class assert_equal Vool::MethodStatement , clazz.body.first.class
end end
def test_method_statement_has_class def test_method_statement_has_class
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5;end") input = in_Test("def meth; @ivar = 5;end")
vool = RubyX::RubyXCompiler.new(input).ruby_to_vool
clazz = vool.to_mom(nil) clazz = vool.to_mom(nil)
assert vool.body.first.clazz assert vool.body.first.clazz
end end
def test_parfait_class_creation def test_parfait_class_creation
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5;end") input = in_Test("def meth; @ivar = 5;end")
vool = RubyX::RubyXCompiler.new(input).ruby_to_vool
clazz = vool.to_mom(nil) clazz = vool.to_mom(nil)
assert_equal Parfait::Class , vool.body.first.clazz.class assert_equal Parfait::Class , vool.body.first.clazz.class
end end
def test_typed_method_instance_type def test_typed_method_instance_type
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5; @ibar = 4;end") vool = in_test_vool("def meth; @ivar = 5; @ibar = 4;end")
vool.to_mom(nil)
test = Parfait.object_space.get_class_by_name(:Test) test = Parfait.object_space.get_class_by_name(:Test)
method = test.instance_type.get_method(:meth) method = test.instance_type.get_method(:meth)
assert_equal 1, method.for_type.variable_index(:ivar) assert_equal 1, method.for_type.variable_index(:ivar)
@ -64,8 +70,7 @@ module Risc
end end
def test_vool_method_has_one_local def test_vool_method_has_one_local
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; local = 5 ; a = 6;end") vool = in_test_vool("def meth; local = 5 ; a = 6;end")
vool.to_mom(nil)
test = Parfait.object_space.get_class_by_name(:Test) test = Parfait.object_space.get_class_by_name(:Test)
method = test.get_method(:meth) method = test.get_method(:meth)
assert_equal 3 , method.frame_type.instance_length assert_equal 3 , method.frame_type.instance_length
@ -74,8 +79,7 @@ module Risc
end end
def test_typed_method_has_one_local def test_typed_method_has_one_local
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; local = 5 ; a = 6;end") vool = in_test_vool("def meth; local = 5 ; a = 6;end")
vool.to_mom(nil)
test = Parfait.object_space.get_class_by_name(:Test) test = Parfait.object_space.get_class_by_name(:Test)
method = test.instance_type.get_method(:meth) method = test.instance_type.get_method(:meth)
assert_equal 3 , method.frame_type.instance_length assert_equal 3 , method.frame_type.instance_length

View File

@ -7,11 +7,14 @@ module Vool
def setup def setup
Parfait.boot! Parfait.boot!
@ins = compile_mom( "class Test ; def main(); return 1; end; end;") @ret = compile_mom( "class Test ; def main(); return 1; end; end;")
end end
def test_return def test_return_class
assert_equal Mom::ClassCompiler , @ins.class assert_equal Mom::ClassCompiler , @ret.class
end
def test_has_compilers
assert_equal Risc::MethodCompiler , @ret.method_compilers.first.class
end end
end end
end end