← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 15:33:55 2022
Reported on Wed Dec 14 15:40:03 2022

Filename/Users/ether/perl5/perlbrew/perls/36.0/lib/5.36.0/IO/Uncompress/Gunzip.pm
StatementsExecuted 31 statements in 2.32ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1112.19ms12.2msIO::Uncompress::Gunzip::::BEGIN@12IO::Uncompress::Gunzip::BEGIN@12
11123µs25µsIO::Uncompress::Gunzip::::BEGIN@8IO::Uncompress::Gunzip::BEGIN@8
11117µs34µsIO::Uncompress::Gunzip::::BEGIN@14IO::Uncompress::Gunzip::BEGIN@14
11116µs22µsIO::Uncompress::Gunzip::::BEGIN@17IO::Uncompress::Gunzip::BEGIN@17
11114µs162µsIO::Uncompress::Gunzip::::BEGIN@15IO::Uncompress::Gunzip::BEGIN@15
11113µs254µsIO::Uncompress::Gunzip::::BEGIN@16IO::Uncompress::Gunzip::BEGIN@16
1116µs8µsIO::Uncompress::Gunzip::::BEGIN@10IO::Uncompress::Gunzip::BEGIN@10
1115µs31µsIO::Uncompress::Gunzip::::BEGIN@9IO::Uncompress::Gunzip::BEGIN@9
1110s0sIO::Uncompress::Gunzip::::__ANON__IO::Uncompress::Gunzip::__ANON__ (xsub)
0000s0sIO::Uncompress::Gunzip::::_readFullGzipHeaderIO::Uncompress::Gunzip::_readFullGzipHeader
0000s0sIO::Uncompress::Gunzip::::_readGzipHeaderIO::Uncompress::Gunzip::_readGzipHeader
0000s0sIO::Uncompress::Gunzip::::chkTrailerIO::Uncompress::Gunzip::chkTrailer
0000s0sIO::Uncompress::Gunzip::::ckMagicIO::Uncompress::Gunzip::ckMagic
0000s0sIO::Uncompress::Gunzip::::ckParamsIO::Uncompress::Gunzip::ckParams
0000s0sIO::Uncompress::Gunzip::::getExtraParamsIO::Uncompress::Gunzip::getExtraParams
0000s0sIO::Uncompress::Gunzip::::gunzipIO::Uncompress::Gunzip::gunzip
0000s0sIO::Uncompress::Gunzip::::isGzipMagicIO::Uncompress::Gunzip::isGzipMagic
0000s0sIO::Uncompress::Gunzip::::newIO::Uncompress::Gunzip::new
0000s0sIO::Uncompress::Gunzip::::readHeaderIO::Uncompress::Gunzip::readHeader
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1
2package IO::Uncompress::Gunzip ;
3
417µsrequire 5.006 ;
5
6# for RFC1952
7
8229µs227µs
# spent 25µs (23+2) within IO::Uncompress::Gunzip::BEGIN@8 which was called: # once (23µs+2µs) by Mojo::Util::BEGIN@14 at line 8
use strict ;
# spent 25µs making 1 call to IO::Uncompress::Gunzip::BEGIN@8 # spent 2µs making 1 call to strict::import
9219µs257µs
# spent 31µs (5+26) within IO::Uncompress::Gunzip::BEGIN@9 which was called: # once (5µs+26µs) by Mojo::Util::BEGIN@14 at line 9
use warnings;
# spent 31µs making 1 call to IO::Uncompress::Gunzip::BEGIN@9 # spent 26µs making 1 call to warnings::import
10222µs210µs
# spent 8µs (6+2) within IO::Uncompress::Gunzip::BEGIN@10 which was called: # once (6µs+2µs) by Mojo::Util::BEGIN@14 at line 10
use bytes;
# spent 8µs making 1 call to IO::Uncompress::Gunzip::BEGIN@10 # spent 2µs making 1 call to bytes::import
11
1231.00ms312.2ms
# spent 12.2ms (2.19+9.98) within IO::Uncompress::Gunzip::BEGIN@12 which was called: # once (2.19ms+9.98ms) by Mojo::Util::BEGIN@14 at line 12
use IO::Uncompress::RawInflate 2.106 ;
# spent 12.2ms making 1 call to IO::Uncompress::Gunzip::BEGIN@12 # spent 18µs making 1 call to Exporter::import # spent 8µs making 1 call to UNIVERSAL::VERSION
13
14382µs251µs
# spent 34µs (17+17) within IO::Uncompress::Gunzip::BEGIN@14 which was called: # once (17µs+17µs) by Mojo::Util::BEGIN@14 at line 14
use Compress::Raw::Zlib 2.103 () ;
# spent 34µs making 1 call to IO::Uncompress::Gunzip::BEGIN@14 # spent 17µs making 1 call to UNIVERSAL::VERSION
15350µs3310µs
# spent 162µs (14+148) within IO::Uncompress::Gunzip::BEGIN@15 which was called: # once (14µs+148µs) by Mojo::Util::BEGIN@14 at line 15
use IO::Compress::Base::Common 2.106 qw(:Status );
# spent 162µs making 1 call to IO::Uncompress::Gunzip::BEGIN@15 # spent 141µs making 1 call to Exporter::import # spent 7µs making 1 call to UNIVERSAL::VERSION
16341µs3495µs
# spent 254µs (13+241) within IO::Uncompress::Gunzip::BEGIN@16 which was called: # once (13µs+241µs) by Mojo::Util::BEGIN@14 at line 16
use IO::Compress::Gzip::Constants 2.106 ;
# spent 254µs making 1 call to IO::Uncompress::Gunzip::BEGIN@16 # spent 234µs making 1 call to Exporter::import # spent 7µs making 1 call to UNIVERSAL::VERSION
1731.04ms328µs
# spent 22µs (16+6) within IO::Uncompress::Gunzip::BEGIN@17 which was called: # once (16µs+6µs) by Mojo::Util::BEGIN@14 at line 17
use IO::Compress::Zlib::Extra 2.106 ;
# spent 22µs making 1 call to IO::Uncompress::Gunzip::BEGIN@17 # spent 6µs making 1 call to UNIVERSAL::VERSION # spent 0s making 1 call to IO::Uncompress::Gunzip::__ANON__
18
1911µsrequire Exporter ;
20
21our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GunzipError);
22
23111µs@ISA = qw(IO::Uncompress::RawInflate Exporter);
2411µs@EXPORT_OK = qw( $GunzipError gunzip );
2511µs%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ;
2611µspush @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
2711µs115µsExporter::export_ok_tags('all');
# spent 15µs making 1 call to Exporter::export_ok_tags
28
2910s$GunzipError = '';
30
3110s$VERSION = '2.106';
32
33sub new
34{
35 my $class = shift ;
36 $GunzipError = '';
37 my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$GunzipError);
38
39 $obj->_create(undef, 0, @_);
40}
41
42sub gunzip
43{
44 my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$GunzipError);
45 return $obj->_inf(@_) ;
46}
47
48sub getExtraParams
49{
50 return ( 'parseextra' => [IO::Compress::Base::Common::Parse_boolean, 0] ) ;
51}
52
53sub ckParams
54{
55 my $self = shift ;
56 my $got = shift ;
57
58 # gunzip always needs crc32
59 $got->setValue('crc32' => 1);
60
61 return 1;
62}
63
64sub ckMagic
65{
66 my $self = shift;
67
68 my $magic ;
69 $self->smartReadExact(\$magic, GZIP_ID_SIZE);
70
71 *$self->{HeaderPending} = $magic ;
72
73 return $self->HeaderError("Minimum header size is " .
74 GZIP_MIN_HEADER_SIZE . " bytes")
75 if length $magic != GZIP_ID_SIZE ;
76
77 return $self->HeaderError("Bad Magic")
78 if ! isGzipMagic($magic) ;
79
80 *$self->{Type} = 'rfc1952';
81
82 return $magic ;
83}
84
85sub readHeader
86{
87 my $self = shift;
88 my $magic = shift;
89
90 return $self->_readGzipHeader($magic);
91}
92
93sub chkTrailer
94{
95 my $self = shift;
96 my $trailer = shift;
97
98 # Check CRC & ISIZE
99 my ($CRC32, $ISIZE) = unpack("V V", $trailer) ;
100 *$self->{Info}{CRC32} = $CRC32;
101 *$self->{Info}{ISIZE} = $ISIZE;
102
103 if (*$self->{Strict}) {
104 return $self->TrailerError("CRC mismatch")
105 if $CRC32 != *$self->{Uncomp}->crc32() ;
106
107 my $exp_isize = *$self->{UnCompSize}->get32bit();
108 return $self->TrailerError("ISIZE mismatch. Got $ISIZE"
109 . ", expected $exp_isize")
110 if $ISIZE != $exp_isize ;
111 }
112
113 return STATUS_OK;
114}
115
116sub isGzipMagic
117{
118 my $buffer = shift ;
119 return 0 if length $buffer < GZIP_ID_SIZE ;
120 my ($id1, $id2) = unpack("C C", $buffer) ;
121 return $id1 == GZIP_ID1 && $id2 == GZIP_ID2 ;
122}
123
124sub _readFullGzipHeader($)
125{
126 my ($self) = @_ ;
127 my $magic = '' ;
128
129 $self->smartReadExact(\$magic, GZIP_ID_SIZE);
130
131 *$self->{HeaderPending} = $magic ;
132
133 return $self->HeaderError("Minimum header size is " .
134 GZIP_MIN_HEADER_SIZE . " bytes")
135 if length $magic != GZIP_ID_SIZE ;
136
137
138 return $self->HeaderError("Bad Magic")
139 if ! isGzipMagic($magic) ;
140
141 my $status = $self->_readGzipHeader($magic);
142 delete *$self->{Transparent} if ! defined $status ;
143 return $status ;
144}
145
146sub _readGzipHeader($)
147{
148 my ($self, $magic) = @_ ;
149 my ($HeaderCRC) ;
150 my ($buffer) = '' ;
151
152 $self->smartReadExact(\$buffer, GZIP_MIN_HEADER_SIZE - GZIP_ID_SIZE)
153 or return $self->HeaderError("Minimum header size is " .
154 GZIP_MIN_HEADER_SIZE . " bytes") ;
155
156 my $keep = $magic . $buffer ;
157 *$self->{HeaderPending} = $keep ;
158
159 # now split out the various parts
160 my ($cm, $flag, $mtime, $xfl, $os) = unpack("C C V C C", $buffer) ;
161
162 $cm == GZIP_CM_DEFLATED
163 or return $self->HeaderError("Not Deflate (CM is $cm)") ;
164
165 # check for use of reserved bits
166 return $self->HeaderError("Use of Reserved Bits in FLG field.")
167 if $flag & GZIP_FLG_RESERVED ;
168
169 my $EXTRA ;
170 my @EXTRA = () ;
171 if ($flag & GZIP_FLG_FEXTRA) {
172 $EXTRA = "" ;
173 $self->smartReadExact(\$buffer, GZIP_FEXTRA_HEADER_SIZE)
174 or return $self->TruncatedHeader("FEXTRA Length") ;
175
176 my ($XLEN) = unpack("v", $buffer) ;
177 $self->smartReadExact(\$EXTRA, $XLEN)
178 or return $self->TruncatedHeader("FEXTRA Body");
179 $keep .= $buffer . $EXTRA ;
180
181 if ($XLEN && *$self->{'ParseExtra'}) {
182 my $bad = IO::Compress::Zlib::Extra::parseRawExtra($EXTRA,
183 \@EXTRA, 1, 1);
184 return $self->HeaderError($bad)
185 if defined $bad;
186 }
187 }
188
189 my $origname ;
190 if ($flag & GZIP_FLG_FNAME) {
191 $origname = "" ;
192 while (1) {
193 $self->smartReadExact(\$buffer, 1)
194 or return $self->TruncatedHeader("FNAME");
195 last if $buffer eq GZIP_NULL_BYTE ;
196 $origname .= $buffer
197 }
198 $keep .= $origname . GZIP_NULL_BYTE ;
199
200 return $self->HeaderError("Non ISO 8859-1 Character found in Name")
201 if *$self->{Strict} && $origname =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ;
202 }
203
204 my $comment ;
205 if ($flag & GZIP_FLG_FCOMMENT) {
206 $comment = "";
207 while (1) {
208 $self->smartReadExact(\$buffer, 1)
209 or return $self->TruncatedHeader("FCOMMENT");
210 last if $buffer eq GZIP_NULL_BYTE ;
211 $comment .= $buffer
212 }
213 $keep .= $comment . GZIP_NULL_BYTE ;
214
215 return $self->HeaderError("Non ISO 8859-1 Character found in Comment")
216 if *$self->{Strict} && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o ;
217 }
218
219 if ($flag & GZIP_FLG_FHCRC) {
220 $self->smartReadExact(\$buffer, GZIP_FHCRC_SIZE)
221 or return $self->TruncatedHeader("FHCRC");
222
223 $HeaderCRC = unpack("v", $buffer) ;
224 my $crc16 = Compress::Raw::Zlib::crc32($keep) & 0xFF ;
225
226 return $self->HeaderError("CRC16 mismatch.")
227 if *$self->{Strict} && $crc16 != $HeaderCRC;
228
229 $keep .= $buffer ;
230 }
231
232 # Assume compression method is deflated for xfl tests
233 #if ($xfl) {
234 #}
235
236 *$self->{Type} = 'rfc1952';
237
238 return {
239 'Type' => 'rfc1952',
240 'FingerprintLength' => 2,
241 'HeaderLength' => length $keep,
242 'TrailerLength' => GZIP_TRAILER_SIZE,
243 'Header' => $keep,
244 'isMinimalHeader' => $keep eq GZIP_MINIMUM_HEADER ? 1 : 0,
245
246 'MethodID' => $cm,
247 'MethodName' => $cm == GZIP_CM_DEFLATED ? "Deflated" : "Unknown" ,
248 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0,
249 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0,
250 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0,
251 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0,
252 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0,
253 'Name' => $origname,
254 'Comment' => $comment,
255 'Time' => $mtime,
256 'OsID' => $os,
257 'OsName' => defined $GZIP_OS_Names{$os}
258 ? $GZIP_OS_Names{$os} : "Unknown",
259 'HeaderCRC' => $HeaderCRC,
260 'Flags' => $flag,
261 'ExtraFlags' => $xfl,
262 'ExtraFieldRaw' => $EXTRA,
263 'ExtraField' => [ @EXTRA ],
264
265
266 #'CompSize'=> $compsize,
267 #'CRC32'=> $CRC32,
268 #'OrigSize'=> $ISIZE,
269 }
270}
271
272
27317µs1;
274
275__END__
 
# spent 0s within IO::Uncompress::Gunzip::__ANON__ which was called: # once (0s+0s) by IO::Uncompress::Gunzip::BEGIN@17 at line 17
sub IO::Uncompress::Gunzip::__ANON__; # xsub