From c5a445d577b786e31c420b5857ad05b954b420ec Mon Sep 17 00:00:00 2001 From: Marc-Andre Lafortune Date: Sun, 20 Dec 2020 21:42:25 -0500 Subject: [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). --- ext/psych/lib/psych/visitors/visitor.rb | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'ext/psych/lib/psych/visitors/visitor.rb') diff --git a/ext/psych/lib/psych/visitors/visitor.rb b/ext/psych/lib/psych/visitors/visitor.rb index 3f4ba64e57..35f8f81f18 100644 --- a/ext/psych/lib/psych/visitors/visitor.rb +++ b/ext/psych/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 -- cgit v1.2.3