summaryrefslogtreecommitdiff
path: root/lib/psych
diff options
context:
space:
mode:
authorMarc-Andre Lafortune <github@marc-andre.ca>2020-12-20 21:42:25 -0500
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2020-12-23 18:36:08 +0900
commitd4861854ecde00540c527f36aaacd257e63ed5a4 (patch)
treee618e0a88000d4dac45983be2465e522d9e8d1c8 /lib/psych
parent0eb2c0c9a2cb66da217b5157419af7b912acb947 (diff)
downloadpsych-d4861854ecde00540c527f36aaacd257e63ed5a4.zip
[ruby/psych] Make Ractor-ready.
Config is Ractor-local. Benchmarking reveals that using `Ractor.local_storage` for storing cache is similar to accessing a constant (~15% slower).
Diffstat (limited to 'lib/psych')
-rw-r--r--lib/psych/visitors/visitor.rb20
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/psych/visitors/visitor.rb b/lib/psych/visitors/visitor.rb
index 3f4ba64..35f8f81 100644
--- a/lib/psych/visitors/visitor.rb
+++ b/lib/psych/visitors/visitor.rb
@@ -8,12 +8,26 @@ module Psych
private
- DISPATCH = Hash.new do |hash, klass|
- hash[klass] = "visit_#{klass.name.gsub('::', '_')}"
+ # @api private
+ def self.dispatch_cache
+ Hash.new do |hash, klass|
+ hash[klass] = :"visit_#{klass.name.gsub('::', '_')}"
+ end
+ end
+
+ if defined?(Ractor)
+ def dispatch
+ Ractor.current[:Psych_Visitors_Visitor] ||= Visitor.dispatch_cache
+ end
+ else
+ DISPATCH = dispatch_cache
+ def dispatch
+ DISPATCH
+ end
end
def visit target
- send DISPATCH[target.class], target
+ send dispatch[target.class], target
end
end
end