Skip to content

Commit

Permalink
Prevent Numeric#to_s from allocating an array
Browse files Browse the repository at this point in the history
  • Loading branch information
byroot committed Nov 28, 2014
1 parent ee614af commit e3cba67
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
28 changes: 19 additions & 9 deletions activesupport/lib/active_support/core_ext/numeric/conversions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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] || {}
[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

self.to_formatted_s(format, options)
Float.class_eval do
alias_method :to_default_s, :to_s
def to_s(*args)
if args.empty?
to_default_s
else
to_default_s(*args)
to_formatted_s(*args)
end
end
end

end

0 comments on commit e3cba67

Please sign in to comment.