Most objects are cloneable, but not all. For example you can’t dup nil:

nil.dup # => TypeError: can't dup NilClass

Classes may signal their instances are not duplicable removing dup/clone or raising exceptions from them. So, to dup an arbitrary object you normally use an optimistic approach and are ready to catch an exception, say:

arbitrary_object.dup rescue object

Rails dups objects in a few critical spots where they are not that arbitrary. That rescue is very expensive (like 40 times slower than a predicate), and it is often triggered.

That’s why we hardcode the following cases and check duplicable? instead of using that rescue idiom.


ALL = Mime::Type.new("*/*", :all, [])

AbstractRequest = ActionController::Request = ActionDispatch::Request

AbstractResponse = ActionController::Response = ActionDispatch::Response

Routing = ActionDispatch::Routing

Integration = ActionDispatch::Integration

IntegrationTest = ActionDispatch::IntegrationTest

PerformanceTest = ActionDispatch::PerformanceTest

N = Integer(ARGV.first)

HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess

MissingSourceFile = LoadError

FRAMEWORKS = %w( activesupport activemodel activerecord activeresource actionpack actionmailer railties )

TIMES = (ENV['N'] || 10000).to_i


Show files where this class is defined (32 files)
Register or log in to add new notes.