aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/marshal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/core_ext/marshal.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/marshal.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/marshal.rb b/activesupport/lib/active_support/core_ext/marshal.rb
new file mode 100644
index 0000000000..0c72cd7b47
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/marshal.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module ActiveSupport
+ module MarshalWithAutoloading # :nodoc:
+ def load(source, proc = nil)
+ super(source, proc)
+ rescue ArgumentError, NameError => exc
+ if exc.message.match(%r|undefined class/module (.+?)(?:::)?\z|)
+ # try loading the class/module
+ loaded = $1.constantize
+
+ raise unless $1 == loaded.name
+
+ # if it is an IO we need to go back to read the object
+ source.rewind if source.respond_to?(:rewind)
+ retry
+ else
+ raise exc
+ end
+ end
+ end
+end
+
+Marshal.singleton_class.prepend(ActiveSupport::MarshalWithAutoloading)