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..4b17215b2 100644 --- a/test/openssl/test_digest.rb +++ b/test/openssl/test_digest.rb @@ -155,6 +155,27 @@ def test_digests assert_include digests, "sha256" assert_include digests, "sha512" end + + if defined?(Ractor) && respond_to?(:ractor) + ractor + Ractor.alias_method(:value, :take) unless Ractor.method_defined?(:value) + + def test_ractor + experimental_before = Warning[:experimental] + Warning[:experimental] = false + assert_nothing_raised do + Ractor.new { + [ + OpenSSL::Digest::SHA256.new(""), + OpenSSL::Digest::SHA256.hexdigest(""), + OpenSSL::Digest::SHA256.digest(""), + ] + }.value + end + ensure + Warning[:experimental] = experimental_before + end + end end end