Date#freeze bug doesn't affect Ruby 1.9

This commit is contained in:
Jeremy Kemper
2008-08-28 22:27:55 -07:00
parent 766fb54c8f
commit c94f6ea2f3

View File

@@ -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