← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 15:57:08 2022
Reported on Wed Dec 14 16:00:37 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/Applicator.pm
StatementsExecuted 814653 statements in 1.71s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3249211844ms99.4sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_propertiesJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_properties (recurses: max depth 11, inclusive time 379s)
600211479ms74.1sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_allOfJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_allOf (recurses: max depth 13, inclusive time 206s)
336911138ms82.3sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_patternPropertiesJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties (recurses: max depth 2, inclusive time 38.2s)
30131192.0ms74.9sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_ifJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_if (recurses: max depth 1, inclusive time 4.49s)
9771166.3ms70.6sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_additionalPropertiesJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_additionalProperties (recurses: max depth 4, inclusive time 44.7s)
11821157.5ms3.25sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_anyOfJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_anyOf
372657155.4ms55.4msJSON::Schema::Modern::Vocabulary::Applicator::::CORE:sortJSON::Schema::Modern::Vocabulary::Applicator::CORE:sort (opcode)
17581150.6ms23.6sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword__items_schemaJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword__items_schema (recurses: max depth 4, inclusive time 2.52s)
83402130.7ms30.7msJSON::Schema::Modern::Vocabulary::Applicator::::CORE:regcompJSON::Schema::Modern::Vocabulary::Applicator::CORE:regcomp (opcode)
6271121.4ms449msJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_propertyNamesJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_propertyNames
17581114.7ms23.6sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_itemsJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_items (recurses: max depth 4, inclusive time 2.52s)
3051111.9ms315msJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_oneOfJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_oneOf
305119.89ms4.19sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_dependentSchemasJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_dependentSchemas
8340214.32ms4.32msJSON::Schema::Modern::Vocabulary::Applicator::::CORE:matchJSON::Schema::Modern::Vocabulary::Applicator::CORE:match (opcode)
387112.26ms343msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_propertiesJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_properties (recurses: max depth 3, inclusive time 40.9ms)
1112.06ms2.43msJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@19JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@19
1111.88ms4.62msJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@21JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@21
9811859µs105msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_itemsJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_items (recurses: max depth 1, inclusive time 5.42ms)
13011849µs33.4msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_additionalPropertiesJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_additionalProperties (recurses: max depth 1, inclusive time 7.05ms)
6511320µs21.3msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_thenJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_then
6511318µs13.3msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_ifJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_if
3211182µs15.1msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_anyOfJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_anyOf (recurses: max depth 1, inclusive time 192µs)
611151µs1.96msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_patternPropertiesJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_patternProperties
2311112µs26.2msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_allOfJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_allOf
41197µs2.98msJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_notJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_not
211186µs18.6msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_oneOfJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_oneOf
151185µs1.54msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_notJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_not
151183µs5.34msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_elseJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_else
141178µs5.18msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_propertyNamesJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_propertyNames
22149µs65µsJSON::Schema::Modern::Vocabulary::Applicator::::keywordsJSON::Schema::Modern::Vocabulary::Applicator::keywords
11136µs39µsModule::Runtime::::BEGIN@1.306 Module::Runtime::BEGIN@1.306
11132µs104µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@17JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@17
31130µs4.78msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_dependentSchemasJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_dependentSchemas
11127µs50µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@16JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@16
11125µs106µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@13JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@13
11125µs129µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@15JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@15
11125µs97µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@20JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@20
31120µs7.47msJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_containsJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_contains
11115µs734µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@11JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@11
11115µs57µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@14JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@14
11114µs42µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@18JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@18
11111µs211µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@12JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@12
11110µs10µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@9JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@9
1118µs208µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@10JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@10
1118µs274µsJSON::Schema::Modern::Vocabulary::Applicator::::BEGIN@22JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@22
1117µs37µsModule::Runtime::::BEGIN@2.307 Module::Runtime::BEGIN@2.307
4116µs6µsJSON::Schema::Modern::Vocabulary::Applicator::::CORE:qrJSON::Schema::Modern::Vocabulary::Applicator::CORE:qr (opcode)
4112µs2µsJSON::Schema::Modern::Vocabulary::Applicator::::evaluation_orderJSON::Schema::Modern::Vocabulary::Applicator::evaluation_order
1112µs2µsJSON::Schema::Modern::Vocabulary::Applicator::::vocabularyJSON::Schema::Modern::Vocabulary::Applicator::vocabulary
1111µs1µsJSON::Schema::Modern::Vocabulary::Applicator::::__ANON__JSON::Schema::Modern::Vocabulary::Applicator::__ANON__ (xsub)
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::__ANON__[:448]JSON::Schema::Modern::Vocabulary::Applicator::__ANON__[:448]
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::__ANON__[:63]JSON::Schema::Modern::Vocabulary::Applicator::__ANON__[:63]
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword__items_array_schemasJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword__items_array_schemas
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_additionalItemsJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_additionalItems
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_containsJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_contains
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_dependenciesJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_dependencies
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_eval_keyword_prefixItemsJSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_prefixItems
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_additionalItemsJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_additionalItems
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_dependenciesJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_dependencies
0000s0sJSON::Schema::Modern::Vocabulary::Applicator::::_traverse_keyword_prefixItemsJSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_prefixItems
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1234µs242µs
# spent 39µs (36+3) within Module::Runtime::BEGIN@1.306 which was called: # once (36µs+3µs) by Module::Runtime::require_module at line 1
use strict;
# spent 39µs making 1 call to Module::Runtime::BEGIN@1.306 # spent 3µs making 1 call to strict::import
2239µs267µs
# spent 37µs (7+30) within Module::Runtime::BEGIN@2.307 which was called: # once (7µs+30µs) by Module::Runtime::require_module at line 2
use warnings;
# spent 37µs making 1 call to Module::Runtime::BEGIN@2.307 # spent 30µs making 1 call to warnings::import
3package JSON::Schema::Modern::Vocabulary::Applicator;
4# vim: set ts=8 sts=2 sw=2 tw=100 et :
5# ABSTRACT: Implementation of the JSON Schema Applicator vocabulary
6
710sour $VERSION = '0.556';
8
9227µs110µs
# spent 10µs within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@9 which was called: # once (10µs+0s) by Module::Runtime::require_module at line 9
use 5.020;
10222µs2408µs
# spent 208µs (8+200) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@10 which was called: # once (8µs+200µs) by Module::Runtime::require_module at line 10
use Moo;
# spent 208µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@10 # spent 200µs making 1 call to Moo::import
11395µs31.45ms
# spent 734µs (15+719) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@11 which was called: # once (15µs+719µs) by Module::Runtime::require_module at line 11
use strictures 2;
# spent 734µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@11 # spent 702µs making 1 call to strictures::import # spent 17µs making 1 call to strictures::VERSION
12269µs2411µs
# spent 211µs (11+200) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@12 which was called: # once (11µs+200µs) by Module::Runtime::require_module at line 12
use experimental qw(signatures postderef);
# spent 211µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@12 # spent 200µs making 1 call to experimental::import
13256µs2111µs
# spent 106µs (25+81) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@13 which was called: # once (25µs+81µs) by Module::Runtime::require_module at line 13
use if "$]" >= 5.022, experimental => 're_strict';
# spent 106µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@13 # spent 5µs making 1 call to if::import
14241µs261µs
# spent 57µs (15+42) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@14 which was called: # once (15µs+42µs) by Module::Runtime::require_module at line 14
no if "$]" >= 5.031009, feature => 'indirect';
# spent 57µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@14 # spent 4µs making 1 call to if::unimport
15277µs2131µs
# spent 129µs (25+104) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@15 which was called: # once (25µs+104µs) by Module::Runtime::require_module at line 15
no if "$]" >= 5.033001, feature => 'multidimensional';
# spent 129µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@15 # spent 2µs making 1 call to if::unimport
16252µs252µs
# spent 50µs (27+23) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@16 which was called: # once (27µs+23µs) by Module::Runtime::require_module at line 16
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
# spent 50µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@16 # spent 2µs making 1 call to if::unimport
17376µs3130µs
# spent 104µs (32+72) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@17 which was called: # once (32µs+72µs) by Module::Runtime::require_module at line 17
use List::Util 1.45 qw(any uniqstr);
# spent 104µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@17 # spent 15µs making 1 call to List::Util::import # spent 11µs making 1 call to UNIVERSAL::VERSION
18352µs370µs
# spent 42µs (14+28) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@18 which was called: # once (14µs+28µs) by Module::Runtime::require_module at line 18
use Ref::Util 0.100 'is_plain_arrayref';
# spent 42µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@18 # spent 21µs making 1 call to Exporter::import # spent 7µs making 1 call to UNIVERSAL::VERSION
192731µs22.44ms
# spent 2.43ms (2.06+367µs) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@19 which was called: # once (2.06ms+367µs) by Module::Runtime::require_module at line 19
use Sub::Install;
20229µs2169µs
# spent 97µs (25+72) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@20 which was called: # once (25µs+72µs) by Module::Runtime::require_module at line 20
use JSON::Schema::Modern::Utilities qw(is_type jsonp E A assert_keyword_type assert_pattern true is_elements_unique);
# spent 97µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@20 # spent 72µs making 1 call to Exporter::import
212429µs24.62ms
# spent 4.62ms (1.88+2.74) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@21 which was called: # once (1.88ms+2.74ms) by Module::Runtime::require_module at line 21
use JSON::Schema::Modern::Vocabulary::Unevaluated;
2223.70ms2540µs
# spent 274µs (8+266) within JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@22 which was called: # once (8µs+266µs) by Module::Runtime::require_module at line 22
use namespace::clean;
# spent 274µs making 1 call to JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@22 # spent 266µs making 1 call to namespace::clean::import
23
2412µs1421µswith 'JSON::Schema::Modern::Vocabulary';
# spent 421µs making 1 call to Moo::with
25
26
# spent 2µs within JSON::Schema::Modern::Vocabulary::Applicator::vocabulary which was called: # once (2µs+0s) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:696] at line 692 of JSON/Schema/Modern.pm
sub vocabulary {
2713µs 'https://json-schema.org/draft/2019-09/vocab/applicator' => 'draft2019-09',
28 'https://json-schema.org/draft/2020-12/vocab/applicator' => 'draft2020-12';
29}
30
3147µs
# spent 2µs within JSON::Schema::Modern::Vocabulary::Applicator::evaluation_order which was called 4 times, avg 500ns/call: # 4 times (2µs+0s) by JSON::Schema::Modern::Vocabulary::Core::CORE:sort at line 331 of JSON/Schema/Modern/Vocabulary/Core.pm, avg 500ns/call
sub evaluation_order { 1 }
32
33# the keyword order is arbitrary, except:
34# - if must be evaluated before then, else
35# - items must be evaluated before additionalItems
36# - in-place applicators (allOf, anyOf, oneOf, not, if/then/else, dependentSchemas) and items,
37# additionalItems must be evaluated before unevaluatedItems (in the Unevaluated vocabulary)
38# - properties and patternProperties must be evaluated before additionalProperties
39# - in-place applicators and properties, patternProperties, additionalProperties must be evaluated
40# before unevaluatedProperties (in the Unevaluated vocabulary)
41# - contains must be evaluated before maxContains, minContains (in the Validator vocabulary)
4261µs
# spent 65µs (49+16) within JSON::Schema::Modern::Vocabulary::Applicator::keywords which was called 2 times, avg 32µs/call: # once (27µs+10µs) by JSON::Schema::Modern::_traverse_subschema at line 471 of JSON/Schema/Modern.pm # once (22µs+6µs) by JSON::Schema::Modern::_eval_subschema at line 559 of JSON/Schema/Modern.pm
sub keywords ($self, $spec_version) {
43 return (
44268µs1216µs qw(allOf anyOf oneOf not if then else),
# spent 6µs making 4 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:qr, avg 2µs/call # spent 6µs making 4 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:regcomp, avg 2µs/call # spent 4µs making 4 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:match, avg 1µs/call
45 $spec_version eq 'draft7' ? 'dependencies' : 'dependentSchemas',
46 $spec_version !~ qr/^draft(7|2019-09)$/ ? 'prefixItems' : (),
47 'items',
48 $spec_version =~ qr/^draft(7|2019-09)$/ ? 'additionalItems' : (),
49 qw(contains properties patternProperties additionalProperties propertyNames),
50 $spec_version eq 'draft2019-09' ? qw(unevaluatedItems unevaluatedProperties) : (),
51 );
52}
53
54# in draft2019-09, the unevaluated keywords were part of the Applicator vocabulary
5510sforeach my $phase (qw(traverse eval)) {
5622µs foreach my $type (qw(Items Properties)) {
5743µs my $method = '_'.$phase.'_keyword_unevaluated'.$type;
58 Sub::Install::install_sub({
59 as => $method,
60 code => sub {
61 shift;
62 JSON::Schema::Modern::Vocabulary::Unevaluated->$method(@_);
63 }
64411µs4109µs }),
# spent 109µs making 4 calls to Sub::Install::__ANON__[Sub/Install.pm:118], avg 27µs/call
65 }
66}
67
6823131µs2325.1ms
# spent 26.2ms (112µs+26.1) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_allOf which was called 23 times, avg 1.14ms/call: # 23 times (112µs+26.1ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 1.14ms/call
sub _traverse_keyword_allOf { shift->traverse_array_schemas(@_) }
# spent 26.1ms making 23 calls to JSON::Schema::Modern::Vocabulary::traverse_array_schemas, avg 1.14ms/call, recursion: max depth 1, sum of overlapping time 1.05ms
69
70300107.06ms
# spent 74.1s (479ms+73.7) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_allOf which was called 6002 times, avg 12.4ms/call: # 6002 times (479ms+73.7s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 12.4ms/call
sub _eval_keyword_allOf ($self, $data, $schema, $state) {
7160021.21ms my @invalid;
72600212.6ms foreach my $idx (0 .. $schema->{allOf}->$#*) {
7325750402ms257500s if ($self->eval($data, $schema->{allOf}[$idx], +{ %$state,
# spent 280s making 25750 calls to JSON::Schema::Modern::Vocabulary::eval, avg 10.9ms/call, recursion: max depth 32, sum of overlapping time 280s
74 schema_path => $state->{schema_path}.'/allOf/'.$idx })) {
75 }
76 else {
77 push @invalid, $idx;
78 last if $state->{short_circuit};
79 }
80 }
81
82600220.8ms return 1 if @invalid == 0;
83
84 my $pl = @invalid > 1;
85 return E($state, 'subschema%s %s %s not valid', $pl?'s':'', join(', ', @invalid), $pl?'are':'is');
86}
87
8832170µs3213.7ms
# spent 15.1ms (182µs+15.0) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_anyOf which was called 32 times, avg 473µs/call: # 32 times (182µs+15.0ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 473µs/call
sub _traverse_keyword_anyOf { shift->traverse_array_schemas(@_) }
# spent 15.1ms making 32 calls to JSON::Schema::Modern::Vocabulary::traverse_array_schemas, avg 473µs/call, recursion: max depth 2, sum of overlapping time 1.47ms
89
90591010.8ms
# spent 3.25s (57.5ms+3.19) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_anyOf which was called 1182 times, avg 2.75ms/call: # 1182 times (57.5ms+3.19s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 2.75ms/call
sub _eval_keyword_anyOf ($self, $data, $schema, $state) {
911182392µs my $valid = 0;
921182295µs my @errors;
9311823.33ms foreach my $idx (0 .. $schema->{anyOf}->$#*) {
94 next if not $self->eval($data, $schema->{anyOf}[$idx],
95236532.7ms23654.60ms +{ %$state, errors => \@errors, schema_path => $state->{schema_path}.'/anyOf/'.$idx });
# spent 3.19s making 2365 calls to JSON::Schema::Modern::Vocabulary::eval, avg 1.35ms/call, recursion: max depth 34, sum of overlapping time 3.19s
961183530µs ++$valid;
9711831.27ms last if $state->{short_circuit};
98 }
99
10011827.28ms return 1 if $valid;
101 push $state->{errors}->@*, @errors;
102 return E($state, 'no subschemas are valid');
103}
104
1052177µs2118.6ms
# spent 18.6ms (86µs+18.6) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_oneOf which was called 21 times, avg 887µs/call: # 21 times (86µs+18.6ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 887µs/call
sub _traverse_keyword_oneOf { shift->traverse_array_schemas(@_) }
# spent 18.6ms making 21 calls to JSON::Schema::Modern::Vocabulary::traverse_array_schemas, avg 883µs/call
106
1071525331µs
# spent 315ms (11.9+303) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_oneOf which was called 305 times, avg 1.03ms/call: # 305 times (11.9ms+303ms) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 1.03ms/call
sub _eval_keyword_oneOf ($self, $data, $schema, $state) {
10830585µs my (@valid, @errors);
109305956µs foreach my $idx (0 .. $schema->{oneOf}->$#*) {
110 next if not $self->eval($data, $schema->{oneOf}[$idx],
1116107.80ms6100s +{ %$state, errors => \@errors, schema_path => $state->{schema_path}.'/oneOf/'.$idx });
# spent 303ms making 610 calls to JSON::Schema::Modern::Vocabulary::eval, avg 497µs/call, recursion: max depth 9, sum of overlapping time 303ms
112305243µs push @valid, $idx;
113305271µs last if @valid > 1 and $state->{short_circuit};
114 }
115
1163051.95ms return 1 if @valid == 1;
117
118 if (not @valid) {
119 push $state->{errors}->@*, @errors;
120 return E($state, 'no subschemas are valid');
121 }
122 else {
123 return E($state, 'multiple subschemas are valid: '.join(', ', @valid));
124 }
125}
126
1271569µs151.07ms
# spent 1.54ms (85µs+1.45) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_not which was called 15 times, avg 102µs/call: # 15 times (85µs+1.45ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 102µs/call
sub _traverse_keyword_not { shift->traverse_subschema(@_) }
# spent 1.45ms making 15 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 97µs/call, recursion: max depth 1, sum of overlapping time 377µs
128
129204µs
# spent 2.98ms (97µs+2.89) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_not which was called 4 times, avg 746µs/call: # 4 times (97µs+2.89ms) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 746µs/call
sub _eval_keyword_not ($self, $data, $schema, $state) {
130 return 1 if not $self->eval($data, $schema->{not},
131 +{ %$state, schema_path => $state->{schema_path}.'/not',
132 short_circuit => $state->{short_circuit} || !$state->{collect_annotations},
133470µs40s errors => [] });
# spent 2.89ms making 4 calls to JSON::Schema::Modern::Vocabulary::eval, avg 722µs/call, recursion: max depth 12, sum of overlapping time 2.89ms
134
135 return E($state, 'subschema is valid');
136}
137
13865320µs6511.2ms
# spent 13.3ms (318µs+13.0) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_if which was called 65 times, avg 205µs/call: # 65 times (318µs+13.0ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 205µs/call
sub _traverse_keyword_if { shift->traverse_subschema(@_) }
# spent 13.0ms making 65 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 200µs/call, recursion: max depth 2, sum of overlapping time 1.81ms
13965253µs6518.2ms
# spent 21.3ms (320µs+20.9) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_then which was called 65 times, avg 327µs/call: # 65 times (320µs+20.9ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 327µs/call
sub _traverse_keyword_then { shift->traverse_subschema(@_) }
# spent 20.9ms making 65 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 322µs/call, recursion: max depth 2, sum of overlapping time 2.74ms
1401581µs155.26ms
# spent 5.34ms (83µs+5.26) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_else which was called 15 times, avg 356µs/call: # 15 times (83µs+5.26ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 356µs/call
sub _traverse_keyword_else { shift->traverse_subschema(@_) }
# spent 5.26ms making 15 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 351µs/call
141
142150653.30ms
# spent 74.9s (92.0ms+74.8) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_if which was called 3013 times, avg 24.8ms/call: # 3013 times (92.0ms+74.8s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 24.8ms/call
sub _eval_keyword_if ($self, $data, $schema, $state) {
143 return 1 if not exists $schema->{then} and not exists $schema->{else}
14430131.49ms and not $state->{collect_annotations};
145 my $keyword = $self->eval($data, $schema->{if},
146 +{ %$state, schema_path => $state->{schema_path}.'/if',
147 short_circuit => $state->{short_circuit} || !$state->{collect_annotations},
148301349.6ms30130s errors => [],
# spent 2.62s making 3013 calls to JSON::Schema::Modern::Vocabulary::eval, avg 871µs/call, recursion: max depth 11, sum of overlapping time 2.62s
149 })
150 ? 'then' : 'else';
151
15230133.97ms return 1 if not exists $schema->{$keyword};
153 return 1 if $self->eval($data, $schema->{$keyword},
154221428.8ms22140s +{ %$state, schema_path => $state->{schema_path}.'/'.$keyword });
# spent 76.6s making 2214 calls to JSON::Schema::Modern::Vocabulary::eval, avg 34.6ms/call, recursion: max depth 11, sum of overlapping time 76.6s
155 return E({ %$state, keyword => $keyword }, 'subschema is not valid');
156}
157
158315µs30s
# spent 4.78ms (30µs+4.75) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_dependentSchemas which was called 3 times, avg 1.59ms/call: # 3 times (30µs+4.75ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 1.59ms/call
sub _traverse_keyword_dependentSchemas { shift->traverse_object_schemas(@_) }
# spent 4.75ms making 3 calls to JSON::Schema::Modern::Vocabulary::traverse_object_schemas, avg 1.58ms/call, recursion: max depth 1, sum of overlapping time 4.75ms
159
1601525292µs
# spent 4.19s (9.89ms+4.18) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_dependentSchemas which was called 305 times, avg 13.7ms/call: # 305 times (9.89ms+4.18s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 13.7ms/call
sub _eval_keyword_dependentSchemas ($self, $data, $schema, $state) {
161305471µs305562µs return 1 if not is_type('object', $data);
# spent 562µs making 305 calls to JSON::Schema::Modern::Utilities::is_type, avg 2µs/call
162
163305170µs my $valid = 1;
1643051.42ms305167µs foreach my $property (sort keys $schema->{dependentSchemas}->%*) {
# spent 167µs making 305 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 548ns/call
165305106µs next if not exists $data->{$property};
166
1672903.02ms5802.54ms if ($self->eval($data, $schema->{dependentSchemas}{$property},
# spent 2.54ms making 290 calls to JSON::Schema::Modern::Utilities::jsonp, avg 9µs/call # spent 4.18s making 290 calls to JSON::Schema::Modern::Vocabulary::eval, avg 14.4ms/call, recursion: max depth 9, sum of overlapping time 4.18s
168 +{ %$state, schema_path => jsonp($state->{schema_path}, 'dependentSchemas', $property) })) {
1692902.67ms next;
170 }
171
172 $valid = 0;
173 last if $state->{short_circuit};
174 }
175
176305133µs return E($state, 'not all dependencies are satisfied') if not $valid;
177305868µs return 1;
178}
179
180sub _traverse_keyword_dependencies ($self, $schema, $state) {
181 return if not assert_keyword_type($state, $schema, 'object');
182
183 my $valid = 1;
184 foreach my $property (sort keys $schema->{dependencies}->%*) {
185 if (is_type('array', $schema->{dependencies}{$property})) {
186 # as in dependentRequired
187
188 foreach my $index (0..$schema->{dependencies}{$property}->$#*) {
189 $valid = E({ %$state, _schema_path_suffix => [ $property, $index ] }, 'element #%d is not a string', $index)
190 if not is_type('string', $schema->{dependencies}{$property}[$index]);
191 }
192
193 $valid = E({ %$state, _schema_path_suffix => $property }, 'elements are not unique')
194 if not is_elements_unique($schema->{dependencies}{$property});
195 }
196 else {
197 # as in dependentSchemas
198 $valid = 0 if not $self->traverse_property_schema($schema, $state, $property);
199 }
200 }
201 return $valid;
202}
203
204sub _eval_keyword_dependencies ($self, $data, $schema, $state) {
205 return 1 if not is_type('object', $data);
206
207 my $valid = 1;
208 foreach my $property (sort keys $schema->{dependencies}->%*) {
209 next if not exists $data->{$property};
210
211 if (is_type('array', $schema->{dependencies}{$property})) {
212 # as in dependentRequired
213 if (my @missing = grep !exists($data->{$_}), $schema->{dependencies}{$property}->@*) {
214 $valid = E({ %$state, _schema_path_suffix => $property },
215 'missing propert%s: %s', @missing > 1 ? 'ies' : 'y', join(', ', @missing));
216 }
217 }
218 else {
219 # as in dependentSchemas
220 if ($self->eval($data, $schema->{dependencies}{$property},
221 +{ %$state, schema_path => jsonp($state->{schema_path}, 'dependencies', $property) })) {
222 next;
223 }
224
225 $valid = 0;
226 last if $state->{short_circuit};
227 }
228 }
229
230 return E($state, 'not all dependencies are satisfied') if not $valid;
231 return 1;
232}
233
234sub _traverse_keyword_prefixItems { shift->traverse_array_schemas(@_) }
235
236sub _eval_keyword_prefixItems { shift->_eval_keyword__items_array_schemas(@_) }
237
23839282µs
# spent 105ms (859µs+104) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_items which was called 98 times, avg 1.07ms/call: # 98 times (859µs+104ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 1.07ms/call
sub _traverse_keyword_items ($self, $schema, $state) {
2399885µs if (is_plain_arrayref($schema->{items})) {
240 return E($state, 'array form of "items" not supported in %s', $state->{spec_version})
241 if $state->{spec_version} !~ /^draft(?:7|2019-09)$/;
242
243 return $self->traverse_array_schemas($schema, $state);
244 }
245
24698639µs98101ms $self->traverse_subschema($schema, $state);
# spent 109ms making 98 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 1.12ms/call, recursion: max depth 1, sum of overlapping time 7.98ms
247}
248
24987902.70ms
# spent 23.6s (14.7ms+23.6) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_items which was called 1758 times, avg 13.4ms/call: # 1758 times (14.7ms+23.6s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 13.4ms/call
sub _eval_keyword_items ($self, $data, $schema, $state) {
250 return $self->_eval_keyword__items_array_schemas($data, $schema, $state)
25117581.26ms if is_plain_arrayref($schema->{items});
252
25317588.78ms175823.6s return $self->_eval_keyword__items_schema($data, $schema, $state);
# spent 26.1s making 1758 calls to JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword__items_schema, avg 14.8ms/call, recursion: max depth 4, sum of overlapping time 2.52s
254}
255
256sub _traverse_keyword_additionalItems { shift->traverse_subschema(@_) }
257
258sub _eval_keyword_additionalItems ($self, $data, $schema, $state) {
259 return 1 if not exists $state->{_last_items_index};
260 return $self->_eval_keyword__items_schema($data, $schema, $state);
261}
262
263# prefixItems (draft 2020-12), array-based items (all drafts)
264sub _eval_keyword__items_array_schemas ($self, $data, $schema, $state) {
265 return 1 if not is_type('array', $data);
266 return 1 if ($state->{_last_items_index}//-1) == $data->$#*;
267
268 my $valid = 1;
269
270 foreach my $idx (0 .. $data->$#*) {
271 last if $idx > $schema->{$state->{keyword}}->$#*;
272 $state->{_last_items_index} = $idx;
273
274 if (is_type('boolean', $schema->{$state->{keyword}}[$idx])) {
275 next if $schema->{$state->{keyword}}[$idx];
276 $valid = E({ %$state, data_path => $state->{data_path}.'/'.$idx,
277 _schema_path_suffix => $idx }, 'item not permitted');
278 }
279 elsif ($self->eval($data->[$idx], $schema->{$state->{keyword}}[$idx],
280 +{ %$state, data_path => $state->{data_path}.'/'.$idx,
281 schema_path => $state->{schema_path}.'/'.$state->{keyword}.'/'.$idx })) {
282 next;
283 }
284
285 $valid = 0;
286 last if $state->{short_circuit} and not exists $schema->{
287 $state->{keyword} eq 'prefixItems' ? 'items'
288 : $state->{keyword} eq 'items' ? 'additionalItems' : die
289 };
290 }
291
292 A($state, $state->{_last_items_index} == $data->$#* ? true : $state->{_last_items_index});
293 return E($state, 'not all items are valid') if not $valid;
294 return 1;
295}
296
297# schema-based items (all drafts), and additionalItems (up to and including draft2019-09)
29887902.20ms
# spent 23.6s (50.6ms+23.5) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword__items_schema which was called 1758 times, avg 13.4ms/call: # 1758 times (50.6ms+23.5s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_items at line 253, avg 13.4ms/call
sub _eval_keyword__items_schema ($self, $data, $schema, $state) {
29917586.79ms17587.00ms return 1 if not is_type('array', $data);
# spent 7.00ms making 1758 calls to JSON::Schema::Modern::Utilities::is_type, avg 4µs/call
300643800µs return 1 if ($state->{_last_items_index}//-1) == $data->$#*;
301
302643170µs my $valid = 1;
303
3046432.51ms foreach my $idx (($state->{_last_items_index}//-1)+1 .. $data->$#*) {
30516323.13ms163212.9ms if (is_type('boolean', $schema->{$state->{keyword}})) {
# spent 12.9ms making 1632 calls to JSON::Schema::Modern::Utilities::is_type, avg 8µs/call
306189381µs189184µs next if $schema->{$state->{keyword}};
# spent 184µs making 189 calls to JSON::PP::Boolean::__ANON__[JSON/PP/Boolean.pm:7], avg 974ns/call
307 $valid = E({ %$state, data_path => $state->{data_path}.'/'.$idx },
308 '%sitem not permitted',
309 exists $schema->{prefixItems} || $state->{keyword} eq 'additionalItems' ? 'additional ' : '');
310 }
311 else {
312144319.0ms14430s if ($self->eval($data->[$idx], $schema->{$state->{keyword}},
# spent 25.9s making 1443 calls to JSON::Schema::Modern::Vocabulary::eval, avg 17.9ms/call, recursion: max depth 33, sum of overlapping time 25.9s
313 +{ %$state, data_path => $state->{data_path}.'/'.$idx,
314 schema_path => $state->{schema_path}.'/'.$state->{keyword} })) {
31514436.91ms next;
316 }
317
318 $valid = 0;
319 }
320 last if $state->{short_circuit};
321 }
322
323643899µs $state->{_last_items_index} = $data->$#*;
324
3256431.13ms643176ms A($state, true);
# spent 176ms making 643 calls to JSON::Schema::Modern::Utilities::A, avg 274µs/call
326 return E($state, 'subschema is not valid against all %sitems',
327643231µs $state->{keyword} eq 'additionalItems' ? 'additional ' : '') if not $valid;
3286432.49ms return 1;
329}
330
331317µs3199µs
# spent 7.47ms (20µs+7.45) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_contains which was called 3 times, avg 2.49ms/call: # 3 times (20µs+7.45ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 2.49ms/call
sub _traverse_keyword_contains { shift->traverse_subschema(@_) }
# spent 7.45ms making 3 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 2.48ms/call, recursion: max depth 1, sum of overlapping time 7.25ms
332
333sub _eval_keyword_contains ($self, $data, $schema, $state) {
334 return 1 if not is_type('array', $data);
335
336 $state->{_num_contains} = 0;
337 my (@errors, @valid);
338 foreach my $idx (0 .. $data->$#*) {
339 if ($self->eval($data->[$idx], $schema->{contains},
340 +{ %$state, errors => \@errors,
341 data_path => $state->{data_path}.'/'.$idx,
342 schema_path => $state->{schema_path}.'/contains' })) {
343 ++$state->{_num_contains};
344 push @valid, $idx;
345
346 last if $state->{short_circuit}
347 and (not exists $schema->{maxContains} or $state->{_num_contains} > $schema->{maxContains})
348 and ($state->{_num_contains} >= ($schema->{minContains}//1));
349 }
350 }
351
352 # note: no items contained is only valid when minContains is explicitly 0
353 if (not $state->{_num_contains}
354 and (($schema->{minContains}//1) > 0 or $state->{spec_version} eq 'draft7')) {
355 push $state->{errors}->@*, @errors;
356 return E($state, 'subschema is not valid against any item');
357 }
358
359 return $state->{spec_version} =~ /^draft(?:7|2019-09)$/ ? 1
360 : A($state, @valid == @$data ? true : \@valid);
361}
362
3633871.86ms387299ms
# spent 343ms (2.26+341) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_properties which was called 387 times, avg 887µs/call: # 387 times (2.26ms+341ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 887µs/call
sub _traverse_keyword_properties { shift->traverse_object_schemas(@_) }
# spent 382ms making 387 calls to JSON::Schema::Modern::Vocabulary::traverse_object_schemas, avg 987µs/call, recursion: max depth 3, sum of overlapping time 83.2ms
364
36516246035.6ms
# spent 99.4s (844ms+98.5) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_properties which was called 32492 times, avg 3.06ms/call: # 32492 times (844ms+98.5s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 3.06ms/call
sub _eval_keyword_properties ($self, $data, $schema, $state) {
3663249297.6ms32492124ms return 1 if not is_type('object', $data);
# spent 124ms making 32492 calls to JSON::Schema::Modern::Utilities::is_type, avg 4µs/call
367
368286128.85ms my $valid = 1;
369286125.12ms my @properties;
37028612231ms2861251.7ms foreach my $property (sort keys $schema->{properties}->%*) {
# spent 51.7ms making 28612 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 2µs/call
37116696745.7ms next if not exists $data->{$property};
372110576.43ms push @properties, $property;
373
3741105717.3ms1105793.9ms if (is_type('boolean', $schema->{properties}{$property})) {
# spent 93.9ms making 11057 calls to JSON::Schema::Modern::Utilities::is_type, avg 8µs/call
375145459µs145266µs next if $schema->{properties}{$property};
# spent 266µs making 145 calls to JSON::PP::Boolean::__ANON__[JSON/PP/Boolean.pm:7], avg 2µs/call
376 $valid = E({ %$state, data_path => jsonp($state->{data_path}, $property),
377 _schema_path_suffix => $property }, 'property not permitted');
378 }
379 else {
38010912149ms3273699.6s if ($self->eval($data->{$property}, $schema->{properties}{$property},
# spent 469s making 10912 calls to JSON::Schema::Modern::Vocabulary::eval, avg 43.0ms/call, recursion: max depth 33, sum of overlapping time 370s # spent 173ms making 21824 calls to JSON::Schema::Modern::Utilities::jsonp, avg 8µs/call
381 +{ %$state, data_path => jsonp($state->{data_path}, $property),
382 schema_path => jsonp($state->{schema_path}, 'properties', $property) })) {
3831011351.9ms next;
384 }
385
386799482µs $valid = 0;
387 }
388799596µs last if $state->{short_circuit};
389 }
390
3912861251.4ms286128.03s A($state, \@properties);
# spent 8.03s making 28612 calls to JSON::Schema::Modern::Utilities::A, avg 281µs/call
3922861212.3ms799207ms return E($state, 'not all properties are valid') if not $valid;
# spent 207ms making 799 calls to JSON::Schema::Modern::Utilities::E, avg 259µs/call
3932781371.0ms return 1;
394}
395
3962413µs
# spent 1.96ms (151µs+1.81) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_patternProperties which was called 6 times, avg 327µs/call: # 6 times (151µs+1.81ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 327µs/call
sub _traverse_keyword_patternProperties ($self, $schema, $state) {
397613µs638µs return if not assert_keyword_type($state, $schema, 'object');
# spent 38µs making 6 calls to JSON::Schema::Modern::Utilities::assert_keyword_type, avg 6µs/call
398
39961µs my $valid = 1;
400624µs62µs foreach my $property (sort keys $schema->{patternProperties}->%*) {
# spent 2µs making 6 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 333ns/call
401641µs6285µs $valid = 0 if not assert_pattern({ %$state, _schema_path_suffix => $property }, $property);
# spent 285µs making 6 calls to JSON::Schema::Modern::Utilities::assert_pattern, avg 47µs/call
402626µs61.49ms $valid = 0 if not $self->traverse_property_schema($schema, $state, $property);
# spent 1.49ms making 6 calls to JSON::Schema::Modern::Vocabulary::traverse_property_schema, avg 248µs/call
403 }
404629µs return $valid;
405}
406
407168454.79ms
# spent 82.3s (138ms+82.1) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties which was called 3369 times, avg 24.4ms/call: # 3369 times (138ms+82.1s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 24.4ms/call
sub _eval_keyword_patternProperties ($self, $data, $schema, $state) {
40833697.02ms336912.8ms return 1 if not is_type('object', $data);
# spent 12.8ms making 3369 calls to JSON::Schema::Modern::Utilities::is_type, avg 4µs/call
409
41033691.11ms my $valid = 1;
4113369698µs my @properties;
412336914.7ms33691.52ms foreach my $property_pattern (sort keys $schema->{patternProperties}->%*) {
# spent 1.52ms making 3369 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 450ns/call
413336986.4ms2004136.1ms foreach my $property (sort grep m/$property_pattern/, keys %$data) {
# spent 30.7ms making 8336 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:regcomp, avg 4µs/call # spent 4.31ms making 8336 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:match, avg 517ns/call # spent 1.08ms making 3369 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 321ns/call
41417991.13ms push @properties, $property;
41517992.65ms179919.0ms if (is_type('boolean', $schema->{patternProperties}{$property_pattern})) {
# spent 19.0ms making 1799 calls to JSON::Schema::Modern::Utilities::is_type, avg 11µs/call
41610612.08ms10611.27ms next if $schema->{patternProperties}{$property_pattern};
# spent 1.27ms making 1061 calls to JSON::PP::Boolean::__ANON__[JSON/PP/Boolean.pm:7], avg 1µs/call
417 $valid = E({ %$state, data_path => jsonp($state->{data_path}, $property),
418 _schema_path_suffix => $property_pattern }, 'property not permitted');
419 }
420 else {
42173812.4ms221411.6ms if ($self->eval($data->{$property}, $schema->{patternProperties}{$property_pattern},
# spent 11.6ms making 1476 calls to JSON::Schema::Modern::Utilities::jsonp, avg 8µs/call # spent 119s making 738 calls to JSON::Schema::Modern::Vocabulary::eval, avg 162ms/call, recursion: max depth 4, sum of overlapping time 119s
422 +{ %$state, data_path => jsonp($state->{data_path}, $property),
423 schema_path => jsonp($state->{schema_path}, 'patternProperties', $property_pattern) })) {
4247385.99ms next;
425 }
426
427 $valid = 0;
428 }
429 last if $state->{short_circuit};
430 }
431 }
432
433336920.1ms6738970ms A($state, [ uniqstr @properties ]);
# spent 963ms making 3369 calls to JSON::Schema::Modern::Utilities::A, avg 286µs/call # spent 7.19ms making 3369 calls to List::Util::uniqstr, avg 2µs/call
43433691.23ms return E($state, 'not all properties are valid') if not $valid;
43533699.89ms return 1;
436}
437
438130772µs13031.6ms
# spent 33.4ms (849µs+32.6) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_additionalProperties which was called 130 times, avg 257µs/call: # 130 times (849µs+32.6ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 257µs/call
sub _traverse_keyword_additionalProperties { shift->traverse_subschema(@_) }
# spent 39.6ms making 130 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 305µs/call, recursion: max depth 2, sum of overlapping time 7.98ms
439
44048851.59ms
# spent 70.6s (66.3ms+70.6) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_additionalProperties which was called 977 times, avg 72.3ms/call: # 977 times (66.3ms+70.6s) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 72.3ms/call
sub _eval_keyword_additionalProperties ($self, $data, $schema, $state) {
4419771.79ms9773.12ms return 1 if not is_type('object', $data);
# spent 3.12ms making 977 calls to JSON::Schema::Modern::Utilities::is_type, avg 3µs/call
442
443977255µs my $valid = 1;
444977218µs my @properties;
4459777.25ms977646µs foreach my $property (sort keys %$data) {
# spent 646µs making 977 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 661ns/call
44618351.42ms next if exists $schema->{properties} and exists $schema->{properties}{$property};
447 next if exists $schema->{patternProperties}
4481835709µs and any { $property =~ /$_/ } keys $schema->{patternProperties}->%*;
449
45018351.60ms push @properties, $property;
45118353.09ms183516.5ms if (is_type('boolean', $schema->{additionalProperties})) {
# spent 16.5ms making 1835 calls to JSON::Schema::Modern::Utilities::is_type, avg 9µs/call
452 next if $schema->{additionalProperties};
453 $valid = E({ %$state, data_path => jsonp($state->{data_path}, $property) },
454 'additional property not permitted');
455 }
456 else {
457183527.1ms367015.4ms if ($self->eval($data->{$property}, $schema->{additionalProperties},
# spent 15.4ms making 1835 calls to JSON::Schema::Modern::Utilities::jsonp, avg 8µs/call # spent 115s making 1835 calls to JSON::Schema::Modern::Vocabulary::eval, avg 62.6ms/call, recursion: max depth 30, sum of overlapping time 115s
458 +{ %$state, data_path => jsonp($state->{data_path}, $property),
459 schema_path => $state->{schema_path}.'/additionalProperties' })) {
46018359.80ms next;
461 }
462
463 $valid = 0;
464 }
465 last if $state->{short_circuit};
466 }
467
4689771.84ms977253ms A($state, \@properties);
# spent 253ms making 977 calls to JSON::Schema::Modern::Utilities::A, avg 259µs/call
469977361µs return E($state, 'not all additional properties are valid') if not $valid;
4709773.48ms return 1;
471}
472
4731490µs145.01ms
# spent 5.18ms (78µs+5.10) within JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_propertyNames which was called 14 times, avg 370µs/call: # 14 times (78µs+5.10ms) by JSON::Schema::Modern::_traverse_subschema at line 483 of JSON/Schema/Modern.pm, avg 370µs/call
sub _traverse_keyword_propertyNames { shift->traverse_subschema(@_) }
# spent 5.10ms making 14 calls to JSON::Schema::Modern::Vocabulary::traverse_subschema, avg 364µs/call, recursion: max depth 1, sum of overlapping time 90µs
474
4753135972µs
# spent 449ms (21.4+427) within JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_propertyNames which was called 627 times, avg 716µs/call: # 627 times (21.4ms+427ms) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 716µs/call
sub _eval_keyword_propertyNames ($self, $data, $schema, $state) {
4766271.03ms6271.84ms return 1 if not is_type('object', $data);
# spent 1.84ms making 627 calls to JSON::Schema::Modern::Utilities::is_type, avg 3µs/call
477
478627227µs my $valid = 1;
4796273.30ms627235µs foreach my $property (sort keys %$data) {
# spent 235µs making 627 calls to JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort, avg 375ns/call
4807139.18ms14266.39ms if ($self->eval($property, $schema->{propertyNames},
# spent 6.39ms making 713 calls to JSON::Schema::Modern::Utilities::jsonp, avg 9µs/call # spent 419ms making 713 calls to JSON::Schema::Modern::Vocabulary::eval, avg 587µs/call, recursion: max depth 7, sum of overlapping time 419ms
481 +{ %$state, data_path => jsonp($state->{data_path}, $property),
482 schema_path => $state->{schema_path}.'/propertyNames' })) {
4837132.65ms next;
484 }
485
486 $valid = 0;
487 last if $state->{short_circuit};
488 }
489
490627222µs return E($state, 'not all property names are valid') if not $valid;
4916272.23ms return 1;
492}
493
49418µs1;
495
496140µs1383µs__END__
 
# spent 4.32ms within JSON::Schema::Modern::Vocabulary::Applicator::CORE:match which was called 8340 times, avg 518ns/call: # 8336 times (4.31ms+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties at line 413, avg 517ns/call # 4 times (4µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::keywords at line 44, avg 1µs/call
sub JSON::Schema::Modern::Vocabulary::Applicator::CORE:match; # opcode
# spent 6µs within JSON::Schema::Modern::Vocabulary::Applicator::CORE:qr which was called 4 times, avg 2µs/call: # 4 times (6µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::keywords at line 44, avg 2µs/call
sub JSON::Schema::Modern::Vocabulary::Applicator::CORE:qr; # opcode
# spent 30.7ms within JSON::Schema::Modern::Vocabulary::Applicator::CORE:regcomp which was called 8340 times, avg 4µs/call: # 8336 times (30.7ms+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties at line 413, avg 4µs/call # 4 times (6µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::keywords at line 44, avg 2µs/call
sub JSON::Schema::Modern::Vocabulary::Applicator::CORE:regcomp; # opcode
# spent 55.4ms within JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort which was called 37265 times, avg 1µs/call: # 28612 times (51.7ms+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_properties at line 370, avg 2µs/call # 3369 times (1.52ms+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties at line 412, avg 450ns/call # 3369 times (1.08ms+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_patternProperties at line 413, avg 321ns/call # 977 times (646µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_additionalProperties at line 445, avg 661ns/call # 627 times (235µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_propertyNames at line 479, avg 375ns/call # 305 times (167µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_eval_keyword_dependentSchemas at line 164, avg 548ns/call # 6 times (2µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::_traverse_keyword_patternProperties at line 400, avg 333ns/call
sub JSON::Schema::Modern::Vocabulary::Applicator::CORE:sort; # opcode
# spent 1µs within JSON::Schema::Modern::Vocabulary::Applicator::__ANON__ which was called: # once (1µs+0s) by JSON::Schema::Modern::Vocabulary::Applicator::BEGIN@21 at line 21
sub JSON::Schema::Modern::Vocabulary::Applicator::__ANON__; # xsub