Only add Builtin methods that are not in the current compilation

Current bug looks like the original main is used in parts
(not the compiled one, but the builtin on)
This commit is contained in:
Torsten Ruger 2018-07-04 08:28:05 +03:00
parent 2ad24ab0bb
commit 8b9fd29ce9
5 changed files with 27 additions and 6 deletions

View File

@ -3,7 +3,12 @@ module Mom
attr_reader :method_compilers
def initialize(compilers = [])
@method_compilers = Risc::Builtin.boot_functions + compilers
@method_compilers = compilers
Risc::Builtin.boot_functions.each do |boot_comp|
next if @method_compilers.find{|comp| comp.method == boot_comp.method }
@method_compilers << boot_comp
end
end
# collects constants from all compilers into one array

View File

@ -32,6 +32,12 @@ module Parfait
init(arguments_type, frame_type)
end
def ==(other)
return false unless other.is_a?(TypedMethod)
return false if @name != other.name
@for_type == other.for_type
end
# (re) init with given args and frame types
def init(arguments_type, frame_type)
raise "Wrong argument type, expect Type not #{arguments_type.class}" unless arguments_type.is_a? Type

View File

@ -15,6 +15,9 @@ module Mom
def test_compilers
assert_equal 24 , @comp.method_compilers.length
end
def test_compilers_bare
assert_equal 23 , MomCompiler.new.method_compilers.length
end
def test_returns_constants
assert_equal Array , @comp.constants.class
end

View File

@ -32,7 +32,7 @@ module Mom
assert_equal Risc::Label , @linker.assemblers.first.instructions.class
end
def test_assembler_assembled
assert_equal Risc::SlotToReg , @linker.assemblers.first.instructions.next.class
assert_equal Risc::LoadConstant , @linker.assemblers.first.instructions.next.class
end
def test_no_loops_in_chain
@linker.assemblers.each do |asm|

View File

@ -5,10 +5,10 @@ module Parfait
def setup
super
obj = Parfait.object_space.get_class_by_name(:Object).instance_type
args = Parfait::Type.for_hash( obj.object_class , { bar: :Integer , foo: :Type})
frame = Parfait::Type.for_hash( obj.object_class , { local_bar: :Integer , local_foo: :Type})
@method = Parfait::TypedMethod.new( obj , :meth , args , frame)
@obj = Parfait.object_space.get_class_by_name(:Object).instance_type
@args = Parfait::Type.for_hash( @obj.object_class , { bar: :Integer , foo: :Type})
@frame = Parfait::Type.for_hash( @obj.object_class , { local_bar: :Integer , local_foo: :Type})
@method = Parfait::TypedMethod.new( @obj , :meth , @args , @frame)
end
def test_method_name
@ -95,5 +95,12 @@ module Parfait
def test_created_with_binary
assert @method.binary
end
def test_equal
assert_equal @method , @method
end
def test_not_equal
method = Parfait::TypedMethod.new( @obj , :other , @args , @frame)
assert @method != method
end
end
end