rubyx/lib/risc/collector.rb
Torsten Ruger 9c93b38b8f crete positions while collecting objects
clear two phase lifecycle for positions
always created invalid and set later
new does not auto add to cache
but create and get_or_create do
2018-06-15 21:54:21 +03:00

57 lines
1.7 KiB
Ruby

module Risc
# 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
keep Parfait.object_space , 0
Risc.machine.constants.each {|obj| keep(obj,0)}
Position.positions
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
keep(inst , depth + 1)
end
if object.is_a? Parfait::List
object.each do |item|
keep(item , depth + 1)
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
end
end