Merge pull request #17816 from byroot/prevent-numeric-to-s-to-allocate-an-array

Prevent Numeric#to_s from allocating an array
This commit is contained in:
Rafael Mendonça França 2014-11-29 05:07:40 -02:00
commit 4eb68d8ed4
2 changed files with 27 additions and 18 deletions

@ -3,14 +3,13 @@
class BigDecimal
DEFAULT_STRING_FORMAT = 'F'
def to_formatted_s(*args)
if args[0].is_a?(Symbol)
super
alias_method :to_default_s, :to_s
def to_s(format = nil, options = nil)
if format.is_a?(Symbol)
to_formatted_s(format, options || {})
else
format = args[0] || DEFAULT_STRING_FORMAT
_original_to_s(format)
to_default_s(format || DEFAULT_STRING_FORMAT)
end
end
alias_method :_original_to_s, :to_s
alias_method :to_s, :to_formatted_s
end

@ -118,18 +118,28 @@ def to_formatted_s(format = :default, options = {})
end
end
[Float, Fixnum, Bignum, BigDecimal].each do |klass|
klass.send(:alias_method, :to_default_s, :to_s)
klass.send(:define_method, :to_s) do |*args|
if args[0].is_a?(Symbol)
format = args[0]
options = args[1] || {}
self.to_formatted_s(format, options)
else
to_default_s(*args)
[Fixnum, Bignum].each do |klass|
klass.class_eval do
alias_method :to_default_s, :to_s
def to_s(base_or_format = 10, options = nil)
if base_or_format.is_a?(Symbol)
to_formatted_s(base_or_format, options || {})
else
to_default_s(base_or_format)
end
end
end
end
Float.class_eval do
alias_method :to_default_s, :to_s
def to_s(*args)
if args.empty?
to_default_s
else
to_formatted_s(*args)
end
end
end
end