From 232608116171bc872864c99250b5a58f54ac9169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=BCger?= Date: Mon, 12 Aug 2019 11:31:47 +0300 Subject: [PATCH] Now booting all original methods Just need to refactor now --- lib/risc/builtin.rb | 2 +- lib/risc/builtin/integer.rb | 44 ++++++++++++++++++++----------- test/risc/builtin/test_integer.rb | 29 +++++++++++++++++++- test/risc/test_builtin.rb | 2 +- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/risc/builtin.rb b/lib/risc/builtin.rb index 11553f10..be76923d 100644 --- a/lib/risc/builtin.rb +++ b/lib/risc/builtin.rb @@ -49,7 +49,7 @@ module Risc int_type = space.get_type_by_class_name(:Integer) Risc.operators.each do |op| - #compilers << operator_compiler( int_type , op) + compilers << operator_compiler( int_type , op) end [ :div4, :<,:<= , :>=, :> , :div10 ].each do |f| #div4 is just a forward declaration compilers << compiler_for( int_type , Integer , f) diff --git a/lib/risc/builtin/integer.rb b/lib/risc/builtin/integer.rb index 94c699d8..46419002 100644 --- a/lib/risc/builtin/integer.rb +++ b/lib/risc/builtin/integer.rb @@ -65,20 +65,22 @@ module Risc class Comparison < ::Mom::Instruction attr_reader :operator def initialize(name , operator) + super(name) @operator = operator end def to_risc(compiler) builder = compiler.builder(compiler.source) + operator = @operator # make accessible in block builder.build do integer! << message[:receiver] integer.reduce_int integer_reg! << message[:arguments] integer_reg << integer_reg[Parfait::NamedList.type_length + 0] #"other" is at index 0 integer_reg.reduce_int - swap_names(:integer , :integer_reg) if(@operator.to_s.start_with?('<') ) + swap_names(:integer , :integer_reg) if(operator.to_s.start_with?('<') ) integer.op :- , integer_reg if_minus false_label - if_zero( false_label ) if @operator.to_s.length == 1 + if_zero( false_label ) if operator.to_s.length == 1 object! << Parfait.object_space.true_object branch merge_label add_code false_label @@ -98,21 +100,33 @@ module Risc # - returns the new int def operator_method( op_sym ) compiler = compiler_for(:Integer, op_sym ,{other: :Integer }) - builder = compiler.builder(compiler.source) - integer_tmp = builder.allocate_int - builder.build do - integer! << message[:receiver] - integer.reduce_int - integer_reg! << message[:arguments] - integer_reg << integer_reg[Parfait::NamedList.type_length + 0] #"other" is at index 0 - integer_reg.reduce_int - integer.op op_sym , integer_reg - integer_tmp[Parfait::Integer.integer_index] << integer - message[:return_value] << integer_tmp - end - compiler.add_mom( Mom::ReturnSequence.new) + compiler.add_code OperatorInstruction.new("operator" , op_sym) return compiler end + class OperatorInstruction < ::Mom::Instruction + attr_reader :operator + def initialize(name , operator) + super(name) + @operator = operator + end + + def to_risc(compiler) + builder = compiler.builder(compiler.source) + integer_tmp = builder.allocate_int + operator = @operator # make accessible in block + builder.build do + integer! << message[:receiver] + integer.reduce_int + integer_reg! << message[:arguments] + integer_reg << integer_reg[Parfait::NamedList.type_length + 0] #"other" is at index 0 + integer_reg.reduce_int + integer.op operator , integer_reg + integer_tmp[Parfait::Integer.integer_index] << integer + message[:return_value] << integer_tmp + end + return compiler + end + end # as the name suggests, this devides the integer (self) by ten # diff --git a/test/risc/builtin/test_integer.rb b/test/risc/builtin/test_integer.rb index a48ea153..807854d0 100644 --- a/test/risc/builtin/test_integer.rb +++ b/test/risc/builtin/test_integer.rb @@ -53,7 +53,7 @@ module Risc assert_equal Risc::MethodCompiler , @method.to_risc.class end def test_risc_length - assert_equal 27 , @method.to_risc.risc_instructions.length + assert_equal 28 , @method.to_risc.risc_instructions.length end end class TestIntComp2 < BootTest @@ -74,5 +74,32 @@ module Risc assert_equal 27 , @method.to_risc.risc_instructions.length end end + class TestIntOperators < BootTest + def setup + super + end + def each_method &block + Risc.operators.each do |name| + method = get_compiler(name) + block.yield(method) + end + end + def test_has_get_internal + each_method do |method| + assert_equal Mom::MethodCompiler , method.class + assert_equal 5 , method.mom_instructions.length + end + end + def test_compile + each_method do |method| + assert_equal Risc::MethodCompiler , method.to_risc.class + end + end + def test_risc_length + each_method do |method| + assert_equal 49 , method.to_risc.risc_instructions.length + end + end + end end end diff --git a/test/risc/test_builtin.rb b/test/risc/test_builtin.rb index 0829039d..2edf442e 100644 --- a/test/risc/test_builtin.rb +++ b/test/risc/test_builtin.rb @@ -14,7 +14,7 @@ module Risc assert_equal Array, @functions.class end def test_boot_function_length - assert_equal 15, @functions.length + assert_equal 22, @functions.length end def test_boot_function_first assert_equal Mom::MethodCompiler, @functions.first.class