class Yomikomu::BasicStorage

Public Class Methods

new() click to toggle source
# File lib/yomikomu.rb, line 50
def initialize
  require 'digest/sha1'
end

Public Instance Methods

compile_and_store_iseq(fname, iseq_key = iseq_key_name(fname = File.expand_path(fname))) click to toggle source
# File lib/yomikomu.rb, line 78
def compile_and_store_iseq fname, iseq_key = iseq_key_name(fname = File.expand_path(fname))
  ::Yomikomu.debug{ "compile #{fname} into #{iseq_key}" }
  begin
    iseq = RubyVM::InstructionSequence.compile_file(fname)
    binary = iseq.to_binary(extra_data(fname))
    write_compiled_iseq(fname, iseq_key, binary)
    ::Yomikomu::STATISTICS[:compiled] += 1
    iseq
  rescue SyntaxError, RuntimeError => e
    puts "#{e}: #{fname}"
    nil
  end
end
extra_data(fname) click to toggle source
# File lib/yomikomu.rb, line 74
def extra_data fname
  "SHA-1:#{::Digest::SHA1.file(fname).digest}"
end
load_iseq(fname) click to toggle source
# File lib/yomikomu.rb, line 54
def load_iseq fname
  iseq_key = iseq_key_name(fname)

  if compiled_iseq_exist?(fname, iseq_key) && compiled_iseq_is_younger?(fname, iseq_key)
    ::Yomikomu::STATISTICS[:loaded] += 1
    ::Yomikomu.debug{ "load #{fname} from #{iseq_key}" }
    binary = read_compiled_iseq(fname, iseq_key)
    iseq = RubyVM::InstructionSequence.load_from_binary(binary)
    # p [extra_data(iseq.path), RubyVM::InstructionSequence.load_from_binary_extra_data(binary)]
    # raise unless extra_data(iseq.path) == RubyVM::InstructionSequence.load_from_binary_extra_data(binary)
    iseq
  elsif YOMIKOMU_AUTO_COMPILE
    compile_and_store_iseq(fname, iseq_key)
  else
    ::Yomikomu::STATISTICS[:ignored] += 1
    ::Yomikomu.debug{ "ignored #{fname}" }
    nil
  end
end

Private Instance Methods

iseq_key_name(fname) click to toggle source

def remove_compiled_iseq fname; nil; end # should implement at sub classes

# File lib/yomikomu.rb, line 96
def iseq_key_name fname
  fname
end