| Filename | /usr/lib/perl5/NetAddr/IP/Util.pm |
| Statements | Executed 52 statements in 1.25ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 47820 | 1 | 1 | 46.5ms | 46.5ms | NetAddr::IP::Util::ipv4to6 (xsub) |
| 47820 | 1 | 1 | 34.0ms | 34.0ms | NetAddr::IP::Util::notcontiguous (xsub) |
| 1 | 1 | 1 | 155µs | 186µs | NetAddr::IP::Util::BEGIN@10 |
| 1 | 1 | 1 | 42µs | 42µs | NetAddr::IP::Util::bootstrap (xsub) |
| 3 | 3 | 3 | 23µs | 396µs | NetAddr::IP::Util::import |
| 1 | 1 | 1 | 18µs | 618µs | NetAddr::IP::UtilPolluted::BEGIN@198 |
| 1 | 1 | 1 | 11µs | 24µs | NetAddr::IP::Util::BEGIN@4 |
| 3 | 1 | 1 | 8µs | 8µs | NetAddr::IP::Util::shiftleft (xsub) |
| 1 | 1 | 1 | 8µs | 205µs | NetAddr::IP::Util::BEGIN@11 |
| 1 | 1 | 1 | 8µs | 85µs | NetAddr::IP::Util::BEGIN@9 |
| 1 | 1 | 1 | 7µs | 22µs | NetAddr::IP::UtilPolluted::BEGIN@197 |
| 1 | 1 | 1 | 6µs | 60µs | NetAddr::IP::Util::BEGIN@8 |
| 1 | 1 | 1 | 3µs | 3µs | NetAddr::IP::Util::CORE:match (opcode) |
| 1 | 1 | 1 | 3µs | 3µs | NetAddr::IP::Util::mask4to6 (xsub) |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::Util::DESTROY |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::Util::havegethostbyname2 |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::Util::inet_4map6 |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::Util::mode |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::Util::naip_gethostbyname |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::UtilPolluted::__ANON__[:237] |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::UtilPolluted::__ANON__[:245] |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::UtilPolluted::__ANON__[:255] |
| 0 | 0 | 0 | 0s | 0s | NetAddr::IP::UtilPolluted::_end_gethostbyname |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | #!/usr/bin/perl | ||||
| 2 | package NetAddr::IP::Util; | ||||
| 3 | |||||
| 4 | 2 | 31µs | 2 | 36µs | # spent 24µs (11+12) within NetAddr::IP::Util::BEGIN@4 which was called:
# once (11µs+12µs) by NetAddr::IP::Lite::BEGIN@18 at line 4 # spent 24µs making 1 call to NetAddr::IP::Util::BEGIN@4
# spent 12µs making 1 call to strict::import |
| 5 | #use diagnostics; | ||||
| 6 | #use lib qw(blib/lib); | ||||
| 7 | |||||
| 8 | 2 | 27µs | 2 | 114µs | # spent 60µs (6+54) within NetAddr::IP::Util::BEGIN@8 which was called:
# once (6µs+54µs) by NetAddr::IP::Lite::BEGIN@18 at line 8 # spent 60µs making 1 call to NetAddr::IP::Util::BEGIN@8
# spent 54µs making 1 call to vars::import |
| 9 | 2 | 26µs | 2 | 162µs | # spent 85µs (8+77) within NetAddr::IP::Util::BEGIN@9 which was called:
# once (8µs+77µs) by NetAddr::IP::Lite::BEGIN@18 at line 9 # spent 85µs making 1 call to NetAddr::IP::Util::BEGIN@9
# spent 77µs making 1 call to AutoLoader::import |
| 10 | 2 | 114µs | 1 | 186µs | # spent 186µs (155+31) within NetAddr::IP::Util::BEGIN@10 which was called:
# once (155µs+31µs) by NetAddr::IP::Lite::BEGIN@18 at line 10 # spent 186µs making 1 call to NetAddr::IP::Util::BEGIN@10 |
| 11 | 1 | 4µs | 1 | 198µs | # spent 205µs (8+198) within NetAddr::IP::Util::BEGIN@11 which was called:
# once (8µs+198µs) by NetAddr::IP::Lite::BEGIN@18 at line 14 # spent 198µs making 1 call to NetAddr::IP::InetBase::import |
| 12 | :upper | ||||
| 13 | :all | ||||
| 14 | 1 | 456µs | 1 | 205µs | ); # spent 205µs making 1 call to NetAddr::IP::Util::BEGIN@11 |
| 15 | |||||
| 16 | 1 | 2µs | *NetAddr::IP::Util::upper = \&NetAddr::IP::InetBase::upper; | ||
| 17 | 1 | 400ns | *NetAddr::IP::Util::lower = \&NetAddr::IP::InetBase::lower; | ||
| 18 | |||||
| 19 | 1 | 400ns | require DynaLoader; | ||
| 20 | 1 | 200ns | require Exporter; | ||
| 21 | |||||
| 22 | 1 | 9µs | @ISA = qw(Exporter DynaLoader); | ||
| 23 | |||||
| 24 | 3 | 14µs | 1 | 3µs | $VERSION = do { my @r = (q$Revision: 1.50 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # spent 3µs making 1 call to NetAddr::IP::Util::CORE:match |
| 25 | |||||
| 26 | 1 | 4µs | @EXPORT_OK = qw( | ||
| 27 | inet_aton | ||||
| 28 | inet_ntoa | ||||
| 29 | ipv6_aton | ||||
| 30 | ipv6_ntoa | ||||
| 31 | ipv6_n2x | ||||
| 32 | ipv6_n2d | ||||
| 33 | inet_any2n | ||||
| 34 | hasbits | ||||
| 35 | isIPv4 | ||||
| 36 | isNewIPv4 | ||||
| 37 | isAnyIPv4 | ||||
| 38 | inet_n2dx | ||||
| 39 | inet_n2ad | ||||
| 40 | inet_pton | ||||
| 41 | inet_ntop | ||||
| 42 | inet_4map6 | ||||
| 43 | shiftleft | ||||
| 44 | addconst | ||||
| 45 | add128 | ||||
| 46 | sub128 | ||||
| 47 | notcontiguous | ||||
| 48 | bin2bcd | ||||
| 49 | bcd2bin | ||||
| 50 | mode | ||||
| 51 | ipv4to6 | ||||
| 52 | mask4to6 | ||||
| 53 | ipanyto6 | ||||
| 54 | maskanyto6 | ||||
| 55 | ipv6to4 | ||||
| 56 | bin2bcdn | ||||
| 57 | bcdn2txt | ||||
| 58 | bcdn2bin | ||||
| 59 | simple_pack | ||||
| 60 | comp128 | ||||
| 61 | packzeros | ||||
| 62 | AF_INET | ||||
| 63 | AF_INET6 | ||||
| 64 | naip_gethostbyname | ||||
| 65 | havegethostbyname2 | ||||
| 66 | ); | ||||
| 67 | |||||
| 68 | 1 | 10µs | %EXPORT_TAGS = ( | ||
| 69 | all => [@EXPORT_OK], | ||||
| 70 | inet => [qw( | ||||
| 71 | inet_aton | ||||
| 72 | inet_ntoa | ||||
| 73 | ipv6_aton | ||||
| 74 | ipv6_ntoa | ||||
| 75 | ipv6_n2x | ||||
| 76 | ipv6_n2d | ||||
| 77 | inet_any2n | ||||
| 78 | inet_n2dx | ||||
| 79 | inet_n2ad | ||||
| 80 | inet_pton | ||||
| 81 | inet_ntop | ||||
| 82 | inet_4map6 | ||||
| 83 | ipv4to6 | ||||
| 84 | mask4to6 | ||||
| 85 | ipanyto6 | ||||
| 86 | maskanyto6 | ||||
| 87 | ipv6to4 | ||||
| 88 | packzeros | ||||
| 89 | naip_gethostbyname | ||||
| 90 | )], | ||||
| 91 | math => [qw( | ||||
| 92 | shiftleft | ||||
| 93 | hasbits | ||||
| 94 | isIPv4 | ||||
| 95 | isNewIPv4 | ||||
| 96 | isAnyIPv4 | ||||
| 97 | addconst | ||||
| 98 | add128 | ||||
| 99 | sub128 | ||||
| 100 | notcontiguous | ||||
| 101 | bin2bcd | ||||
| 102 | bcd2bin | ||||
| 103 | )], | ||||
| 104 | ipv4 => [qw( | ||||
| 105 | inet_aton | ||||
| 106 | inet_ntoa | ||||
| 107 | )], | ||||
| 108 | ipv6 => [qw( | ||||
| 109 | ipv6_aton | ||||
| 110 | ipv6_ntoa | ||||
| 111 | ipv6_n2x | ||||
| 112 | ipv6_n2d | ||||
| 113 | inet_any2n | ||||
| 114 | inet_n2dx | ||||
| 115 | inet_n2ad | ||||
| 116 | inet_pton | ||||
| 117 | inet_ntop | ||||
| 118 | inet_4map6 | ||||
| 119 | ipv4to6 | ||||
| 120 | mask4to6 | ||||
| 121 | ipanyto6 | ||||
| 122 | maskanyto6 | ||||
| 123 | ipv6to4 | ||||
| 124 | packzeros | ||||
| 125 | naip_gethostbyname | ||||
| 126 | )], | ||||
| 127 | ); | ||||
| 128 | |||||
| 129 | 1 | 3µs | 1 | 2µs | if (NetAddr::IP::Util_IS->not_pure) { # spent 2µs making 1 call to NetAddr::IP::Util_IS::not_pure |
| 130 | 1 | 500ns | eval { ## attempt to load 'C' version of utilities | ||
| 131 | 1 | 5µs | 1 | 191µs | bootstrap NetAddr::IP::Util $VERSION; # spent 191µs making 1 call to DynaLoader::bootstrap |
| 132 | }; | ||||
| 133 | } | ||||
| 134 | 1 | 2µs | 1 | 1µs | if (NetAddr::IP::Util_IS->pure || $@) { ## load the pure perl version if 'C' lib missing # spent 1µs making 1 call to NetAddr::IP::Util_IS::pure |
| 135 | require NetAddr::IP::UtilPP; | ||||
| 136 | import NetAddr::IP::UtilPP qw( :all ); | ||||
| 137 | # require Socket; | ||||
| 138 | # import Socket qw(inet_ntoa); | ||||
| 139 | # *yinet_aton = \&Socket::inet_aton; | ||||
| 140 | $Mode = 'Pure Perl'; | ||||
| 141 | } | ||||
| 142 | else { | ||||
| 143 | 1 | 300ns | $Mode = 'CC XS'; | ||
| 144 | } | ||||
| 145 | |||||
| 146 | # if Socket lib is broken in some way, check for overange values | ||||
| 147 | # | ||||
| 148 | #my $overange = yinet_aton('256.1') ? 1:0; | ||||
| 149 | #my $overange = gethostbyname('256.1') ? 1:0; | ||||
| 150 | |||||
| 151 | sub mode() { $Mode }; | ||||
| 152 | |||||
| 153 | 1 | 200ns | 1 | 2µs | my $_newV4compat = pack('N4',0,0,0xffff,0); # spent 2µs making 1 call to main::CORE:pack |
| 154 | |||||
| 155 | sub inet_4map6 { | ||||
| 156 | my $naddr = shift; | ||||
| 157 | if (length($naddr) == 4) { | ||||
| 158 | $naddr = ipv4to6($naddr); | ||||
| 159 | } | ||||
| 160 | elsif (length($naddr) == 16) { | ||||
| 161 | ; # is OK | ||||
| 162 | return undef unless isAnyIPv4($naddr); | ||||
| 163 | } else { | ||||
| 164 | return undef; | ||||
| 165 | } | ||||
| 166 | $naddr |= $_newV4compat; | ||||
| 167 | return $naddr; | ||||
| 168 | } | ||||
| 169 | |||||
| 170 | sub DESTROY {}; | ||||
| 171 | |||||
| 172 | 1 | 200ns | my $havegethostbyname2 = 0; | ||
| 173 | |||||
| 174 | 1 | 100ns | my $mygethostbyname; | ||
| 175 | |||||
| 176 | 1 | 100ns | my $_Sock6ok = 1; # for testing gethostbyname | ||
| 177 | |||||
| 178 | sub havegethostbyname2 { | ||||
| 179 | return $_Sock6ok | ||||
| 180 | ? $havegethostbyname2 | ||||
| 181 | : 0; | ||||
| 182 | } | ||||
| 183 | |||||
| 184 | # spent 396µs (23+374) within NetAddr::IP::Util::import which was called 3 times, avg 132µs/call:
# once (11µs+201µs) by NetAddr::IP::Lite::BEGIN@18 at line 18 of NetAddr/IP/Lite.pm
# once (6µs+123µs) by NetAddr::IP::BEGIN@9 at line 9 of NetAddr/IP.pm
# once (5µs+50µs) by NetAddr::IP::FastNew::BEGIN@8 at line 8 of lib/NetAddr/IP/FastNew.pm | ||||
| 185 | 3 | 5µs | if (grep { $_ eq ':noSock6' } @_) { | ||
| 186 | $_Sock6ok = 0; | ||||
| 187 | @_ = grep { $_ ne ':noSock6' } @_; | ||||
| 188 | } | ||||
| 189 | 3 | 13µs | 3 | 43µs | NetAddr::IP::Util->export_to_level(1,@_); # spent 43µs making 3 calls to Exporter::export_to_level, avg 14µs/call |
| 190 | } | ||||
| 191 | |||||
| 192 | package NetAddr::IP::UtilPolluted; | ||||
| 193 | |||||
| 194 | # Socket pollutes the name space with all of its symbols. Since | ||||
| 195 | # we don't want them all, confine them to this name space. | ||||
| 196 | |||||
| 197 | 2 | 25µs | 2 | 38µs | # spent 22µs (7+15) within NetAddr::IP::UtilPolluted::BEGIN@197 which was called:
# once (7µs+15µs) by NetAddr::IP::Lite::BEGIN@18 at line 197 # spent 22µs making 1 call to NetAddr::IP::UtilPolluted::BEGIN@197
# spent 15µs making 1 call to strict::import |
| 198 | 2 | 405µs | 2 | 1.22ms | # spent 618µs (18+600) within NetAddr::IP::UtilPolluted::BEGIN@198 which was called:
# once (18µs+600µs) by NetAddr::IP::Lite::BEGIN@18 at line 198 # spent 618µs making 1 call to NetAddr::IP::UtilPolluted::BEGIN@198
# spent 600µs making 1 call to Exporter::import |
| 199 | |||||
| 200 | 1 | 200ns | 1 | 1µs | my $_v4zero = pack('L',0); # spent 1µs making 1 call to main::CORE:pack |
| 201 | 1 | 100ns | 1 | 800ns | my $_zero = pack('L4',0,0,0,0); # spent 800ns making 1 call to main::CORE:pack |
| 202 | |||||
| 203 | # invoke replacement subroutine for Perl's "gethostbyname" | ||||
| 204 | # if Socket6 is available. | ||||
| 205 | # | ||||
| 206 | # NOTE: in certain BSD implementations, Perl's gethostbyname is broken | ||||
| 207 | # we will use our own InetBase::inet_aton instead | ||||
| 208 | |||||
| 209 | sub _end_gethostbyname { | ||||
| 210 | # my ($name,$aliases,$addrtype,$length,@addrs) = @_; | ||||
| 211 | my @rv = @_; | ||||
| 212 | # first ip address = rv[4] | ||||
| 213 | my $tip = $rv[4]; | ||||
| 214 | unless ($tip && $tip ne $_v4zero && $tip ne $_zero) { | ||||
| 215 | @rv = (); | ||||
| 216 | } | ||||
| 217 | # length = rv[3] | ||||
| 218 | elsif ($rv[3] && $rv[3] == 4) { | ||||
| 219 | foreach (4..$#rv) { | ||||
| 220 | $rv[$_] = NetAddr::IP::Util::inet_4map6(NetAddr::IP::Util::ipv4to6($rv[$_])); | ||||
| 221 | } | ||||
| 222 | $rv[3] = 16; # unconditionally set length to 16 | ||||
| 223 | } | ||||
| 224 | elsif ($rv[3] == 16) { | ||||
| 225 | ; # is ok | ||||
| 226 | } else { | ||||
| 227 | @rv = (); | ||||
| 228 | } | ||||
| 229 | return @rv; | ||||
| 230 | } | ||||
| 231 | |||||
| 232 | 2 | 2µs | unless ( eval { require Socket6 }) { | ||
| 233 | $mygethostbyname = sub { | ||||
| 234 | # SEE NOTE above about broken BSD | ||||
| 235 | my @tip = gethostbyname(NetAddr::IP::InetBase::fillIPv4($_[0])); | ||||
| 236 | return &_end_gethostbyname(@tip); | ||||
| 237 | }; | ||||
| 238 | } else { | ||||
| 239 | 1 | 2µs | 1 | 25µs | import Socket6 qw( gethostbyname2 getipnodebyname ); # spent 25µs making 1 call to Exporter::import |
| 240 | 3 | 60µs | 1 | 51µs | my $try = eval { my @try = gethostbyname2('127.0.0.1',NetAddr::IP::Util::AF_INET()); $try[4] }; # spent 51µs making 1 call to Socket6::gethostbyname2 |
| 241 | 1 | 900ns | if (! $@ && $try && $try eq INADDR_LOOPBACK()) { | ||
| 242 | 1 | 1µs | *_ghbn2 = \&Socket6::gethostbyname2; | ||
| 243 | 1 | 300ns | $havegethostbyname2 = 1; | ||
| 244 | } else { | ||||
| 245 | *_ghbn2 = sub { return () }; # use failure branch below | ||||
| 246 | } | ||||
| 247 | |||||
| 248 | $mygethostbyname = sub { | ||||
| 249 | my @tip; | ||||
| 250 | unless ($_Sock6ok && (@tip = _ghbn2($_[0],NetAddr::IP::Util::AF_INET6())) && @tip > 1) { | ||||
| 251 | # SEE NOTE above about broken BSD | ||||
| 252 | @tip = gethostbyname(NetAddr::IP::InetBase::fillIPv4($_[0])); | ||||
| 253 | } | ||||
| 254 | return &_end_gethostbyname(@tip); | ||||
| 255 | 1 | 3µs | }; | ||
| 256 | } | ||||
| 257 | |||||
| 258 | package NetAddr::IP::Util; | ||||
| 259 | |||||
| 260 | sub naip_gethostbyname { | ||||
| 261 | # turn off complaint from Socket6 about missing numeric argument | ||||
| 262 | undef local $^W; | ||||
| 263 | my @rv = &$mygethostbyname($_[0]); | ||||
| 264 | return wantarray | ||||
| 265 | ? @rv | ||||
| 266 | : $rv[4]; | ||||
| 267 | } | ||||
| 268 | |||||
| 269 | 1 | 22µs | 1; | ||
| 270 | |||||
| 271 | __END__ | ||||
# spent 3µs within NetAddr::IP::Util::CORE:match which was called:
# once (3µs+0s) by NetAddr::IP::Lite::BEGIN@18 at line 24 | |||||
# spent 42µs within NetAddr::IP::Util::bootstrap which was called:
# once (42µs+0s) by DynaLoader::bootstrap at line 207 of DynaLoader.pm | |||||
# spent 46.5ms within NetAddr::IP::Util::ipv4to6 which was called 47820 times, avg 973ns/call:
# 47820 times (46.5ms+0s) by NetAddr::IP::Lite::_xnew at line 1043 of NetAddr/IP/Lite.pm, avg 973ns/call | |||||
# spent 3µs within NetAddr::IP::Util::mask4to6 which was called:
# once (3µs+0s) by NetAddr::IP::BEGIN@8 at line 652 of NetAddr/IP/Lite.pm | |||||
# spent 34.0ms within NetAddr::IP::Util::notcontiguous which was called 47820 times, avg 711ns/call:
# 47820 times (34.0ms+0s) by NetAddr::IP::Lite::_xnew at line 1059 of NetAddr/IP/Lite.pm, avg 711ns/call | |||||
# spent 8µs within NetAddr::IP::Util::shiftleft which was called 3 times, avg 3µs/call:
# 3 times (8µs+0s) by NetAddr::IP::Lite::_xnew at line 893 of NetAddr/IP/Lite.pm, avg 3µs/call |