[rubygems/rubygems] Use a constant empty tar header to avoid extra allocations
https://github.com/rubygems/rubygems/commit/716666f65f
This commit is contained in:
parent
5880103450
commit
02c8e6583b
@ -95,14 +95,14 @@ class Gem::Package::TarHeader
|
|||||||
|
|
||||||
attr_reader(*FIELDS)
|
attr_reader(*FIELDS)
|
||||||
|
|
||||||
EMPTY_HEADER = ("\0" * 512).freeze # :nodoc:
|
EMPTY_HEADER = ("\0" * 512).b.freeze # :nodoc:
|
||||||
|
|
||||||
##
|
##
|
||||||
# Creates a tar header from IO +stream+
|
# Creates a tar header from IO +stream+
|
||||||
|
|
||||||
def self.from(stream)
|
def self.from(stream)
|
||||||
header = stream.read 512
|
header = stream.read 512
|
||||||
empty = (header == EMPTY_HEADER)
|
return EMPTY if header == EMPTY_HEADER
|
||||||
|
|
||||||
fields = header.unpack UNPACK_FORMAT
|
fields = header.unpack UNPACK_FORMAT
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ class Gem::Package::TarHeader
|
|||||||
devminor: strict_oct(fields.shift),
|
devminor: strict_oct(fields.shift),
|
||||||
prefix: fields.shift,
|
prefix: fields.shift,
|
||||||
|
|
||||||
empty: empty
|
empty: false
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.strict_oct(str)
|
def self.strict_oct(str)
|
||||||
@ -172,6 +172,22 @@ class Gem::Package::TarHeader
|
|||||||
@empty = vals[:empty]
|
@empty = vals[:empty]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
EMPTY = new({ # :nodoc:
|
||||||
|
checksum: 0,
|
||||||
|
gname: "",
|
||||||
|
linkname: "",
|
||||||
|
magic: "",
|
||||||
|
mode: 0,
|
||||||
|
name: "",
|
||||||
|
prefix: "",
|
||||||
|
size: 0,
|
||||||
|
uname: "",
|
||||||
|
version: 0,
|
||||||
|
|
||||||
|
empty: true,
|
||||||
|
}).freeze
|
||||||
|
private_constant :EMPTY
|
||||||
|
|
||||||
##
|
##
|
||||||
# Is the tar entry empty?
|
# Is the tar entry empty?
|
||||||
|
|
||||||
@ -241,7 +257,7 @@ class Gem::Package::TarHeader
|
|||||||
|
|
||||||
header = header.pack PACK_FORMAT
|
header = header.pack PACK_FORMAT
|
||||||
|
|
||||||
header << ("\0" * ((512 - header.size) % 512))
|
header.ljust 512, "\0"
|
||||||
end
|
end
|
||||||
|
|
||||||
def oct(num, len)
|
def oct(num, len)
|
||||||
|
@ -99,6 +99,31 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
|
|||||||
assert_empty @tar_header
|
assert_empty @tar_header
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_empty
|
||||||
|
@tar_header = Gem::Package::TarHeader.from(StringIO.new(Gem::Package::TarHeader::EMPTY_HEADER))
|
||||||
|
|
||||||
|
assert_empty @tar_header
|
||||||
|
assert_equal Gem::Package::TarHeader.new(
|
||||||
|
checksum: 0,
|
||||||
|
devmajor: 0,
|
||||||
|
devminor: 0,
|
||||||
|
empty: true,
|
||||||
|
gid: 0,
|
||||||
|
gname: "",
|
||||||
|
linkname: "",
|
||||||
|
magic: "",
|
||||||
|
mode: 0,
|
||||||
|
mtime: 0,
|
||||||
|
name: "",
|
||||||
|
prefix: "",
|
||||||
|
size: 0,
|
||||||
|
typeflag: "0",
|
||||||
|
uid: 0,
|
||||||
|
uname: "",
|
||||||
|
version: 0,
|
||||||
|
), @tar_header
|
||||||
|
end
|
||||||
|
|
||||||
def test_equals2
|
def test_equals2
|
||||||
assert_equal @tar_header, @tar_header
|
assert_equal @tar_header, @tar_header
|
||||||
assert_equal @tar_header, @tar_header.dup
|
assert_equal @tar_header, @tar_header.dup
|
||||||
|
Loading…
x
Reference in New Issue
Block a user