rubyx/lib/virtual/passes/minimizer.rb

41 lines
1.0 KiB
Ruby
Raw Normal View History

module Virtual
# Remove all functions that are not called
# Not called is approximated by the fact that the method name doesn't show up
# in any function reachable from main
class Minimizer
def run
@gonners = []
Parfait::Space.object_space.classes.values.each do |c|
c.instance_methods.each do |f|
@gonners << f
end
end
2015-08-06 17:27:35 +02:00
keep Virtual.machine.space.get_init
remove_remaining
end
2015-08-06 17:27:35 +02:00
def keep function
index = @gonners.index function
unless index
puts "function was already removed #{function.name}"
return
end
2015-06-01 07:33:23 +02:00
#puts "stayer #{function.name}"
@gonners.delete function
2015-07-03 19:13:03 +02:00
function.source.blocks.each do |block|
block.codes.each do |code|
2015-08-06 17:27:35 +02:00
keep code.method if code.is_a? Virtual::MethodCall
end
end
end
2015-08-06 17:27:35 +02:00
def remove_remaining
2015-05-31 10:07:49 +02:00
@gonners.each do |method|
2015-08-06 17:27:35 +02:00
next if(method.name == :plus)
method.for_class.remove_instance_method method.name
2015-05-31 10:07:49 +02:00
end
end
end
end