summaryrefslogtreecommitdiff
path: root/marshal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'marshal.rb')
-rw-r--r--marshal.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/marshal.rb b/marshal.rb
new file mode 100644
index 0000000000..9ff74dd8b2
--- /dev/null
+++ b/marshal.rb
@@ -0,0 +1,40 @@
+module Marshal
+ # call-seq:
+ # load(source, proc = nil, freeze: false) -> obj
+ # restore(source, proc = nil, freeze: false) -> obj
+ #
+ # Returns the result of converting the serialized data in source into a
+ # Ruby object (possibly with associated subordinate objects). source
+ # may be either an instance of IO or an object that responds to
+ # to_str. If proc is specified, each object will be passed to the proc, as the object
+ # is being deserialized.
+ #
+ # Never pass untrusted data (including user supplied input) to this method.
+ # Please see the overview for further details.
+ #
+ # If the <tt>freeze: true</tt> argument is passed, deserialized object would
+ # be deeply frozen. Note that it may lead to more efficient memory usage due to
+ # frozen strings deduplication:
+ #
+ # serialized = Marshal.dump(['value1', 'value2', 'value1', 'value2'])
+ #
+ # deserialized = Marshal.load(serialized)
+ # deserialized.map(&:frozen?)
+ # # => [false, false, false, false]
+ # deserialized.map(&:object_id)
+ # # => [1023900, 1023920, 1023940, 1023960] -- 4 different objects
+ #
+ # deserialized = Marshal.load(serialized, freeze: true)
+ # deserialized.map(&:frozen?)
+ # # => [true, true, true, true]
+ # deserialized.map(&:object_id)
+ # # => [1039360, 1039380, 1039360, 1039380] -- only 2 different objects, object_ids repeating
+ #
+ def self.load(source, proc = nil, freeze: false)
+ Primitive.marshal_load(source, proc, freeze)
+ end
+
+ class << self
+ alias restore load
+ end
+end