diff options
author | Hiroshi SHIBATA <[email protected]> | 2023-06-05 10:09:52 +0900 |
---|---|---|
committer | git <[email protected]> | 2023-06-05 01:10:26 +0000 |
commit | 3a4302c742622dda9fbaeeb90fd42364badc423d (patch) | |
tree | 88df20abfbb3e439950d2d166d0546ace6a30203 | |
parent | 068672cfe82eb283a1bdbce1d870afa3e9ff1053 (diff) |
[ruby/singleton] Revert "Simplify the implementation
(https://github.com/ruby/singleton/pull/7)"
This reverts commit https://github.com/ruby/singleton/commit/545b6b61a40d.
This change break Rails CI: https://bugs.ruby-lang.org/issues/19711
https://github.com/ruby/singleton/commit/911531d508
-rw-r--r-- | lib/singleton.rb | 26 | ||||
-rw-r--r-- | test/test_singleton.rb | 11 |
2 files changed, 17 insertions, 20 deletions
diff --git a/lib/singleton.rb b/lib/singleton.rb index 757b77eba3..07420d2ea2 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -112,7 +112,7 @@ module Singleton module SingletonClassMethods # :nodoc: def clone # :nodoc: - super.include(Singleton) + Singleton.__init__(super) end # By default calls instance(). Override to retain singleton state. @@ -121,18 +121,31 @@ module Singleton end def instance # :nodoc: - @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new } + return @singleton__instance__ if @singleton__instance__ + @singleton__mutex__.synchronize { + return @singleton__instance__ if @singleton__instance__ + @singleton__instance__ = new() + } + @singleton__instance__ end private def inherited(sub_klass) super - sub_klass.include(Singleton) + Singleton.__init__(sub_klass) end end class << Singleton # :nodoc: + def __init__(klass) # :nodoc: + klass.instance_eval { + @singleton__instance__ = nil + @singleton__mutex__ = Thread::Mutex.new + } + klass + end + private # extending an object with Singleton is a bad idea @@ -143,19 +156,14 @@ module Singleton unless mod.instance_of?(Class) raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}" end - super end def included(klass) super - klass.private_class_method :new, :allocate klass.extend SingletonClassMethods - klass.instance_eval { - @singleton__instance__ = nil - @singleton__mutex__ = Thread::Mutex.new - } + Singleton.__init__(klass) end end diff --git a/test/test_singleton.rb b/test/test_singleton.rb index b08972b9d5..b3c48bb5f5 100644 --- a/test/test_singleton.rb +++ b/test/test_singleton.rb @@ -94,13 +94,6 @@ class TestSingleton < Test::Unit::TestCase assert_same a, b end - def test_inheritance_creates_separate_singleton - a = SingletonTest.instance - b = Class.new(SingletonTest).instance - - assert_not_same a, b - end - def test_class_level_cloning_preserves_singleton_behavior klass = SingletonTest.clone @@ -108,8 +101,4 @@ class TestSingleton < Test::Unit::TestCase b = klass.instance assert_same a, b end - - def test_class_level_cloning_creates_separate_singleton - assert_not_same SingletonTest.instance, SingletonTest.clone.instance - end end |