adds the risc instructions to the compiler
since they are not in the method anymore
This commit is contained in:
parent
22b1fea587
commit
35b10c46a3
@ -4,14 +4,22 @@ module Risc
|
||||
# and to instantiate the methods correctly. Most of the init is typed layer stuff,
|
||||
# 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
|
||||
|
||||
def initialize( method )
|
||||
@regs = []
|
||||
@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
|
||||
attr_reader :method
|
||||
attr_reader :method , :risc_instructions
|
||||
|
||||
# helper method for builtin mainly
|
||||
# the class_name is a symbol, which is resolved to the instance_type of that class
|
||||
|
28
test/mom/test_class_compiler.rb
Normal file
28
test/mom/test_class_compiler.rb
Normal 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
|
@ -8,9 +8,14 @@ module Risc
|
||||
Parfait.boot!
|
||||
end
|
||||
|
||||
def create_method
|
||||
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5;end")
|
||||
def in_test_vool(str)
|
||||
input = in_Test(str)
|
||||
vool = RubyX::RubyXCompiler.new(input).ruby_to_vool
|
||||
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.get_method(:meth)
|
||||
end
|
||||
@ -37,26 +42,27 @@ module Risc
|
||||
end
|
||||
|
||||
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::MethodStatement , clazz.body.first.class
|
||||
end
|
||||
|
||||
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)
|
||||
assert vool.body.first.clazz
|
||||
end
|
||||
|
||||
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)
|
||||
assert_equal Parfait::Class , vool.body.first.clazz.class
|
||||
end
|
||||
|
||||
def test_typed_method_instance_type
|
||||
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; @ivar = 5; @ibar = 4;end")
|
||||
vool.to_mom(nil)
|
||||
vool = in_test_vool("def meth; @ivar = 5; @ibar = 4;end")
|
||||
test = Parfait.object_space.get_class_by_name(:Test)
|
||||
method = test.instance_type.get_method(:meth)
|
||||
assert_equal 1, method.for_type.variable_index(:ivar)
|
||||
@ -64,8 +70,7 @@ module Risc
|
||||
end
|
||||
|
||||
def test_vool_method_has_one_local
|
||||
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; local = 5 ; a = 6;end")
|
||||
vool.to_mom(nil)
|
||||
vool = in_test_vool("def meth; local = 5 ; a = 6;end")
|
||||
test = Parfait.object_space.get_class_by_name(:Test)
|
||||
method = test.get_method(:meth)
|
||||
assert_equal 3 , method.frame_type.instance_length
|
||||
@ -74,8 +79,7 @@ module Risc
|
||||
end
|
||||
|
||||
def test_typed_method_has_one_local
|
||||
vool = RubyX::RubyXCompiler.ruby_to_vool in_Test("def meth; local = 5 ; a = 6;end")
|
||||
vool.to_mom(nil)
|
||||
vool = in_test_vool("def meth; local = 5 ; a = 6;end")
|
||||
test = Parfait.object_space.get_class_by_name(:Test)
|
||||
method = test.instance_type.get_method(:meth)
|
||||
assert_equal 3 , method.frame_type.instance_length
|
||||
|
@ -7,11 +7,14 @@ module Vool
|
||||
|
||||
def setup
|
||||
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
|
||||
|
||||
def test_return
|
||||
assert_equal Mom::ClassCompiler , @ins.class
|
||||
def test_return_class
|
||||
assert_equal Mom::ClassCompiler , @ret.class
|
||||
end
|
||||
def test_has_compilers
|
||||
assert_equal Risc::MethodCompiler , @ret.method_compilers.first.class
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user