lib/bootsnap/load_path_cache/core_ext/kernel_require.rb



module Bootsnap
  module LoadPathCache
    module CoreExt
      def self.make_load_error(path)
        err = LoadError.new("cannot load such file -- #{path}")
        err.define_singleton_method(:path) { path }
        err
      end
    end
  end
end

module Kernel
  private

  alias_method :require_without_bootsnap, :require

  # Note that require registers to $LOADED_FEATURES while load does not.
  def require_with_bootsnap_lfi(path, resolved = nil)
    Bootsnap::LoadPathCache.loaded_features_index.register(path, resolved) do
      require_without_bootsnap(resolved || path)
    end
  end

  def require(path)
    return false if Bootsnap::LoadPathCache.loaded_features_index.key?(path)

    if resolved = Bootsnap::LoadPathCache.load_path_cache.find(path)
      return require_with_bootsnap_lfi(path, resolved)
    end

    raise Bootsnap::LoadPathCache::CoreExt.make_load_error(path)
  rescue Bootsnap::LoadPathCache::ReturnFalse
    return false
  rescue Bootsnap::LoadPathCache::FallbackScan
    require_with_bootsnap_lfi(path)
  end

  alias_method :require_relative_without_bootsnap, :require_relative
  def require_relative(path)
    realpath = Bootsnap::LoadPathCache.realpath_cache.call(
      caller_locations(1..1).first.absolute_path, path
    )
    require(realpath)
  end

  alias_method :load_without_bootsnap, :load
  def load(path, wrap = false)
    if resolved = Bootsnap::LoadPathCache.load_path_cache.find(path)
      return load_without_bootsnap(resolved, wrap)
    end

    # load also allows relative paths from pwd even when not in $:
    if File.exist?(relative = File.expand_path(path))
      return load_without_bootsnap(relative, wrap)
    end

    raise Bootsnap::LoadPathCache::CoreExt.make_load_error(path)
  rescue Bootsnap::LoadPathCache::ReturnFalse
    return false
  rescue Bootsnap::LoadPathCache::FallbackScan
    load_without_bootsnap(path, wrap)
  end
end

class << Kernel
  alias_method :require_without_bootsnap, :require

  def require_with_bootsnap_lfi(path, resolved = nil)
    Bootsnap::LoadPathCache.loaded_features_index.register(path, resolved) do
      require_without_bootsnap(resolved || path)
    end
  end

  def require(path)
    return false if Bootsnap::LoadPathCache.loaded_features_index.key?(path)

    if resolved = Bootsnap::LoadPathCache.load_path_cache.find(path)
      return require_with_bootsnap_lfi(path, resolved)
    end

    raise Bootsnap::LoadPathCache::CoreExt.make_load_error(path)
  rescue Bootsnap::LoadPathCache::ReturnFalse
    return false
  rescue Bootsnap::LoadPathCache::FallbackScan
    require_with_bootsnap_lfi(path)
  end

  alias_method :require_relative_without_bootsnap, :require_relative
  def require_relative(path)
    realpath = Bootsnap::LoadPathCache.realpath_cache.call(
      caller_locations(1..1).first.absolute_path, path
    )
    require(realpath)
  end

  alias_method :load_without_bootsnap, :load
  def load(path, wrap = false)
    if resolved = Bootsnap::LoadPathCache.load_path_cache.find(path)
      return load_without_bootsnap(resolved, wrap)
    end

    # load also allows relative paths from pwd even when not in $:
    if File.exist?(relative = File.expand_path(path))
      return load_without_bootsnap(relative, wrap)
    end

    raise Bootsnap::LoadPathCache::CoreExt.make_load_error(path)
  rescue Bootsnap::LoadPathCache::ReturnFalse
    return false
  rescue Bootsnap::LoadPathCache::FallbackScan
    load_without_bootsnap(path, wrap)
  end
end

class Module
  alias_method :autoload_without_bootsnap, :autoload
  def autoload(const, path)
    # NOTE: This may defeat LoadedFeaturesIndex, but it's not immediately
    # obvious how to make it work. This feels like a pretty niche case, unclear
    # if it will ever burn anyone.
    #
    # The challenge is that we don't control the point at which the entry gets
    # added to $LOADED_FEATURES and won't be able to hook that modification
    # since it's done in C-land.
    autoload_without_bootsnap(const, Bootsnap::LoadPathCache.load_path_cache.find(path) || path)
  rescue Bootsnap::LoadPathCache::ReturnFalse
    return false
  rescue Bootsnap::LoadPathCache::FallbackScan
    autoload_without_bootsnap(const, path)
  end
end