From 4b4528abb216b9c3f69a9fe6b7dfebb41c5d18f5 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Wed, 1 Aug 2018 16:27:34 +0300 Subject: [PATCH] propagate constants from block_compiler up up to method_compiler, where they are collected by mom_compiler (and included in binary) --- lib/risc/method_compiler.rb | 11 +++++------ test/mom/test_mom_compiler1.rb | 5 ++++- test/risc/test_method_compiler.rb | 13 ++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/risc/method_compiler.rb b/lib/risc/method_compiler.rb index 3dc8c72b..ca6be086 100644 --- a/lib/risc/method_compiler.rb +++ b/lib/risc/method_compiler.rb @@ -10,6 +10,11 @@ module Risc super(method) end + #include block_compilers constants + def constants + block_compilers.inject(@constants.dup){|all, compiler| all += compiler.constants} + end + def source_name "#{@callable.self_type.name}.#{@callable.name}" end @@ -106,12 +111,6 @@ module Risc end end - # add a constant (which get created during compilation and need to be linked) - def add_constant(const) - raise "Must be Parfait #{const}" unless const.is_a?(Parfait::Object) - @constants << const - end - # add a risc instruction after the current (insertion point) # the added instruction will become the new insertion point def add_code( instruction ) diff --git a/test/mom/test_mom_compiler1.rb b/test/mom/test_mom_compiler1.rb index eb552e74..e37e6985 100644 --- a/test/mom/test_mom_compiler1.rb +++ b/test/mom/test_mom_compiler1.rb @@ -6,7 +6,7 @@ module Mom def setup Parfait.boot! - @comp = compile_mom( "class Test ; def main(); return 'Hi'; end; end;") + @comp = compile_mom( "class Test ; def main(); main{return 'Ho'};return 'Hi'; end; end;") @linker = @comp.translate(:interpreter) end @@ -22,6 +22,9 @@ module Mom def test_linker_constants_contains_hi assert @linker.constants.include?("Hi") end + def test_linker_constants_contains_ho + assert @linker.constants.include?("Ho") + end def test_translate_platform assert_kind_of Risc::Platform , @linker.platform end diff --git a/test/risc/test_method_compiler.rb b/test/risc/test_method_compiler.rb index fb83fcfa..6054505a 100644 --- a/test/risc/test_method_compiler.rb +++ b/test/risc/test_method_compiler.rb @@ -64,14 +64,21 @@ module Risc assert_equal 1 , method.frame_type.variable_index(:local) assert_equal 2 , method.frame_type.variable_index(:a) end - def test_has_constant - input = in_Test("def meth; return 'Hi';end") - mom = RubyX::RubyXCompiler.new(input).ruby_to_mom + def constant_setup(input) + mom = RubyX::RubyXCompiler.new(in_Test(input)).ruby_to_mom assert_equal Mom::MomCompiler , mom.class compiler = mom.method_compilers.first assert_equal MethodCompiler , compiler.class + compiler + end + def test_has_method_constant + compiler = constant_setup("def meth; return 'Hi';end") assert compiler.constants.include?("Hi") end + def test_has_block_constant + compiler = constant_setup("def meth; meth{return 'Ho'};return 'Hi';end") + assert compiler.constants.include?("Ho") + end end end