mirror of
https://github.com/github/rails.git
synced 2026-01-27 07:17:58 -05:00
Date#freeze bug doesn't affect Ruby 1.9
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
require 'date'
|
||||
|
||||
module ActiveSupport #:nodoc:
|
||||
module CoreExtensions #:nodoc:
|
||||
module Date #:nodoc:
|
||||
@@ -10,18 +12,25 @@ module ActiveSupport #:nodoc:
|
||||
|
||||
# Date memoizes some instance methods using metaprogramming to wrap
|
||||
# the methods with one that caches the result in an instance variable.
|
||||
#
|
||||
# If a Date is frozen but the memoized method hasn't been called, the
|
||||
# first call will result in a frozen object error since the memo
|
||||
# instance variable is uninitialized. Work around by eagerly memoizing
|
||||
# before freezing.
|
||||
def freeze #:nodoc:
|
||||
self.class.private_instance_methods(false).each do |m|
|
||||
if m.to_s =~ /\A__\d+__\Z/
|
||||
instance_variable_set(:"@#{m}", [send(m)])
|
||||
# instance variable is uninitialized.
|
||||
#
|
||||
# Work around by eagerly memoizing before freezing.
|
||||
#
|
||||
# Ruby 1.9 uses a preinitialized instance variable so it's unaffected.
|
||||
# This hack is as close as we can get to feature detection:
|
||||
if (Date.today.freeze.inspect rescue false)
|
||||
def freeze #:nodoc:
|
||||
self.class.private_instance_methods(false).each do |m|
|
||||
if m.to_s =~ /\A__\d+__\Z/
|
||||
instance_variable_set(:"@#{m}", [send(m)])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
super
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user