| line |
true |
false |
branch |
|
91
|
100 |
90 |
FOREACH_HOOKS_FORWARD { |
|
|
100 |
90 |
FOREACH_HOOKS_FORWARD { |
|
94
|
83 |
17 |
if(!(hooks->flags & XS_PARSE_SUBLIKE_FLAG_BODY_OPTIONAL)) |
|
96
|
5 |
95 |
if(hooks->flags & XS_PARSE_SUBLIKE_COMPAT_FLAG_DYNAMIC_ACTIONS) |
|
100
|
89 |
1 |
if(!(skip_parts & XS_PARSE_SUBLIKE_PART_NAME)) { |
|
104
|
4 |
86 |
if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name) |
|
|
1 |
3 |
if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name) |
|
107
|
9 |
80 |
if(ctx.name && strstr(SvPV_nolen(ctx.name), "::")) { |
|
|
78 |
2 |
if(ctx.name && strstr(SvPV_nolen(ctx.name), "::")) { |
|
108
|
2 |
1 |
FOREACH_HOOKS_FORWARD { |
|
|
2 |
1 |
FOREACH_HOOKS_FORWARD { |
|
109
|
1 |
1 |
if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_ALLOW_PKGNAME) |
|
119
|
9 |
79 |
: /* anon */ XS_PARSE_SUBLIKE_ACTION_CVf_ANON|XS_PARSE_SUBLIKE_ACTION_REFGEN_ANONCODE|XS_PARSE_SUBLIKE_ACTION_RET_EXPR; |
|
121
|
98 |
88 |
FOREACH_HOOKS_FORWARD { |
|
|
98 |
88 |
FOREACH_HOOKS_FORWARD { |
|
122
|
23 |
75 |
if(hooks->pre_subparse) |
|
132
|
83 |
5 |
if(!have_dynamic_actions) { |
|
133
|
74 |
9 |
if(ctx.name) |
|
140
|
9 |
79 |
if(ctx.actions & XS_PARSE_SUBLIKE_ACTION_CVf_ANON) |
|
143
|
2 |
86 |
if(ctx.actions & XS_PARSE_SUBLIKE_ACTION_CVf_IsMETHOD) |
|
152
|
79 |
9 |
if(ctx.name && (ctx.actions & XS_PARSE_SUBLIKE_ACTION_INSTALL_LEXICAL)) { |
|
|
2 |
77 |
if(ctx.name && (ctx.actions & XS_PARSE_SUBLIKE_ACTION_INSTALL_LEXICAL)) { |
|
162
|
2 |
86 |
if(ctx.actions & XS_PARSE_SUBLIKE_ACTION_INSTALL_LEXICAL) |
|
167
|
87 |
1 |
if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) { |
|
|
5 |
82 |
if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) { |
|
176
|
5 |
5 |
if(!lex_scan_attrval_into(attr, val)) |
|
179
|
0 |
5 |
if(lex_peek_unichar(0) == ':') { |
|
186
|
5 |
5 |
FOREACH_HOOKS_FORWARD { |
|
|
5 |
5 |
FOREACH_HOOKS_FORWARD { |
|
187
|
1 |
4 |
if(hooks->filter_attr) |
|
191
|
1 |
4 |
if(handled) { |
|
197
|
0 |
4 |
if(strEQ(SvPVX(attr), "lvalue")) { |
|
202
|
2 |
2 |
if(SvPOK(val)) |
|
213
|
98 |
88 |
FOREACH_HOOKS_FORWARD { |
|
|
98 |
88 |
FOREACH_HOOKS_FORWARD { |
|
214
|
18 |
80 |
if(hooks->post_blockstart) |
|
226
|
1 |
87 |
if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) { |
|
|
30 |
57 |
if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) { |
|
230
|
2 |
55 |
if(require_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) { |
|
247
|
63 |
57 |
FOREACH_HOOKS_FORWARD { |
|
|
63 |
57 |
FOREACH_HOOKS_FORWARD { |
|
248
|
34 |
29 |
if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_NAMED_PARAMS) |
|
250
|
17 |
46 |
if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_PARAM_ATTRIBUTES) |
|
252
|
18 |
45 |
if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_REFALIAS) |
|
254
|
0 |
63 |
if(hooks->ver >= 7 && (hooks->start_signature || hooks->finish_signature)) |
|
|
57 |
6 |
if(hooks->ver >= 7 && (hooks->start_signature || hooks->finish_signature)) |
|
|
57 |
0 |
if(hooks->ver >= 7 && (hooks->start_signature || hooks->finish_signature)) |
|
258
|
44 |
13 |
if(flags || have_sighooks) |
|
266
|
3 |
10 |
if(lex_peek_unichar(0) == ')') { |
|
293
|
0 |
13 |
if(PL_parser->error_count) { |
|
300
|
0 |
56 |
if(lex_peek_unichar(0) != ')') |
|
307
|
83 |
4 |
if(lex_peek_unichar(0) == '{') { |
|
310
|
83 |
0 |
SvREFCNT_inc(PL_compcv); |
|
312
|
3 |
1 |
else if(require_parts & XS_PARSE_SUBLIKE_PART_BODY) |
|
314
|
0 |
1 |
else if(lex_peek_unichar(0) == ';') { |
|
321
|
83 |
1 |
if(ctx.body && sigop) { |
|
|
56 |
27 |
if(ctx.body && sigop) { |
|
325
|
13 |
43 |
if (ctx.body->op_type == OP_STUB) { |
|
333
|
0 |
84 |
if(PL_parser->error_count) { |
|
347
|
0 |
0 |
while(PL_scopestack_ix > was_scopestack_ix) |
|
351
|
0 |
0 |
if(ctx.name) { |
|
364
|
94 |
84 |
FOREACH_HOOKS_REVERSE { |
|
|
94 |
84 |
FOREACH_HOOKS_REVERSE { |
|
365
|
20 |
74 |
if(hooks->pre_blockend) |
|
375
|
83 |
1 |
if(ctx.body) { |
|
378
|
78 |
5 |
if(!have_dynamic_actions) { |
|
379
|
70 |
8 |
if(ctx.name) { |
|
381
|
68 |
2 |
if(!(ctx.actions & XS_PARSE_SUBLIKE_ACTION_INSTALL_LEXICAL)) |
|
394
|
0 |
83 |
if(action_install_symbol && action_install_lexical) |
|
398
|
75 |
8 |
if(ctx.name && action_set_cvname && action_install_symbol) |
|
|
72 |
3 |
if(ctx.name && action_set_cvname && action_install_symbol) |
|
401
|
0 |
83 |
if(!nameop && action_install_symbol) |
|
404
|
2 |
81 |
if(action_install_lexical) { |
|
419
|
1 |
82 |
if(!nameop && action_set_cvname) { |
|
424
|
1 |
0 |
PERL_HASH(hash, name, namelen); |
|
433
|
0 |
1 |
CvNAME_HEK_set(ctx.cv, |
|
|
0 |
0 |
CvNAME_HEK_set(ctx.cv, |
|
|
1 |
0 |
CvNAME_HEK_set(ctx.cv, |
|
442
|
94 |
84 |
FOREACH_HOOKS_FORWARD { |
|
|
94 |
84 |
FOREACH_HOOKS_FORWARD { |
|
443
|
19 |
75 |
if(hooks->post_newcv) |
|
450
|
79 |
5 |
if(!have_dynamic_actions) { |
|
451
|
8 |
71 |
if(!ctx.name) |
|
457
|
74 |
10 |
if(!(ctx.actions & XS_PARSE_SUBLIKE_ACTION_REFGEN_ANONCODE)) { |
|
467
|
79 |
5 |
if(!have_dynamic_actions) { |
|
468
|
8 |
71 |
if(!ctx.name) |
|
474
|
74 |
10 |
return (ctx.actions & XS_PARSE_SUBLIKE_ACTION_RET_EXPR) ? KEYWORD_PLUGIN_EXPR : KEYWORD_PLUGIN_STMT; |
|
504
|
0 |
157 |
if(ver < 4) |
|
507
|
0 |
157 |
if(ver > XSPARSESUBLIKE_ABI_VERSION) |
|
519
|
119 |
38 |
if(reg->hooks->permit_hintkey) |
|
524
|
118 |
39 |
if(!reg->hooks->permit && !reg->hooks->permit_hintkey) |
|
|
0 |
118 |
if(!reg->hooks->permit && !reg->hooks->permit_hintkey) |
|
538
|
0 |
73 |
if(!ver) |
|
553
|
738546 |
130000 |
for(reg = registrations; reg; reg = reg->next) { |
|
554
|
92460 |
646086 |
if(reg->kwlen != kwlen || !strnEQ(reg->kw, kw, kwlen)) |
|
|
79995 |
12465 |
if(reg->kwlen != kwlen || !strnEQ(reg->kw, kw, kwlen)) |
|
557
|
12442 |
23 |
if(reg->hooks->permit_hintkey && |
|
|
12442 |
0 |
if(reg->hooks->permit_hintkey && |
|
558
|
12369 |
73 |
(!hints || !hv_fetch(hints, reg->hooks->permit_hintkey, reg->permit_hintkey_len, 0))) |
|
574
|
1 |
0 |
if(!kwsv || !SvCUR(kwsv)) |
|
|
0 |
1 |
if(!kwsv || !SvCUR(kwsv)) |
|
584
|
0 |
1 |
if(kwlen != 3 || !strEQ(kw, "sub")) { |
|
|
0 |
0 |
if(kwlen != 3 || !strEQ(kw, "sub")) { |
|
586
|
0 |
1 |
if(!reg) |
|
587
|
0 |
0 |
croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf, |
|
598
|
1 |
0 |
if(reg) { |
|
608
|
0 |
9 |
if(funcs->ver < 5) |
|
611
|
0 |
9 |
if(funcs->ver > XSPARSESUBLIKE_ABI_VERSION) |
|
615
|
9 |
0 |
if(!name || !(name[0] >= 'A' && name[0] <= 'Z')) |
|
|
0 |
9 |
if(!name || !(name[0] >= 'A' && name[0] <= 'Z')) |
|
618
|
0 |
9 |
if(!funcs->permit_hintkey) |
|
627
|
2 |
0 |
return FEATURE_CLASS_IS_ENABLED; |
|
|
2 |
0 |
return FEATURE_CLASS_IS_ENABLED; |
|
|
0 |
2 |
return FEATURE_CLASS_IS_ENABLED; |
|
696
|
51487 |
102263 |
if(kwlen == 2 && strEQ(kw, "my")) { |
|
|
23670 |
27817 |
if(kwlen == 2 && strEQ(kw, "my")) { |
|
700
|
23670 |
0 |
if(!isIDFIRST_uni(c)) |
|
|
23670 |
0 |
if(!isIDFIRST_uni(c)) |
|
|
23667 |
3 |
if(!isIDFIRST_uni(c)) |
|
|
0 |
0 |
if(!isIDFIRST_uni(c)) |
|
706
|
12 |
0 |
while((c = lex_peek_unichar(0)) && isALNUM_uni(c)) |
|
|
12 |
0 |
while((c = lex_peek_unichar(0)) && isALNUM_uni(c)) |
|
|
12 |
0 |
while((c = lex_peek_unichar(0)) && isALNUM_uni(c)) |
|
|
9 |
3 |
while((c = lex_peek_unichar(0)) && isALNUM_uni(c)) |
|
|
0 |
0 |
while((c = lex_peek_unichar(0)) && isALNUM_uni(c)) |
|
717
|
129994 |
89 |
if(!reg) { |
|
719
|
129993 |
1 |
if(PL_parser->bufptr > was_parser_bufptr) |
|
737
|
2 |
87 |
if(is_lexical_sub) { |
|
750
|
11 |
83 |
while(hooks->flags & XS_PARSE_SUBLIKE_FLAG_PREFIX) { |
|
755
|
11 |
0 |
if(!kwsv || !SvCUR(kwsv)) |
|
|
0 |
11 |
if(!kwsv || !SvCUR(kwsv)) |
|
766
|
6 |
5 |
if(!reg && kwlen == 3 && strEQ(kw, "sub")) |
|
|
0 |
6 |
if(!reg && kwlen == 3 && strEQ(kw, "sub")) |
|
768
|
0 |
5 |
if(!reg) |
|
769
|
0 |
0 |
croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf, |
|
774
|
0 |
5 |
if(SvLEN(hdlsv) < (nhooks + 1) * sizeof(struct HooksAndData)) { |
|
775
|
0 |
0 |
SvGROW(hdlsv, SvLEN(hdlsv) * 2); |
|
|
0 |
0 |
SvGROW(hdlsv, SvLEN(hdlsv) * 2); |
|
785
|
8 |
81 |
if(kwlen != 3 || !strEQ(kw, "sub")) { |
|
|
8 |
0 |
if(kwlen != 3 || !strEQ(kw, "sub")) { |
|
788
|
0 |
81 |
if(hints && hv_exists_ent(hints, keysv, 0)) { |
|
|
79 |
2 |
if(hints && hv_exists_ent(hints, keysv, 0)) { |
|
789
|
0 |
2 |
if(SvLEN(hdlsv) < (nhooks + 1) * sizeof(struct HooksAndData)) { |
|
790
|
0 |
0 |
SvGROW(hdlsv, SvLEN(hdlsv) * 2); |
|
|
0 |
0 |
SvGROW(hdlsv, SvLEN(hdlsv) * 2); |
|
857
|
0 |
0 |
&STRUCT_XSPARSESUBLIKEHOOKS_FROM_v4(hooks_v4), |
|
866
|
0 |
0 |
*hooks = STRUCT_XSPARSESUBLIKEHOOKS_FROM_v4(hooks_v4); |
|
874
|
0 |
0 |
&STRUCT_XSPARSESUBLIKEHOOKS_FROM_v4(hooksA_v4), |