diff --git a/lib/register/collector.rb b/lib/register/collector.rb index 1c65fcd4..87a6756d 100644 --- a/lib/register/collector.rb +++ b/lib/register/collector.rb @@ -2,14 +2,14 @@ module Register # collect anything that is in the space but and reachable from init module Collector - def collect_space + def self.collect_space @objects = {} keep Parfait.object_space , 0 - constants.each {|obj| keep(obj,0)} + Register.machine.constants.each {|obj| keep(obj,0)} @objects end - def keep( object , depth ) + def self.keep( object , depth ) return if object.nil? return unless add_object( object , depth ) # probably should make labels or even instructions derive from Parfait::Object, but . . @@ -22,20 +22,18 @@ module Register return if object.is_a? Symbol type.names.each do |name| keep(name , depth + 1) - #puts "Keep #{name} for #{object.class}" inst = object.get_instance_variable name keep(inst , depth + 1) end if object.is_a? Parfait::List object.each do |item| - #puts "Keep item " keep(item , depth + 1) end end end # Objects are data and get assembled after functions - def add_object( objekt , depth) + def self.add_object( objekt , depth) return false if @objects[objekt.object_id] return true if objekt.is_a? Fixnum #puts message(objekt , depth) @@ -48,7 +46,7 @@ module Register true end - def message(object , depth) + def self.message(object , depth) msg = "adding #{depth}#{' ' * depth}:" if( object.respond_to?(:sof_reference_name)) msg + object.sof_reference_name.to_s diff --git a/lib/register/positioned.rb b/lib/register/positioned.rb index aa023597..d1efbc0b 100644 --- a/lib/register/positioned.rb +++ b/lib/register/positioned.rb @@ -10,8 +10,8 @@ module Positioned pos = Positioned.positions[self] if pos == nil str = "position accessed but not set, " - str += "#{Register.machine.objects.has_key?(self.object_id)}, at #{self.object_id.to_s(16)}\n" - raise str + "for #{self.class} byte_length #{byte_length} for #{self.inspect[0...100]}" + str += "#{self.object_id.to_s(16)}\n" + raise str + "for #{self.class} byte_length #{self.byte_length if self.respond_to?(:byte_length)} for #{self.inspect[0...100]}" end pos end diff --git a/test/elf/test_hello.rb b/test/elf/test_hello.rb index a2c7dd81..1db72164 100644 --- a/test/elf/test_hello.rb +++ b/test/elf/test_hello.rb @@ -6,7 +6,7 @@ class HelloTest < MiniTest::Test def check machine = Register.machine.boot Typed.compile( @input ) - objects = machine.collect_space + objects = Register::Collector.collect_space machine.translate_arm writer = Elf::ObjectWriter.new(machine , objects ) writer.save "test/hello.o" diff --git a/test/elf/test_zero.rb b/test/elf/test_zero.rb index b27984c8..955c2da3 100644 --- a/test/elf/test_zero.rb +++ b/test/elf/test_zero.rb @@ -10,7 +10,7 @@ class TestZeroCode < MiniTest::Test type.remove_method(method) unless keeper(method) end end - @objects = @machine.collect_space + @objects = Register::Collector.collect_space end def keeper name name == :main or name == :__init__ diff --git a/test/register/interpreter/helper.rb b/test/register/interpreter/helper.rb index 2f514e8e..9fe638f3 100644 --- a/test/register/interpreter/helper.rb +++ b/test/register/interpreter/helper.rb @@ -5,10 +5,10 @@ module Ticker include AST::Sexp def setup - machine = Register.machine.boot + Register.machine.boot do_clean_compile Typed.compile( @input ) - machine.collect_space + Register::Collector.collect_space @interpreter = Register::Interpreter.new @interpreter.start Register.machine.init end diff --git a/test/register/test_machine.rb b/test/register/test_machine.rb index c61f36b6..d16d9fba 100644 --- a/test/register/test_machine.rb +++ b/test/register/test_machine.rb @@ -8,7 +8,7 @@ module Register end def test_collect_all_types - objects = @machine.collect_space + objects = Register::Collector.collect_space objects.each do |id, objekt| next unless objekt.is_a?( Parfait::Type ) assert Parfait.object_space.get_type_for( objekt.hash ) , objekt.hash