diff options
author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2023-06-05 10:09:52 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-06-05 01:10:26 +0000 |
commit | 3a4302c742622dda9fbaeeb90fd42364badc423d (patch) | |
tree | 88df20abfbb3e439950d2d166d0546ace6a30203 /lib/singleton.rb | |
parent | 068672cfe82eb283a1bdbce1d870afa3e9ff1053 (diff) | |
download | ruby-3a4302c742622dda9fbaeeb90fd42364badc423d.tar.gz |
[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
Diffstat (limited to 'lib/singleton.rb')
-rw-r--r-- | lib/singleton.rb | 26 |
1 files changed, 17 insertions, 9 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 |