bootsnap 1.9.1 → 1.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/lib/bootsnap/compile_cache/iseq.rb +29 -4
- data/lib/bootsnap/load_path_cache/cache.rb +21 -7
- data/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb +3 -19
- data/lib/bootsnap/load_path_cache/loaded_features_index.rb +10 -2
- data/lib/bootsnap/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8741381213652a6e3fc633bb87c69446d65ded8ccc5dcf72e64a8fa4a796955b
|
4
|
+
data.tar.gz: e72c311d1417b7c4d174c5b95cc6d95b1b0078dfd5dfb71c213f6704cd011665
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 804f427e8dd71b5aab1fe772f0f44f9fd8598cd2cd9bfc2348a13bff85fb1d65f59711188ca52b8dabc26e688655b4565e2aca2b2b8bf2a85e2635a299fe2f3a
|
7
|
+
data.tar.gz: a679ccfd21df451edf3e77c750f92388ab746afbb5e5d84e3265e8e2fbd52f6c17d6a303efc179e24fa994de95762d30e2b31683517d500236fe0c2ba5f23d25
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Unreleased
|
2
2
|
|
3
|
+
# 1.9.3
|
4
|
+
|
5
|
+
* Only disable the compile cache for source files impacted by [Ruby 3.0.3 [Bug 18250]](https://bugs.ruby-lang.org/issues/18250).
|
6
|
+
This should keep the performance loss to a minimum.
|
7
|
+
|
8
|
+
# 1.9.2
|
9
|
+
|
10
|
+
* Disable compile cache if [Ruby 3.0.3's ISeq cache bug](https://bugs.ruby-lang.org/issues/18250) is detected.
|
11
|
+
AKA `iseq.rb:13 to_binary: wrong argument type false (expected Symbol)`
|
12
|
+
* Fix `Kernel.load` behavior: before `load 'a'` would load `a.rb` (and other tried extensions) and wouldn't load `a` unless `development_mode: true`, now only `a` would be loaded and files with extensions wouldn't be.
|
13
|
+
|
3
14
|
# 1.9.1
|
4
15
|
|
5
16
|
* Removed a forgotten debug statement in JSON precompilation.
|
@@ -9,10 +9,35 @@ module Bootsnap
|
|
9
9
|
attr_accessor(:cache_dir)
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
RubyVM::InstructionSequence
|
14
|
-
|
15
|
-
|
12
|
+
has_ruby_bug_18250 = begin # https://bugs.ruby-lang.org/issues/18250
|
13
|
+
if defined? RubyVM::InstructionSequence
|
14
|
+
RubyVM::InstructionSequence.compile("def foo(*); ->{ super }; end; def foo(**); ->{ super }; end").to_binary
|
15
|
+
end
|
16
|
+
false
|
17
|
+
rescue TypeError
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
if has_ruby_bug_18250
|
22
|
+
def self.input_to_storage(_, path)
|
23
|
+
iseq = begin
|
24
|
+
RubyVM::InstructionSequence.compile_file(path)
|
25
|
+
rescue SyntaxError
|
26
|
+
raise(Uncompilable, 'syntax error')
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
iseq.to_binary
|
31
|
+
rescue TypeError
|
32
|
+
raise(Uncompilable, 'ruby bug #18250')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
else
|
36
|
+
def self.input_to_storage(_, path)
|
37
|
+
RubyVM::InstructionSequence.compile_file(path).to_binary
|
38
|
+
rescue SyntaxError
|
39
|
+
raise(Uncompilable, 'syntax error')
|
40
|
+
end
|
16
41
|
end
|
17
42
|
|
18
43
|
def self.storage_to_output(binary, _args)
|
@@ -44,14 +44,20 @@ module Bootsnap
|
|
44
44
|
|
45
45
|
# Try to resolve this feature to an absolute path without traversing the
|
46
46
|
# loadpath.
|
47
|
-
def find(feature)
|
47
|
+
def find(feature, try_extensions: true)
|
48
48
|
reinitialize if (@has_relative_paths && dir_changed?) || stale?
|
49
49
|
feature = feature.to_s.freeze
|
50
|
+
|
50
51
|
return feature if absolute_path?(feature)
|
51
|
-
|
52
|
+
|
53
|
+
if feature.start_with?('./', '../')
|
54
|
+
return try_extensions ? expand_path(feature) : File.expand_path(feature).freeze
|
55
|
+
end
|
56
|
+
|
52
57
|
@mutex.synchronize do
|
53
|
-
x = search_index(feature)
|
58
|
+
x = search_index(feature, try_extensions: try_extensions)
|
54
59
|
return x if x
|
60
|
+
return unless try_extensions
|
55
61
|
|
56
62
|
# Ruby has some built-in features that require lies about.
|
57
63
|
# For example, 'enumerator' is built in. If you require it, ruby
|
@@ -177,16 +183,24 @@ module Bootsnap
|
|
177
183
|
end
|
178
184
|
|
179
185
|
if DLEXT2
|
180
|
-
def search_index(f)
|
181
|
-
|
186
|
+
def search_index(f, try_extensions: true)
|
187
|
+
if try_extensions
|
188
|
+
try_index(f + DOT_RB) || try_index(f + DLEXT) || try_index(f + DLEXT2) || try_index(f)
|
189
|
+
else
|
190
|
+
try_index(f)
|
191
|
+
end
|
182
192
|
end
|
183
193
|
|
184
194
|
def maybe_append_extension(f)
|
185
195
|
try_ext(f + DOT_RB) || try_ext(f + DLEXT) || try_ext(f + DLEXT2) || f
|
186
196
|
end
|
187
197
|
else
|
188
|
-
def search_index(f)
|
189
|
-
|
198
|
+
def search_index(f, try_extensions: true)
|
199
|
+
if try_extensions
|
200
|
+
try_index(f + DOT_RB) || try_index(f + DLEXT) || try_index(f)
|
201
|
+
else
|
202
|
+
try_index(f)
|
203
|
+
end
|
190
204
|
end
|
191
205
|
|
192
206
|
def maybe_append_extension(f)
|
@@ -56,25 +56,9 @@ module Kernel
|
|
56
56
|
|
57
57
|
alias_method(:load_without_bootsnap, :load)
|
58
58
|
def load(path, wrap = false)
|
59
|
-
if (resolved = Bootsnap::LoadPathCache.load_path_cache.find(path))
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
# load also allows relative paths from pwd even when not in $:
|
64
|
-
if File.exist?(relative = File.expand_path(path).freeze)
|
65
|
-
return load_without_bootsnap(relative, wrap)
|
66
|
-
end
|
67
|
-
|
68
|
-
raise(Bootsnap::LoadPathCache::CoreExt.make_load_error(path))
|
69
|
-
rescue LoadError => e
|
70
|
-
e.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true)
|
71
|
-
raise(e)
|
72
|
-
rescue Bootsnap::LoadPathCache::ReturnFalse
|
73
|
-
false
|
74
|
-
rescue Bootsnap::LoadPathCache::FallbackScan
|
75
|
-
fallback = true
|
76
|
-
ensure
|
77
|
-
if fallback
|
59
|
+
if (resolved = Bootsnap::LoadPathCache.load_path_cache.find(path, try_extensions: false))
|
60
|
+
load_without_bootsnap(resolved, wrap)
|
61
|
+
else
|
78
62
|
load_without_bootsnap(path, wrap)
|
79
63
|
end
|
80
64
|
end
|
@@ -84,10 +84,18 @@ module Bootsnap
|
|
84
84
|
# entry.
|
85
85
|
def register(short, long = nil)
|
86
86
|
if long.nil?
|
87
|
-
pat = %r{/#{Regexp.escape(short)}(\.[^/]+)?$}
|
88
87
|
len = $LOADED_FEATURES.size
|
89
88
|
ret = yield
|
90
|
-
long = $LOADED_FEATURES[len..-1].detect
|
89
|
+
long = $LOADED_FEATURES[len..-1].detect do |feat|
|
90
|
+
offset = 0
|
91
|
+
while offset = feat.index(short, offset)
|
92
|
+
if feat.index(".", offset + 1) && !feat.index("/", offset + 2)
|
93
|
+
break true
|
94
|
+
else
|
95
|
+
offset += 1
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
91
99
|
else
|
92
100
|
ret = yield
|
93
101
|
end
|
data/lib/bootsnap/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootsnap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Libbey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|