parsanol 1.3.58 → 1.3.60

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7292980f1c51e8b7bdfa5f0133e252188f4e396d0ebb07a700f2738e0493df61
4
- data.tar.gz: e49b88b8c6a0a7e34c85d7bc08c8dc611312c8d04f2716d12304b915a2f9791b
3
+ metadata.gz: 7b0b6d85c512010d47ad5bb8237ac68ed2e9d16f1d4c7082bad5c77870ad1836
4
+ data.tar.gz: b97e208a29314adfe0d13344383518ea50114c140dc2208d74fd9b5bdd502677
5
5
  SHA512:
6
- metadata.gz: b2b9a04efacd3c121e78d76c1b01975b13e8c4293f603a8916ba47e1bff95ac4bb0d271ff4b90225bba7a79f62ab9676ac60e4134a5678ec7a989eb41e4301d5
7
- data.tar.gz: 843380588585b6ec1ebd297cd5d4a85db361cf2acdc13ef7baac6f969a6fe2ce390bb836d46d77adf3212f94fac378ca1bbd6b1805daeaec2d1532c5d407ee44
6
+ metadata.gz: f8d1294a9f3d674464b25087a4e7a0f89522be9e822b44a6307cbacd195f0db4cdf6151c2f1b02eb93d4b46acff1942fc4d5bf57efcbcc3b9c42f26a53177ce5
7
+ data.tar.gz: e6fd368e0aaae0519280932e4697d0e5f491975d25fbf2343a62f59822a55e076256ec7c6f9ce14c7017f61cde2a1daf45860c476108cee39baa5cab9beb9ba3
@@ -22,8 +22,10 @@ module Parsanol
22
22
  # never raises NameError into the silent :ruby fallback (issue #38).
23
23
  autoload :Dynamic, "parsanol/native/dynamic"
24
24
  class << self
25
- # Check if native extension is available
25
+ # Check if native extension is available. First call performs the
26
+ # lazy bundle load (see the bottom of this file).
26
27
  def available?
28
+ native_load!
27
29
  Parser.available?
28
30
  end
29
31
 
@@ -304,14 +306,32 @@ module Parsanol
304
306
  end
305
307
  end
306
308
 
307
- # Attempt to load native extension
308
- begin
309
- ruby_version = RUBY_VERSION.split(".").take(2).join(".")
310
- require "parsanol/#{ruby_version}/parsanol_native"
311
- rescue LoadError
312
- begin
313
- require "parsanol/parsanol_native"
314
- rescue LoadError
315
- # Native extension not built yet
309
+ # The native extension loads lazily: dyld-binding the statically-linked
310
+ # engine plus magnus/rb-sys init costs on the order of two seconds, and
311
+ # `require "parsanol"` must stay cheap for consumers that only configure
312
+ # grammars up front. `available?` and `parse` trigger the load; once the
313
+ # bundle is in, its definitions of these same methods take over.
314
+ module Parsanol
315
+ module Native
316
+ @native_state = :pending
317
+
318
+ class << self
319
+ def native_load!
320
+ return @native_state unless @native_state == :pending
321
+
322
+ @native_state = begin
323
+ ruby_version = RUBY_VERSION.split(".").take(2).join(".")
324
+ require "parsanol/#{ruby_version}/parsanol_native"
325
+ :loaded
326
+ rescue LoadError
327
+ begin
328
+ require "parsanol/parsanol_native"
329
+ :loaded
330
+ rescue LoadError
331
+ :unavailable
332
+ end
333
+ end
334
+ end
335
+ end
316
336
  end
317
337
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Parsanol
4
+ # Pool namespace: per-type object pools backing the parser's arena
5
+ # allocations. Each pool loads on first reference.
6
+ module Pools
7
+ autoload :SlicePool, "parsanol/pools/slice_pool"
8
+ autoload :ArrayPool, "parsanol/pools/array_pool"
9
+ autoload :PositionPool, "parsanol/pools/position_pool"
10
+ autoload :BufferPool, "parsanol/pools/buffer_pool"
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Parsanol
4
- VERSION = "1.3.58"
4
+ VERSION = "1.3.60"
5
5
  end
data/lib/parsanol.rb CHANGED
@@ -273,47 +273,50 @@ module Parsanol
273
273
  end
274
274
  module_function :exp
275
275
 
276
+ autoload :Resettable, "parsanol/resettable"
277
+ autoload :Result, "parsanol/result"
278
+ autoload :Slice, "parsanol/slice"
279
+ autoload :StringView, "parsanol/string_view"
280
+ autoload :Rope, "parsanol/rope"
281
+ autoload :ObjectPool, "parsanol/pool"
282
+ autoload :Buffer, "parsanol/buffer"
283
+ autoload :Pools, "parsanol/pools"
284
+ autoload :LazyResult, "parsanol/lazy_result"
285
+ autoload :ResultBuilder, "parsanol/result_builder"
286
+ autoload :FirstSet, "parsanol/first_set"
287
+ autoload :Cause, "parsanol/cause"
288
+ autoload :Source, "parsanol/source"
289
+ autoload :Atoms, "parsanol/atoms"
290
+ autoload :Pattern, "parsanol/pattern"
291
+ autoload :Transform, "parsanol/transform"
292
+ autoload :VM, "parsanol/vm"
293
+ autoload :Parser, "parsanol/parser"
294
+ autoload :ErrorReporter, "parsanol/error_reporter"
295
+ autoload :Scope, "parsanol/scope"
296
+ autoload :Optimizer, "parsanol/optimizer"
297
+ autoload :ZeroCopy, "parsanol/options/zero_copy"
298
+ autoload :Native, "parsanol/native"
299
+ autoload :SourcePosition, "parsanol/source_location"
300
+ autoload :GrammarBuilder, "parsanol/grammar_builder"
301
+ autoload :GrammarBuilderDSL, "parsanol/grammar_builder"
302
+ autoload :StreamingParser, "parsanol/streaming_parser"
303
+ autoload :Edit, "parsanol/incremental_parser"
304
+ autoload :IncrementalParser, "parsanol/incremental_parser"
305
+ autoload :BuilderCallbacks, "parsanol/builder_callbacks"
306
+ autoload :Parallel, "parsanol/parallel"
276
307
  autoload :Expression, "parsanol/expression"
277
308
  autoload :IncrementalSession, "parsanol/incremental"
278
309
  autoload :TreeDiff, "parsanol/tree_diff"
279
310
  end
280
311
 
281
312
  require "parsanol/version"
282
- require "parsanol/resettable"
283
- require "parsanol/result"
284
- require "parsanol/slice"
285
- require "parsanol/string_view"
286
- require "parsanol/rope"
287
- require "parsanol/pool"
288
- require "parsanol/pools/slice_pool"
289
- require "parsanol/pools/array_pool"
290
- require "parsanol/pools/position_pool"
291
- require "parsanol/buffer"
292
- require "parsanol/pools/buffer_pool"
293
- require "parsanol/lazy_result"
294
- require "parsanol/result_builder"
295
- require "parsanol/first_set"
296
- require "parsanol/cause"
297
- require "parsanol/source"
298
- require "parsanol/atoms"
299
- require "parsanol/pattern"
313
+
314
+ # Load lazily via autoload (entries live in the file that owns each
315
+ # constant's namespace): `require "parsanol"` is on every consumer's hot
316
+ # path, and the eager require chain cost ~0.9s before the first line of
317
+ # user code. pattern/binding only REOPENS Pattern, so it stays eager.
300
318
  require "parsanol/pattern/binding"
301
- require "parsanol/transform"
302
- require "parsanol/vm"
303
- require "parsanol/parser"
304
- require "parsanol/error_reporter"
305
- require "parsanol/scope"
306
- require "parsanol/optimizer"
307
- require "parsanol/options"
308
- require "parsanol/native"
309
-
310
- # New features (require native extension for full functionality)
311
- require "parsanol/source_location"
312
319
  require "parsanol/grammar_builder"
313
- require "parsanol/streaming_parser"
314
- require "parsanol/incremental_parser"
315
- require "parsanol/builder_callbacks"
316
- require "parsanol/parallel"
317
320
 
318
321
  # Add GrammarBuilder DSL to Parsanol module
319
322
  Parsanol.extend(Parsanol::GrammarBuilderDSL)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsanol
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.58
4
+ version: 1.3.60
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
@@ -140,6 +140,7 @@ files:
140
140
  - lib/parsanol/pattern.rb
141
141
  - lib/parsanol/pattern/binding.rb
142
142
  - lib/parsanol/pool.rb
143
+ - lib/parsanol/pools.rb
143
144
  - lib/parsanol/pools/array_pool.rb
144
145
  - lib/parsanol/pools/buffer_pool.rb
145
146
  - lib/parsanol/pools/position_pool.rb