rubyx/lib/risc/collector.rb

57 lines
1.7 KiB
Ruby
Raw Normal View History

module Risc
2015-05-31 10:07:49 +02:00
# collect anything that is in the space but and reachable from init
#
# The place we collect in is the position map in Position class
module Collector
def self.collect_space(linker)
keep Parfait.object_space , 0
linker.constants.each {|obj| keep(obj,0)}
Position.positions
2015-05-31 10:07:49 +02:00
end
def self.keep( object , depth )
return if object.nil?
return unless add_object( object , depth )
return unless object.respond_to? :has_type?
type = object.get_type
keep(type , depth + 1)
return if object.is_a? Symbol
type.names.each do |name|
keep(name , depth + 1)
inst = object.get_instance_variable name
2015-07-30 18:18:41 +02:00
keep(inst , depth + 1)
2015-05-31 10:07:49 +02:00
end
if object.is_a? Parfait::List
2015-05-31 10:07:49 +02:00
object.each do |item|
2015-07-30 18:18:41 +02:00
keep(item , depth + 1)
2015-05-31 10:07:49 +02:00
end
end
end
# Objects are data and get assembled after functions
def self.add_object( objekt , depth)
return false if Position.set?(objekt)
return true if objekt.is_a? Fixnum
return true if objekt.is_a?( Risc::Label)
#puts message(objekt , depth)
#puts "ADD #{objekt.inspect}, #{objekt.name}" if objekt.is_a? Parfait::TypedMethod
unless objekt.is_a?( Parfait::Object) or objekt.is_a?( Symbol)
raise "adding non parfait #{objekt.class}:#{objekt}"
end
#raise "Method #{objekt.name}" if objekt.is_a? Parfait::TypedMethod
Position.get_or_create(objekt)
true
end
def self.message(object , depth)
msg = "adding #{depth}#{' ' * depth}:"
if( object.respond_to?(:rxf_reference_name))
msg + object.rxf_reference_name.to_s
else
msg + object.class.name
end
end
2015-05-31 10:07:49 +02:00
end
end