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,
|
# 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
|
||||||
|
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!
|
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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user