class MemDump::JSONDump

Public Class Methods

load(filename) click to toggle source
# File lib/memdump/json_dump.rb, line 5
def self.load(filename)
    new(filename).load
end
new(filename) click to toggle source
# File lib/memdump/json_dump.rb, line 9
def initialize(filename)
    @filename = Pathname(filename)
end

Public Instance Methods

each_record() { |r| ... } click to toggle source
# File lib/memdump/json_dump.rb, line 13
def each_record
    return enum_for(__method__) if !block_given?

    @filename.open do |f|
        f.each_line do |line|
            r = JSON.parse(line)
            r['address'] ||= r['root']
            r['references'] ||= Set.new
            yield r
        end
    end
end
inspect() click to toggle source
# File lib/memdump/json_dump.rb, line 61
def inspect
    to_s
end
load() click to toggle source
# File lib/memdump/json_dump.rb, line 26
def load
    address_to_record = Hash.new
    generations = Hash.new
    each_record do |r|
        if !(address = r['address'])
            raise "no address in #{r}"
        end
        r = r.dup

        if generation = r['generation']
            generations[address] = r['address'] = "#{address}:#{generation}"
        end
        r['references'] = r['references'].to_set
        address_to_record[r['address']] = r
    end

    if !generations.empty?
        address_to_record.each_value do |r|
            if class_address = r['class']
                r['class'] = generations.fetch(class_address, class_address)
            end
            if class_address = r['class_address']
                r['class_address'] = generations.fetch(class_address, class_address)
            end

            refs = Set.new
            r['references'].each do |ref_address|
                refs << generations.fetch(ref_address, ref_address)
            end
            r['references'] = refs
        end
    end
    MemoryDump.new(address_to_record)
end