Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/JSON/Pointer.pm |
Statements | Executed 380420 statements in 864ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
47846 | 1 | 1 | 599ms | 950ms | _pointer | Mojo::JSON::Pointer::
47846 | 3 | 2 | 208ms | 1.16s | get | Mojo::JSON::Pointer::
146708 | 3 | 1 | 90.0ms | 90.0ms | CORE:subst (opcode) | Mojo::JSON::Pointer::
211 | 1 | 1 | 889µs | 889µs | CORE:match (opcode) | Mojo::JSON::Pointer::
15 | 2 | 2 | 101µs | 130µs | new | Mojo::JSON::Pointer::
1 | 1 | 1 | 43µs | 199µs | BEGIN@2 | Mojo::JSON::Pointer::
0 | 0 | 0 | 0s | 0s | contains | Mojo::JSON::Pointer::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Mojo::JSON::Pointer; | ||||
2 | 2 | 369µs | 2 | 355µs | # spent 199µs (43+156) within Mojo::JSON::Pointer::BEGIN@2 which was called:
# once (43µs+156µs) by Moo::_Utils::_require at line 2 # spent 199µs making 1 call to Mojo::JSON::Pointer::BEGIN@2
# spent 156µs making 1 call to Mojo::Base::import |
3 | |||||
4 | 1 | 2µs | 1 | 65µs | has 'data'; # spent 65µs making 1 call to Mojo::JSON::Pointer::has |
5 | |||||
6 | sub contains { shift->_pointer(0, @_) } | ||||
7 | 47846 | 140ms | 47846 | 950ms | # spent 1.16s (208ms+950ms) within Mojo::JSON::Pointer::get which was called 47846 times, avg 24µs/call:
# 39123 times (178ms+716ms) by JSON::Schema::Modern::_fetch_from_uri at line 858 of JSON/Schema/Modern.pm, avg 23µs/call
# 7758 times (23.5ms+155ms) by JSON::Schema::Modern::_fetch_from_uri at line 882 of JSON/Schema/Modern.pm, avg 23µs/call
# 965 times (6.30ms+78.7ms) by JSON::Schema::Modern::Document::OpenAPI::traverse at line 161 of JSON/Schema/Modern/Document/OpenAPI.pm, avg 88µs/call # spent 950ms making 47846 calls to Mojo::JSON::Pointer::_pointer, avg 20µs/call |
8 | |||||
9 | 15 | 73µs | 15 | 29µs | # spent 130µs (101+29) within Mojo::JSON::Pointer::new which was called 15 times, avg 9µs/call:
# 14 times (93µs+26µs) by JSON::Schema::Modern::Document::new at line 53 of (eval 428)[Sub/Quote.pm:3], avg 8µs/call
# once (8µs+3µs) by JSON::Schema::Modern::Document::OpenAPI::new at line 56 of (eval 421)[Sub/Quote.pm:3] # spent 29µs making 15 calls to Mojo::Base::new, avg 2µs/call |
10 | |||||
11 | # spent 950ms (599+351) within Mojo::JSON::Pointer::_pointer which was called 47846 times, avg 20µs/call:
# 47846 times (599ms+351ms) by Mojo::JSON::Pointer::get at line 7, avg 20µs/call | ||||
12 | 47846 | 31.2ms | my ($self, $get, $pointer) = @_; | ||
13 | |||||
14 | 47846 | 95.6ms | 47846 | 261ms | my $data = $self->data; # spent 261ms making 47846 calls to JSON::Schema::Modern::Document::data, avg 5µs/call |
15 | 47846 | 236ms | 47846 | 56.1ms | return length $pointer ? undef : $get ? $data : 1 unless $pointer =~ s!^/!!; # spent 56.1ms making 47846 calls to Mojo::JSON::Pointer::CORE:subst, avg 1µs/call |
16 | 20362 | 51.1ms | for my $p (length $pointer ? (split /\//, $pointer, -1) : ($pointer)) { | ||
17 | 49431 | 92.8ms | 49431 | 21.0ms | $p =~ s!~1!/!g; # spent 21.0ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 424ns/call |
18 | 49431 | 75.4ms | 49431 | 12.8ms | $p =~ s/~0/~/g; # spent 12.8ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 260ns/call |
19 | |||||
20 | # Hash | ||||
21 | 49431 | 101ms | 211 | 889µs | if (ref $data eq 'HASH' && exists $data->{$p}) { $data = $data->{$p} } # spent 889µs making 211 calls to Mojo::JSON::Pointer::CORE:match, avg 4µs/call |
22 | |||||
23 | # Array | ||||
24 | elsif (ref $data eq 'ARRAY' && $p =~ /^\d+$/ && @$data > $p) { $data = $data->[$p] } | ||||
25 | |||||
26 | # Nothing | ||||
27 | else { return undef } | ||||
28 | } | ||||
29 | |||||
30 | 20362 | 40.4ms | return $get ? $data : 1; | ||
31 | } | ||||
32 | |||||
33 | 1 | 4µs | 1; | ||
34 | |||||
35 | =encoding utf8 | ||||
36 | |||||
37 | =head1 NAME | ||||
38 | |||||
39 | Mojo::JSON::Pointer - JSON Pointers | ||||
40 | |||||
41 | =head1 SYNOPSIS | ||||
42 | |||||
43 | use Mojo::JSON::Pointer; | ||||
44 | |||||
45 | my $pointer = Mojo::JSON::Pointer->new({foo => [23, 'bar']}); | ||||
46 | say $pointer->get('/foo/1'); | ||||
47 | say 'Contains "/foo".' if $pointer->contains('/foo'); | ||||
48 | |||||
49 | =head1 DESCRIPTION | ||||
50 | |||||
51 | L<Mojo::JSON::Pointer> is an implementation of L<RFC 6901|https://tools.ietf.org/html/rfc6901>. | ||||
52 | |||||
53 | =head1 ATTRIBUTES | ||||
54 | |||||
55 | L<Mojo::JSON::Pointer> implements the following attributes. | ||||
56 | |||||
57 | =head2 data | ||||
58 | |||||
59 | my $data = $pointer->data; | ||||
60 | $pointer = $pointer->data({foo => 'bar'}); | ||||
61 | |||||
62 | Data structure to be processed. | ||||
63 | |||||
64 | =head1 METHODS | ||||
65 | |||||
66 | L<Mojo::JSON::Pointer> inherits all methods from L<Mojo::Base> and implements the following new ones. | ||||
67 | |||||
68 | =head2 contains | ||||
69 | |||||
70 | my $bool = $pointer->contains('/foo/1'); | ||||
71 | |||||
72 | Check if L</"data"> contains a value that can be identified with the given JSON Pointer. | ||||
73 | |||||
74 | # True | ||||
75 | Mojo::JSON::Pointer->new('just a string')->contains(''); | ||||
76 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/♥'); | ||||
77 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/foo'); | ||||
78 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/1'); | ||||
79 | |||||
80 | # False | ||||
81 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/☃'); | ||||
82 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/bar'); | ||||
83 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/9'); | ||||
84 | |||||
85 | =head2 get | ||||
86 | |||||
87 | my $value = $pointer->get('/foo/bar'); | ||||
88 | |||||
89 | Extract value from L</"data"> identified by the given JSON Pointer. | ||||
90 | |||||
91 | # "just a string" | ||||
92 | Mojo::JSON::Pointer->new('just a string')->get(''); | ||||
93 | |||||
94 | # "mojolicious" | ||||
95 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->get('/♥'); | ||||
96 | |||||
97 | # "bar" | ||||
98 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/foo'); | ||||
99 | |||||
100 | # "4" | ||||
101 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/0'); | ||||
102 | |||||
103 | # "6" | ||||
104 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/2'); | ||||
105 | |||||
106 | =head2 new | ||||
107 | |||||
108 | my $pointer = Mojo::JSON::Pointer->new; | ||||
109 | my $pointer = Mojo::JSON::Pointer->new({foo => 'bar'}); | ||||
110 | |||||
111 | Build new L<Mojo::JSON::Pointer> object. | ||||
112 | |||||
113 | =head1 SEE ALSO | ||||
114 | |||||
115 | L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>. | ||||
116 | |||||
117 | =cut | ||||
# spent 889µs within Mojo::JSON::Pointer::CORE:match which was called 211 times, avg 4µs/call:
# 211 times (889µs+0s) by Mojo::JSON::Pointer::_pointer at line 21, avg 4µs/call | |||||
# spent 90.0ms within Mojo::JSON::Pointer::CORE:subst which was called 146708 times, avg 613ns/call:
# 49431 times (21.0ms+0s) by Mojo::JSON::Pointer::_pointer at line 17, avg 424ns/call
# 49431 times (12.8ms+0s) by Mojo::JSON::Pointer::_pointer at line 18, avg 260ns/call
# 47846 times (56.1ms+0s) by Mojo::JSON::Pointer::_pointer at line 15, avg 1µs/call |