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 attr_reader :method_compilers
def initialize(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 end
# collects constants from all compilers into one array # collects constants from all compilers into one array

View File

@ -32,6 +32,12 @@ module Parfait
init(arguments_type, frame_type) init(arguments_type, frame_type)
end 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 # (re) init with given args and frame types
def init(arguments_type, frame_type) def init(arguments_type, frame_type)
raise "Wrong argument type, expect Type not #{arguments_type.class}" unless arguments_type.is_a? 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 def test_compilers
assert_equal 24 , @comp.method_compilers.length assert_equal 24 , @comp.method_compilers.length
end end
def test_compilers_bare
assert_equal 23 , MomCompiler.new.method_compilers.length
end
def test_returns_constants def test_returns_constants
assert_equal Array , @comp.constants.class assert_equal Array , @comp.constants.class
end end

View File

@ -32,7 +32,7 @@ module Mom
assert_equal Risc::Label , @linker.assemblers.first.instructions.class assert_equal Risc::Label , @linker.assemblers.first.instructions.class
end end
def test_assembler_assembled 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 end
def test_no_loops_in_chain def test_no_loops_in_chain
@linker.assemblers.each do |asm| @linker.assemblers.each do |asm|

View File

@ -5,10 +5,10 @@ module Parfait
def setup def setup
super super
obj = Parfait.object_space.get_class_by_name(:Object).instance_type @obj = Parfait.object_space.get_class_by_name(:Object).instance_type
args = Parfait::Type.for_hash( obj.object_class , { bar: :Integer , foo: :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}) @frame = Parfait::Type.for_hash( @obj.object_class , { local_bar: :Integer , local_foo: :Type})
@method = Parfait::TypedMethod.new( obj , :meth , args , frame) @method = Parfait::TypedMethod.new( @obj , :meth , @args , @frame)
end end
def test_method_name def test_method_name
@ -95,5 +95,12 @@ module Parfait
def test_created_with_binary def test_created_with_binary
assert @method.binary assert @method.binary
end 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
end end