diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2023-08-24 12:31:43 -0700 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-09-20 02:03:04 +0000 |
commit | 843c83ee5f8f4c26b70d7873df0c3d23de597b4c (patch) | |
tree | b55b6c7d7d40ecc4efa72411109444900f2c95f2 /lib/rubygems | |
parent | f4a5fac0d2671ec98f50a561eefd4ca3702f7cb1 (diff) | |
download | ruby-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.rb | 59 |
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 |