bootsnap 1.9.4 → 1.10.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bootsnap
3
4
  module LoadPathCache
4
5
  module ChangeObserver
@@ -57,6 +58,7 @@ module Bootsnap
57
58
 
58
59
  def self.register(observer, arr)
59
60
  return if arr.frozen? # can't register observer, but no need to.
61
+
60
62
  arr.instance_variable_set(:@lpc_observer, observer)
61
63
  arr.extend(ArrayMixin)
62
64
  end
@@ -1,47 +1,35 @@
1
1
  # frozen_string_literal: true
2
- module Bootsnap
3
- module LoadPathCache
4
- module CoreExt
5
- def self.make_load_error(path)
6
- err = LoadError.new(+"cannot load such file -- #{path}")
7
- err.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true)
8
- err.define_singleton_method(:path) { path }
9
- err
10
- end
11
- end
12
- end
13
- end
14
2
 
15
3
  module Kernel
16
- module_function # rubocop:disable Style/ModuleFunction
4
+ module_function
17
5
 
18
6
  alias_method(:require_without_bootsnap, :require)
19
7
 
20
- # Note that require registers to $LOADED_FEATURES while load does not.
21
- def require_with_bootsnap_lfi(path, resolved = nil)
22
- Bootsnap::LoadPathCache.loaded_features_index.register(path, resolved) do
23
- require_without_bootsnap(resolved || path)
24
- end
25
- end
26
-
27
8
  def require(path)
28
- return false if Bootsnap::LoadPathCache.loaded_features_index.key?(path)
29
-
30
- if (resolved = Bootsnap::LoadPathCache.load_path_cache.find(path))
31
- return require_with_bootsnap_lfi(path, resolved)
32
- end
9
+ string_path = path.to_s
10
+ return false if Bootsnap::LoadPathCache.loaded_features_index.key?(string_path)
33
11
 
34
- raise(Bootsnap::LoadPathCache::CoreExt.make_load_error(path))
35
- rescue LoadError => e
36
- e.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true)
37
- raise(e)
38
- rescue Bootsnap::LoadPathCache::ReturnFalse
39
- false
40
- rescue Bootsnap::LoadPathCache::FallbackScan
41
- fallback = true
42
- ensure
43
- if fallback
44
- require_with_bootsnap_lfi(path)
12
+ resolved = Bootsnap::LoadPathCache.load_path_cache.find(string_path)
13
+ if Bootsnap::LoadPathCache::FALLBACK_SCAN.equal?(resolved)
14
+ if (cursor = Bootsnap::LoadPathCache.loaded_features_index.cursor(string_path))
15
+ ret = require_without_bootsnap(path)
16
+ resolved = Bootsnap::LoadPathCache.loaded_features_index.identify(string_path, cursor)
17
+ Bootsnap::LoadPathCache.loaded_features_index.register(string_path, resolved)
18
+ return ret
19
+ else
20
+ return require_without_bootsnap(path)
21
+ end
22
+ elsif false == resolved
23
+ return false
24
+ elsif resolved.nil?
25
+ error = LoadError.new(+"cannot load such file -- #{path}")
26
+ error.instance_variable_set(:@path, path)
27
+ raise error
28
+ else
29
+ # Note that require registers to $LOADED_FEATURES while load does not.
30
+ ret = require_without_bootsnap(resolved)
31
+ Bootsnap::LoadPathCache.loaded_features_index.register(string_path, resolved)
32
+ return ret
45
33
  end
46
34
  end
47
35
 
@@ -74,17 +62,13 @@ class Module
74
62
  # The challenge is that we don't control the point at which the entry gets
75
63
  # added to $LOADED_FEATURES and won't be able to hook that modification
76
64
  # since it's done in C-land.
77
- autoload_without_bootsnap(const, Bootsnap::LoadPathCache.load_path_cache.find(path) || path)
78
- rescue LoadError => e
79
- e.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true)
80
- raise(e)
81
- rescue Bootsnap::LoadPathCache::ReturnFalse
82
- false
83
- rescue Bootsnap::LoadPathCache::FallbackScan
84
- fallback = true
85
- ensure
86
- if fallback
65
+ resolved = Bootsnap::LoadPathCache.load_path_cache.find(path)
66
+ if Bootsnap::LoadPathCache::FALLBACK_SCAN.equal?(resolved)
87
67
  autoload_without_bootsnap(const, path)
68
+ elsif resolved == false
69
+ return false
70
+ else
71
+ autoload_without_bootsnap(const, resolved || path)
88
72
  end
89
73
  end
90
74
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class << $LOADED_FEATURES
3
4
  alias_method(:delete_without_bootsnap, :delete)
4
5
  def delete(key)
@@ -29,14 +29,15 @@ module Bootsnap
29
29
  @mutex = Mutex.new
30
30
 
31
31
  # In theory the user could mutate $LOADED_FEATURES and invalidate our
32
- # cache. If this ever comes up in practice or if you, the
33
- # enterprising reader, feels inclined to solve this problem we could
32
+ # cache. If this ever comes up in practice - or if you, the
33
+ # enterprising reader, feels inclined to solve this problem - we could
34
34
  # parallel the work done with ChangeObserver on $LOAD_PATH to mirror
35
35
  # updates to our @lfi.
36
36
  $LOADED_FEATURES.each do |feat|
37
37
  hash = feat.hash
38
38
  $LOAD_PATH.each do |lpe|
39
39
  next unless feat.start_with?(lpe)
40
+
40
41
  # /a/b/lib/my/foo.rb
41
42
  # ^^^^^^^^^
42
43
  short = feat[(lpe.length + 1)..-1]
@@ -68,11 +69,30 @@ module Bootsnap
68
69
  @mutex.synchronize { @lfi.key?(feature) }
69
70
  end
70
71
 
72
+ def cursor(short)
73
+ unless Bootsnap.absolute_path?(short.to_s)
74
+ $LOADED_FEATURES.size
75
+ end
76
+ end
77
+
78
+ def identify(short, cursor)
79
+ $LOADED_FEATURES[cursor..-1].detect do |feat|
80
+ offset = 0
81
+ while (offset = feat.index(short, offset))
82
+ if feat.index(".", offset + 1) && !feat.index("/", offset + 2)
83
+ break true
84
+ else
85
+ offset += 1
86
+ end
87
+ end
88
+ end
89
+ end
90
+
71
91
  # There is a relatively uncommon case where we could miss adding an
72
92
  # entry:
73
93
  #
74
94
  # If the user asked for e.g. `require 'bundler'`, and we went through the
75
- # `FallbackScan` pathway in `kernel_require.rb` and therefore did not
95
+ # `FALLBACK_SCAN` pathway in `kernel_require.rb` and therefore did not
76
96
  # pass `long` (the full expanded absolute path), then we did are not able
77
97
  # to confidently add the `bundler.rb` form to @lfi.
78
98
  #
@@ -82,28 +102,8 @@ module Bootsnap
82
102
  # not quite right; or
83
103
  # 2. Inspect $LOADED_FEATURES upon return from yield to find the matching
84
104
  # entry.
85
- def register(short, long = nil)
86
- # Absolute paths are not a concern.
87
- if Bootsnap.absolute_path?(short.to_s)
88
- return yield
89
- end
90
-
91
- if long.nil?
92
- len = $LOADED_FEATURES.size
93
- ret = yield
94
- long = $LOADED_FEATURES[len..-1].detect do |feat|
95
- offset = 0
96
- while offset = feat.index(short, offset)
97
- if feat.index(".", offset + 1) && !feat.index("/", offset + 2)
98
- break true
99
- else
100
- offset += 1
101
- end
102
- end
103
- end
104
- else
105
- ret = yield
106
- end
105
+ def register(short, long)
106
+ return if Bootsnap.absolute_path?(short)
107
107
 
108
108
  hash = long.hash
109
109
 
@@ -122,13 +122,11 @@ module Bootsnap
122
122
  @lfi[short] = hash
123
123
  (@lfi[altname] = hash) if altname
124
124
  end
125
-
126
- ret
127
125
  end
128
126
 
129
127
  private
130
128
 
131
- STRIP_EXTENSION = /\.[^.]*?$/
129
+ STRIP_EXTENSION = /\.[^.]*?$/.freeze
132
130
  private_constant(:STRIP_EXTENSION)
133
131
 
134
132
  # Might Ruby automatically search for this extension if
@@ -145,15 +143,15 @@ module Bootsnap
145
143
  # with calling a Ruby file 'x.dylib.rb' and then requiring it as 'x.dylib'.)
146
144
  #
147
145
  # See <https://ruby-doc.org/core-2.6.4/Kernel.html#method-i-require>.
148
- def extension_elidable?(f)
149
- f.to_s.end_with?('.rb', '.so', '.o', '.dll', '.dylib')
146
+ def extension_elidable?(feature)
147
+ feature.to_s.end_with?(".rb", ".so", ".o", ".dll", ".dylib")
150
148
  end
151
149
 
152
- def strip_extension_if_elidable(f)
153
- if extension_elidable?(f)
154
- f.sub(STRIP_EXTENSION, '')
150
+ def strip_extension_if_elidable(feature)
151
+ if extension_elidable?(feature)
152
+ feature.sub(STRIP_EXTENSION, "")
155
153
  else
156
- f
154
+ feature
157
155
  end
158
156
  end
159
157
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require_relative('path_scanner')
2
+
3
+ require_relative("path_scanner")
3
4
 
4
5
  module Bootsnap
5
6
  module LoadPathCache
@@ -43,6 +44,7 @@ module Bootsnap
43
44
  # set to zero anyway, just in case we change the stability heuristics.
44
45
  _, entries, dirs = store.get(expanded_path)
45
46
  return [entries, dirs] if entries # cache hit
47
+
46
48
  entries, dirs = scan!
47
49
  store.set(expanded_path, [0, entries, dirs])
48
50
  return [entries, dirs]
@@ -93,8 +95,8 @@ module Bootsnap
93
95
 
94
96
  # Built-in ruby lib stuff doesn't change, but things can occasionally be
95
97
  # installed into sitedir, which generally lives under libdir.
96
- RUBY_LIBDIR = RbConfig::CONFIG['libdir']
97
- RUBY_SITEDIR = RbConfig::CONFIG['sitedir']
98
+ RUBY_LIBDIR = RbConfig::CONFIG["libdir"]
99
+ RUBY_SITEDIR = RbConfig::CONFIG["sitedir"]
98
100
 
99
101
  def stability
100
102
  @stability ||= begin
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative('../explicit_require')
3
+ require_relative("../explicit_require")
4
4
 
5
5
  module Bootsnap
6
6
  module LoadPathCache
7
7
  module PathScanner
8
8
  REQUIRABLE_EXTENSIONS = [DOT_RB] + DL_EXTENSIONS
9
9
  NORMALIZE_NATIVE_EXTENSIONS = !DL_EXTENSIONS.include?(LoadPathCache::DOT_SO)
10
- ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/
10
+ ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/.freeze
11
11
 
12
12
  BUNDLE_PATH = if Bootsnap.bundler?
13
13
  (Bundler.bundle_path.cleanpath.to_s << LoadPathCache::SLASH).freeze
14
14
  else
15
- ''
15
+ ""
16
16
  end
17
17
 
18
18
  class << self
@@ -44,7 +44,8 @@ module Bootsnap
44
44
 
45
45
  def walk(absolute_dir_path, relative_dir_path, &block)
46
46
  Dir.foreach(absolute_dir_path) do |name|
47
- next if name.start_with?('.')
47
+ next if name.start_with?(".")
48
+
48
49
  relative_path = relative_dir_path ? File.join(relative_dir_path, name) : name
49
50
 
50
51
  absolute_path = "#{absolute_dir_path}/#{name}"
@@ -58,7 +59,7 @@ module Bootsnap
58
59
  end
59
60
  end
60
61
 
61
- if RUBY_VERSION >= '3.1'
62
+ if RUBY_VERSION >= "3.1"
62
63
  def os_path(path)
63
64
  path.freeze
64
65
  end
@@ -21,6 +21,7 @@ module Bootsnap
21
21
 
22
22
  def find_file(name)
23
23
  return File.realpath(name).freeze if File.exist?(name)
24
+
24
25
  CACHED_EXTENSIONS.each do |ext|
25
26
  filename = "#{name}#{ext}"
26
27
  return File.realpath(filename).freeze if File.exist?(filename)
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
- require_relative('../explicit_require')
3
2
 
4
- Bootsnap::ExplicitRequire.with_gems('msgpack') { require('msgpack') }
5
- Bootsnap::ExplicitRequire.from_rubylibdir('fileutils')
3
+ require_relative("../explicit_require")
4
+
5
+ Bootsnap::ExplicitRequire.with_gems("msgpack") { require("msgpack") }
6
6
 
7
7
  module Bootsnap
8
8
  module LoadPathCache
9
9
  class Store
10
- VERSION_KEY = '__bootsnap_ruby_version__'
11
- CURRENT_VERSION = "#{RUBY_REVISION}-#{RUBY_PLATFORM}".freeze
10
+ VERSION_KEY = "__bootsnap_ruby_version__"
11
+ CURRENT_VERSION = "#{RUBY_REVISION}-#{RUBY_PLATFORM}".freeze # rubocop:disable Style/RedundantFreeze
12
12
 
13
13
  NestedTransactionError = Class.new(StandardError)
14
14
  SetOutsideTransactionNotAllowed = Class.new(StandardError)
@@ -26,6 +26,7 @@ module Bootsnap
26
26
 
27
27
  def fetch(key)
28
28
  raise(SetOutsideTransactionNotAllowed) unless @txn_mutex.owned?
29
+
29
30
  v = get(key)
30
31
  unless v
31
32
  @dirty = true
@@ -37,6 +38,7 @@ module Bootsnap
37
38
 
38
39
  def set(key, value)
39
40
  raise(SetOutsideTransactionNotAllowed) unless @txn_mutex.owned?
41
+
40
42
  if value != @data[key]
41
43
  @dirty = true
42
44
  @data[key] = value
@@ -45,6 +47,7 @@ module Bootsnap
45
47
 
46
48
  def transaction
47
49
  raise(NestedTransactionError) if @txn_mutex.owned?
50
+
48
51
  @txn_mutex.synchronize do
49
52
  begin
50
53
  yield
@@ -86,9 +89,11 @@ module Bootsnap
86
89
  end
87
90
 
88
91
  def dump_data
92
+ require "fileutils" unless defined? FileUtils
93
+
89
94
  # Change contents atomically so other processes can't get invalid
90
95
  # caches if they read at an inopportune time.
91
- tmp = "#{@store_path}.#{Process.pid}.#{(rand * 100000).to_i}.tmp"
96
+ tmp = "#{@store_path}.#{Process.pid}.#{(rand * 100_000).to_i}.tmp"
92
97
  FileUtils.mkpath(File.dirname(tmp))
93
98
  exclusive_write = File::Constants::CREAT | File::Constants::EXCL | File::Constants::WRONLY
94
99
  # `encoding:` looks redundant wrt `binwrite`, but necessary on windows
@@ -103,7 +108,7 @@ module Bootsnap
103
108
  end
104
109
 
105
110
  def default_data
106
- { VERSION_KEY => CURRENT_VERSION }
111
+ {VERSION_KEY => CURRENT_VERSION}
107
112
  end
108
113
  end
109
114
  end
@@ -2,20 +2,14 @@
2
2
 
3
3
  module Bootsnap
4
4
  module LoadPathCache
5
- ReturnFalse = Class.new(StandardError)
6
- FallbackScan = Class.new(StandardError)
5
+ FALLBACK_SCAN = BasicObject.new
7
6
 
8
- DOT_RB = '.rb'
9
- DOT_SO = '.so'
10
- SLASH = '/'
11
-
12
- # If a NameError happens several levels deep, don't re-handle it
13
- # all the way up the chain: mark it once and bubble it up without
14
- # more retries.
15
- ERROR_TAG_IVAR = :@__bootsnap_rescued
7
+ DOT_RB = ".rb"
8
+ DOT_SO = ".so"
9
+ SLASH = "/"
16
10
 
17
11
  DL_EXTENSIONS = ::RbConfig::CONFIG
18
- .values_at('DLEXT', 'DLEXT2')
12
+ .values_at("DLEXT", "DLEXT2")
19
13
  .reject { |ext| !ext || ext.empty? }
20
14
  .map { |ext| ".#{ext}" }
21
15
  .freeze
@@ -42,24 +36,24 @@ module Bootsnap
42
36
  @realpath_cache = RealpathCache.new
43
37
 
44
38
  @load_path_cache = Cache.new(store, $LOAD_PATH, development_mode: development_mode)
45
- require_relative('load_path_cache/core_ext/kernel_require')
46
- require_relative('load_path_cache/core_ext/loaded_features')
39
+ require_relative("load_path_cache/core_ext/kernel_require")
40
+ require_relative("load_path_cache/core_ext/loaded_features")
47
41
  end
48
42
 
49
43
  def supported?
50
- RUBY_ENGINE == 'ruby' &&
51
- RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/
44
+ RUBY_ENGINE == "ruby" &&
45
+ RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/
52
46
  end
53
47
  end
54
48
  end
55
49
  end
56
50
 
57
51
  if Bootsnap::LoadPathCache.supported?
58
- require_relative('load_path_cache/path_scanner')
59
- require_relative('load_path_cache/path')
60
- require_relative('load_path_cache/cache')
61
- require_relative('load_path_cache/store')
62
- require_relative('load_path_cache/change_observer')
63
- require_relative('load_path_cache/loaded_features_index')
64
- require_relative('load_path_cache/realpath_cache')
52
+ require_relative("load_path_cache/path_scanner")
53
+ require_relative("load_path_cache/path")
54
+ require_relative("load_path_cache/cache")
55
+ require_relative("load_path_cache/store")
56
+ require_relative("load_path_cache/change_observer")
57
+ require_relative("load_path_cache/loaded_features_index")
58
+ require_relative("load_path_cache/realpath_cache")
65
59
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require_relative('../bootsnap')
2
+
3
+ require_relative("../bootsnap")
3
4
 
4
5
  Bootsnap.default_setup
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bootsnap
3
- VERSION = "1.9.4"
4
+ VERSION = "1.10.2"
4
5
  end
data/lib/bootsnap.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative('bootsnap/version')
4
- require_relative('bootsnap/bundler')
5
- require_relative('bootsnap/load_path_cache')
6
- require_relative('bootsnap/compile_cache')
3
+ require_relative("bootsnap/version")
4
+ require_relative("bootsnap/bundler")
5
+ require_relative("bootsnap/load_path_cache")
6
+ require_relative("bootsnap/compile_cache")
7
7
 
8
8
  module Bootsnap
9
9
  InvalidConfiguration = Class.new(StandardError)
@@ -18,10 +18,10 @@ module Bootsnap
18
18
 
19
19
  def self.logger=(logger)
20
20
  @logger = logger
21
- if logger.respond_to?(:debug)
22
- self.instrumentation = ->(event, path) { @logger.debug("[Bootsnap] #{event} #{path}") }
21
+ self.instrumentation = if logger.respond_to?(:debug)
22
+ ->(event, path) { @logger.debug("[Bootsnap] #{event} #{path}") }
23
23
  else
24
- self.instrumentation = ->(event, path) { @logger.call("[Bootsnap] #{event} #{path}") }
24
+ ->(event, path) { @logger.call("[Bootsnap] #{event} #{path}") }
25
25
  end
26
26
  end
27
27
 
@@ -62,13 +62,15 @@ module Bootsnap
62
62
  "to turn `compile_cache_iseq` off on Ruby 2.5"
63
63
  end
64
64
 
65
- Bootsnap::LoadPathCache.setup(
66
- cache_path: cache_dir + '/bootsnap/load-path-cache',
67
- development_mode: development_mode,
68
- ) if load_path_cache
65
+ if load_path_cache
66
+ Bootsnap::LoadPathCache.setup(
67
+ cache_path: cache_dir + "/bootsnap/load-path-cache",
68
+ development_mode: development_mode,
69
+ )
70
+ end
69
71
 
70
72
  Bootsnap::CompileCache.setup(
71
- cache_dir: cache_dir + '/bootsnap/compile-cache',
73
+ cache_dir: cache_dir + "/bootsnap/compile-cache",
72
74
  iseq: compile_cache_iseq,
73
75
  yaml: compile_cache_yaml,
74
76
  json: compile_cache_json,
@@ -79,18 +81,18 @@ module Bootsnap
79
81
  return @iseq_cache_supported if defined? @iseq_cache_supported
80
82
 
81
83
  ruby_version = Gem::Version.new(RUBY_VERSION)
82
- @iseq_cache_supported = ruby_version < Gem::Version.new('2.5.0') || ruby_version >= Gem::Version.new('2.6.0')
84
+ @iseq_cache_supported = ruby_version < Gem::Version.new("2.5.0") || ruby_version >= Gem::Version.new("2.6.0")
83
85
  end
84
86
 
85
87
  def self.default_setup
86
- env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || ENV['ENV']
87
- development_mode = ['', nil, 'development'].include?(env)
88
+ env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || ENV["ENV"]
89
+ development_mode = ["", nil, "development"].include?(env)
88
90
 
89
- unless ENV['DISABLE_BOOTSNAP']
90
- cache_dir = ENV['BOOTSNAP_CACHE_DIR']
91
+ unless ENV["DISABLE_BOOTSNAP"]
92
+ cache_dir = ENV["BOOTSNAP_CACHE_DIR"]
91
93
  unless cache_dir
92
94
  config_dir_frame = caller.detect do |line|
93
- line.include?('/config/')
95
+ line.include?("/config/")
94
96
  end
95
97
 
96
98
  unless config_dir_frame
@@ -102,35 +104,34 @@ module Bootsnap
102
104
  end
103
105
 
104
106
  path = config_dir_frame.split(/:\d+:/).first
105
- path = File.dirname(path) until File.basename(path) == 'config'
107
+ path = File.dirname(path) until File.basename(path) == "config"
106
108
  app_root = File.dirname(path)
107
109
 
108
- cache_dir = File.join(app_root, 'tmp', 'cache')
110
+ cache_dir = File.join(app_root, "tmp", "cache")
109
111
  end
110
112
 
111
-
112
113
  setup(
113
- cache_dir: cache_dir,
114
- development_mode: development_mode,
115
- load_path_cache: !ENV['DISABLE_BOOTSNAP_LOAD_PATH_CACHE'],
116
- compile_cache_iseq: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'] && iseq_cache_supported?,
117
- compile_cache_yaml: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'],
118
- compile_cache_json: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'],
114
+ cache_dir: cache_dir,
115
+ development_mode: development_mode,
116
+ load_path_cache: !ENV["DISABLE_BOOTSNAP_LOAD_PATH_CACHE"],
117
+ compile_cache_iseq: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"] && iseq_cache_supported?,
118
+ compile_cache_yaml: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"],
119
+ compile_cache_json: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"],
119
120
  )
120
121
 
121
- if ENV['BOOTSNAP_LOG']
122
+ if ENV["BOOTSNAP_LOG"]
122
123
  log!
123
124
  end
124
125
  end
125
126
  end
126
127
 
127
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
128
+ if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/
128
129
  def self.absolute_path?(path)
129
- path[1] == ':'
130
+ path[1] == ":"
130
131
  end
131
132
  else
132
133
  def self.absolute_path?(path)
133
- path.start_with?('/')
134
+ path.start_with?("/")
134
135
  end
135
136
  end
136
137
  end