module Bootsnap::CompileCache::ISeq

Experimental RBS support (using type sampling data from the type_fusion project).

# sig/bootsnap/compile_cache/iseq.rbs

module Bootsnap::CompileCache::ISeq
  def self.storage_to_output: (String binary, nil _args) -> RubyVM::InstructionSequence
end

def self.compile_option_updated

def self.compile_option_updated
  option = RubyVM::InstructionSequence.compile_option
  crc = Zlib.crc32(option.inspect)
  Bootsnap::CompileCache::Native.compile_option_crc32 = crc
end

def self.fetch(path, cache_dir: ISeq.cache_dir)

def self.fetch(path, cache_dir: ISeq.cache_dir)
  Bootsnap::CompileCache::Native.fetch(
    cache_dir,
    path.to_s,
    Bootsnap::CompileCache::ISeq,
    nil,
  )
end

def self.input_to_output(_data, _kwargs)

def self.input_to_output(_data, _kwargs)
  nil # ruby handles this
end

def self.input_to_storage(_, path)

def self.input_to_storage(_, path)
  iseq = begin
    RubyVM::InstructionSequence.compile_file(path)
  rescue SyntaxError
    return UNCOMPILABLE # syntax error
  end
  begin
    iseq.to_binary
  rescue TypeError
    return UNCOMPILABLE # ruby bug #18250
  end
end

def self.input_to_storage(_, path)

def self.input_to_storage(_, path)
  RubyVM::InstructionSequence.compile_file(path).to_binary
rescue SyntaxError
  return UNCOMPILABLE # syntax error
end

def self.install!(cache_dir)

def self.install!(cache_dir)
  Bootsnap::CompileCache::ISeq.cache_dir = cache_dir
  Bootsnap::CompileCache::ISeq.compile_option_updated
  class << RubyVM::InstructionSequence
    prepend(InstructionSequenceMixin)
  end
end

def self.precompile(path)

def self.precompile(path)
  Bootsnap::CompileCache::Native.precompile(
    cache_dir,
    path.to_s,
    Bootsnap::CompileCache::ISeq,
  )
end

def self.storage_to_output(binary, _args)

Experimental RBS support (using type sampling data from the type_fusion project).

def self.storage_to_output: (String binary, nil _args) -> RubyVM::InstructionSequence

This signature was generated using 1 sample from 1 application.

def self.storage_to_output(binary, _args)
  RubyVM::InstructionSequence.load_from_binary(binary)
rescue RuntimeError => error
  if error.message == "broken binary format"
    STDERR.puts("[Bootsnap::CompileCache] warning: rejecting broken binary")
    nil
  else
    raise
  end
end

def cache_dir=(cache_dir)

def cache_dir=(cache_dir)
  @cache_dir = cache_dir.end_with?("/") ? "#{cache_dir}iseq" : "#{cache_dir}-iseq"
end