aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2023-08-24 12:31:43 -0700
committergit <svn-admin@ruby-lang.org>2023-09-20 02:03:04 +0000
commit843c83ee5f8f4c26b70d7873df0c3d23de597b4c (patch)
treeb55b6c7d7d40ecc4efa72411109444900f2c95f2 /lib/rubygems
parentf4a5fac0d2671ec98f50a561eefd4ca3702f7cb1 (diff)
downloadruby-843c83ee5f8f4c26b70d7873df0c3d23de597b4c.tar.gz
[rubygems/rubygems] Give up, load Time via Marshal.load
https://github.com/rubygems/rubygems/commit/6c92ba2ba3
Diffstat (limited to 'lib/rubygems')
-rw-r--r--lib/rubygems/safe_marshal/visitors/to_ruby.rb59
1 files changed, 13 insertions, 46 deletions
diff --git a/lib/rubygems/safe_marshal/visitors/to_ruby.rb b/lib/rubygems/safe_marshal/visitors/to_ruby.rb
index d1e6e8669d..147141c2c5 100644
--- a/lib/rubygems/safe_marshal/visitors/to_ruby.rb
+++ b/lib/rubygems/safe_marshal/visitors/to_ruby.rb
@@ -62,62 +62,29 @@ module Gem::SafeMarshal
case e.object
when Elements::UserDefined
if object.class == ::Time
- offset = zone = nano_num = nano_den = submicro = nil
+ internal = []
+
ivars.reject! do |k, v|
case k
- when :offset
- offset = v
- when :zone
- zone = v
- when :nano_num
- nano_num = v
- when :nano_den
- nano_den = v
- when :submicro
- submicro = v
+ when :offset, :zone, :nano_num, :nano_den, :submicro
+ internal << [k, v]
+ true
else
- next false
+ false
end
- true
end
- if (nano_den || nano_num) && !(nano_den && nano_num)
- raise FormatError, "Must have all of nano_den, nano_num for Time #{e.pretty_inspect}"
- elsif nano_den && nano_num
- if RUBY_ENGINE == "jruby"
- nano = Rational(nano_num, nano_den * 1_000_000_000)
- object = Time.at(object.to_i + nano + object.subsec)
- elsif RUBY_ENGINE == "truffleruby"
- if RUBY_ENGINE_VERSION >= "23.0.0"
- object = Time.at(object.to_i, Rational(nano_num, nano_den).to_i, :nanosecond)
- else
- object = object.floor + Rational(nano_num, nano_den * 1_000_000_000)
- end
- else # assume "ruby"
- nano = Rational(nano_num, nano_den)
- nsec, subnano = nano.divmod(1)
- nano = nsec + subnano
- object = Time.at(object.to_r, nano, :nanosecond)
- end
- end
+ s = e.object.binary_string
- if zone
- require "time"
- transformed_zone = zone
- transformed_zone = "+0000" if ["UTC", "Z"].include?(zone) && offset == 0
- call_method(Time, :force_zone!, object, transformed_zone, offset)
- elsif offset
- object = object.localtime offset
- end
+ marshal_string = "\x04\bIu:\tTime#{(s.size + 5).chr}#{s.b}".b
+
+ marshal_string << (internal.size + 5).chr
- if RUBY_ENGINE == "truffleruby" && RUBY_ENGINE_VERSION < "23.0.0"
- ivars << [:@offset, offset]
- ivars << [:@zone, zone]
- ivars << [:@nano_num, nano_num] if nano_num
- ivars << [:@nano_den, nano_den] if nano_den
+ internal.each do |k, v|
+ marshal_string << ":#{(k.size + 5).chr}#{k}#{Marshal.dump(v)[2..-1]}"
end
- @objects[object_offset] = object
+ object = @objects[object_offset] = Marshal.load(marshal_string)
end
when Elements::String
enc = nil