Branch Coverage

lib/XS/Parse/Sublike.xs
Criterion Covered Total %
branch 221 296 74.6


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),