diff --git a/lib/openssl/digest.rb b/lib/openssl/digest.rb index 46ddfd602..4e6dea8d0 100644 --- a/lib/openssl/digest.rb +++ b/lib/openssl/digest.rb @@ -27,17 +27,21 @@ def self.digest(name, data) end %w(MD4 MD5 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512).each do |name| - klass = Class.new(self) { - define_method(:initialize, ->(data = nil) {super(name, data)}) - } - - singleton = (class << klass; self; end) - - singleton.class_eval{ - define_method(:digest) {|data| new.digest(data)} - define_method(:hexdigest) {|data| new.hexdigest(data)} - } + klass = Class.new(self) + klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def initialize(data = nil) + super("#{name}", data) + end + RUBY + klass.singleton_class.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def digest(data) + new.digest(data) + end + def hexdigest(data) + new.hexdigest(data) + end + RUBY const_set(name.tr('-', '_'), klass) end diff --git a/test/openssl/test_digest.rb b/test/openssl/test_digest.rb index 91ed24741..bc1f680df 100644 --- a/test/openssl/test_digest.rb +++ b/test/openssl/test_digest.rb @@ -155,6 +155,22 @@ def test_digests assert_include digests, "sha256" assert_include digests, "sha512" end + + if respond_to?(:ractor) && defined?(Ractor.shareable_proc) + ractor + + def test_ractor + assert_nothing_raised do + Ractor.new { + [ + OpenSSL::Digest::SHA256.new(""), + OpenSSL::Digest::SHA256.hexdigest(""), + OpenSSL::Digest::SHA256.digest(""), + ] + }.value + end + end + end end end