class method
Gem::Specification._load
_load(str)
lib/rubygems/specification.rb
View on GitHub ↗
# File tmp/rubies/ruby-4.0.0/lib/rubygems/specification.rb, line 1232
def self._load(str)
Gem.load_yaml
Gem.load_safe_marshal
yaml_set = false
retry_count = 0
array = begin
Gem::SafeMarshal.safe_load str
rescue ArgumentError => e
# Avoid an infinite retry loop when the argument error has nothing to do
# with the classes not being defined.
# 1 retry each allowed in case all 3 of
# - YAML
# - YAML::Syck::DefaultKey
# - YAML::PrivateType
# need to be defined
raise if retry_count >= 3
#
# Some very old marshaled specs included references to `YAML::PrivateType`
# and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
# that generated them. Workaround the issue by defining the necessary
# constants and retrying.
#
message = e.message
raise unless message.include?("YAML::")
unless Object.const_defined?(:YAML)
Object.const_set "YAML", Psych
yaml_set = true
end
if message.include?("YAML::Syck::")
YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)
YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey") && !YAML::Syck.const_defined?(:DefaultKey)
elsif message.include?("YAML::PrivateType") && !YAML.const_defined?(:PrivateType)
YAML.const_set "PrivateType", Class.new
end
retry_count += 1
retry
ensure
Object.__send__(:remove_const, "YAML") if yaml_set
end
spec = Gem::Specification.new
spec.instance_variable_set :@specification_version, array[1]
current_version = CURRENT_SPECIFICATION_VERSION
field_count = if spec.specification_version > current_version
spec.instance_variable_set :@specification_version,
current_version
MARSHAL_FIELDS[current_version]
else
MARSHAL_FIELDS[spec.specification_version]
end
if array.size < field_count
raise TypeError, "invalid Gem::Specification format #{array.inspect}"
end
spec.instance_variable_set :@rubygems_version, array[0]
# spec version
spec.instance_variable_set :@name, array[2]
spec.instance_variable_set :@version, array[3]
spec.date = array[4]
spec.instance_variable_set :@summary, array[5]
spec.instance_variable_set :@required_ruby_version, array[6]
spec.instance_variable_set :@required_rubygems_version, array[7]
spec.platform = array[8]
spec.instance_variable_set :@dependencies, array[9]
# offset due to rubyforge_project removal
spec.instance_variable_set :@email, array[11]
spec.instance_variable_set :@authors, array[12]
spec.instance_variable_set :@description, array[13]
spec.instance_variable_set :@homepage, array[14]
# offset due to has_rdoc removal
spec.instance_variable_set :@licenses, array[17]
spec.instance_variable_set :@metadata, array[18]
spec.instance_variable_set :@loaded, false
spec.instance_variable_set :@activated, false
spec
end
Load custom marshal format, re-initializing defaults as needed
See also
.latest_specs
.load
.latest_spec_for
.load_defaults
also in
4.1 · 3.4 · 3.3 · 3.2 · 3.1 · 3.0