aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems')
-rw-r--r--lib/rubygems/query_utils.rb4
-rw-r--r--lib/rubygems/version.rb56
2 files changed, 40 insertions, 20 deletions
diff --git a/lib/rubygems/query_utils.rb b/lib/rubygems/query_utils.rb
index 9a6a736461..a95a759401 100644
--- a/lib/rubygems/query_utils.rb
+++ b/lib/rubygems/query_utils.rb
@@ -311,8 +311,8 @@ module Gem::QueryUtils
label = "Installed at"
specs.each do |s|
version = s.version.to_s
- version << ", default" if s.default_gem?
- entry << "\n" << " #{label} (#{version}): #{s.base_dir}"
+ default = ", default" if s.default_gem?
+ entry << "\n" << " #{label} (#{version}#{default}): #{s.base_dir}"
label = " " * label.length
end
end
diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb
index 2b93781f6f..2abc423fdf 100644
--- a/lib/rubygems/version.rb
+++ b/lib/rubygems/version.rb
@@ -162,7 +162,7 @@ class Gem::Version
# A string representation of this Version.
def version
- @version.dup
+ @version
end
alias_method :to_s, :version
@@ -173,7 +173,7 @@ class Gem::Version
def self.correct?(version)
nil_versions_are_discouraged! if version.nil?
- !!(version.to_s =~ ANCHORED_VERSION_PATTERN)
+ ANCHORED_VERSION_PATTERN.match?(version.to_s)
end
##
@@ -224,9 +224,17 @@ class Gem::Version
end
# If version is an empty string convert it to 0
- version = 0 if version.is_a?(String) && version =~ /\A\s*\Z/
+ version = 0 if version.is_a?(String) && /\A\s*\Z/.match?(version)
+
+ @version = version.to_s
- @version = version.to_s.strip.gsub("-",".pre.")
+ # optimization to avoid allocation when given an integer, since we know
+ # it's to_s won't have any spaces or dashes
+ unless version.is_a?(Integer)
+ @version = @version.strip
+ @version.gsub!("-",".pre.")
+ end
+ @version = -@version
@segments = nil
end
@@ -252,7 +260,7 @@ class Gem::Version
# same precision. Version "1.0" is not the same as version "1".
def eql?(other)
- self.class === other && @version == other._version
+ self.class === other && @version == other.version
end
def hash # :nodoc:
@@ -284,7 +292,7 @@ class Gem::Version
end
def yaml_initialize(tag, map) # :nodoc:
- @version = map["version"]
+ @version = -map["version"]
@segments = nil
@hash = nil
end
@@ -302,7 +310,7 @@ class Gem::Version
def prerelease?
unless instance_variable_defined? :@prerelease
- @prerelease = !(@version =~ /[a-zA-Z]/).nil?
+ @prerelease = /[a-zA-Z]/.match?(version)
end
@prerelease
end
@@ -354,7 +362,7 @@ class Gem::Version
return self <=> self.class.new(other) if (String === other) && self.class.correct?(other)
return unless Gem::Version === other
- return 0 if @version == other._version || canonical_segments == other.canonical_segments
+ return 0 if @version == other.version || canonical_segments == other.canonical_segments
lhsegments = canonical_segments
rhsegments = other.canonical_segments
@@ -381,10 +389,26 @@ class Gem::Version
end
def canonical_segments
- @canonical_segments ||=
- _split_segments.map! do |segments|
- segments.reverse_each.drop_while {|s| s == 0 }.reverse
- end.reduce(&:concat)
+ @canonical_segments ||= begin
+ numeric_segments, string_segments = _split_segments
+ canonical_segments = []
+
+ seen_non_zero = false
+ string_segments.reverse_each do |segment|
+ if seen_non_zero || (seen_non_zero = (segment != 0))
+ canonical_segments << segment
+ end
+ end
+ seen_non_zero = false
+ numeric_segments.reverse_each do |segment|
+ if seen_non_zero || (seen_non_zero = (segment != 0))
+ canonical_segments << segment
+ end
+ end
+
+ canonical_segments.reverse!
+ canonical_segments.freeze
+ end
end
def freeze
@@ -395,17 +419,13 @@ class Gem::Version
protected
- def _version
- @version
- end
-
def _segments
# segments is lazy so it can pick up version values that come from
# old marshaled versions, which don't go through marshal_load.
# since this version object is cached in @@all, its @segments should be frozen
- @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
- /^\d+$/.match?(s) ? s.to_i : s
+ @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map! do |s|
+ /^\d+$/.match?(s) ? s.to_i : -s
end.freeze
end