Branch Coverage

lib/XS/Parse/Sublike.xs
Criterion Covered Total %
branch 164 222 73.8


line true false branch
97 51 49 FOREACH_HOOKS_FORWARD {
51 49 FOREACH_HOOKS_FORWARD {
100 50 1 if(!(hooks->flags & XS_PARSE_SUBLIKE_FLAG_BODY_OPTIONAL))
102 3 48 if(hooks->flags & XS_PARSE_SUBLIKE_COMPAT_FLAG_DYNAMIC_ACTIONS)
106 48 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_NAME)) {
110 4 45 if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name)
1 3 if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name)
114 9 39 ctx.actions = ctx.name
118 50 48 FOREACH_HOOKS_FORWARD {
50 48 FOREACH_HOOKS_FORWARD {
119 13 37 if(hooks->pre_subparse)
129 45 3 if(!have_dynamic_actions) {
130 36 9 if(ctx.name)
137 9 39 if(ctx.actions & XS_PARSE_SUBLIKE_ACTION_CVf_ANON)
147 47 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) {
4 43 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) {
156 4 4 if(!lex_scan_attrval_into(attr, val))
159 0 4 if(lex_peek_unichar(0) == ':') {
166 4 4 FOREACH_HOOKS_FORWARD {
4 4 FOREACH_HOOKS_FORWARD {
167 1 3 if((hooks->flags & XS_PARSE_SUBLIKE_FLAG_FILTERATTRS) && (hooks->filter_attr))
1 0 if((hooks->flags & XS_PARSE_SUBLIKE_FLAG_FILTERATTRS) && (hooks->filter_attr))
171 1 3 if(handled) {
177 0 3 if(strEQ(SvPVX(attr), "lvalue")) {
182 1 2 if(SvPOK(val))
193 50 48 FOREACH_HOOKS_FORWARD {
50 48 FOREACH_HOOKS_FORWARD {
194 10 40 if(hooks->post_blockstart)
206 47 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) {
21 26 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) {
210 21 0 if(require_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) {
254 21 21 FOREACH_HOOKS_FORWARD {
21 21 FOREACH_HOOKS_FORWARD {
255 9 12 if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_NAMED_PARAMS)
257 4 17 if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_PARAM_ATTRIBUTES)
261 10 11 if(flags)
266 0 21 if(PL_parser->error_count) {
273 0 21 if(lex_peek_unichar(0) != ')')
280 44 4 if(lex_peek_unichar(0) == '{') {
285 3 1 else if(require_parts & XS_PARSE_SUBLIKE_PART_BODY)
287 0 1 else if(lex_peek_unichar(0) == ';') {
294 44 1 if(ctx.body && sigop) {
21 23 if(ctx.body && sigop) {
298 6 15 if (ctx.body->op_type == OP_STUB) {
306 0 45 if(PL_parser->error_count) {
320 0 0 while(PL_scopestack_ix > was_scopestack_ix)
324 0 0 if(ctx.name) {
337 47 45 FOREACH_HOOKS_REVERSE {
47 45 FOREACH_HOOKS_REVERSE {
338 12 35 if(hooks->pre_blockend)
348 44 1 if(ctx.body) {
351 41 3 if(!have_dynamic_actions) {
352 33 8 if(ctx.name)
364 36 8 if(ctx.name && action_set_cvname && action_install_symbol)
35 1 if(ctx.name && action_set_cvname && action_install_symbol)
367 0 44 if(!nameop && action_install_symbol)
372 1 43 if(!nameop && action_set_cvname) {
375 1 0 const char *name = SvPV_const(ctx.name, namelen);
386 1 0 CvNAME_HEK_set(ctx.cv,
395 47 45 FOREACH_HOOKS_FORWARD {
47 45 FOREACH_HOOKS_FORWARD {
396 11 36 if(hooks->post_newcv)
403 42 3 if(!have_dynamic_actions) {
404 8 34 if(!ctx.name)
410 35 10 if(!(ctx.actions & XS_PARSE_SUBLIKE_ACTION_REFGEN_ANONCODE)) {
420 42 3 if(!have_dynamic_actions) {
421 8 34 if(!ctx.name)
427 35 10 return (ctx.actions & XS_PARSE_SUBLIKE_ACTION_RET_EXPR) ? KEYWORD_PLUGIN_EXPR : KEYWORD_PLUGIN_STMT;
471 26 9 if(reg->hooks->permit_hintkey)
476 26 9 if(!reg->hooks->permit && !reg->hooks->permit_hintkey)
0 26 if(!reg->hooks->permit && !reg->hooks->permit_hintkey)
503 45197 26755 for(reg = registrations; reg; reg = reg->next) {
504 3767 41430 if(reg->kwlen != kwlen || !strEQ(reg->kw, kw))
3715 52 if(reg->kwlen != kwlen || !strEQ(reg->kw, kw))
507 35 17 if(reg->hooks->permit_hintkey &&
35 0 if(reg->hooks->permit_hintkey &&
508 1 34 (!hints || !hv_fetch(hints, reg->hooks->permit_hintkey, reg->permit_hintkey_len, 0)))
524 1 0 if(!kwsv || !SvCUR(kwsv))
0 1 if(!kwsv || !SvCUR(kwsv))
527 1 0 const char *kw = SvPV_nolen(kwsv);
534 0 1 if(kwlen != 3 || !strEQ(kw, "sub")) {
0 0 if(kwlen != 3 || !strEQ(kw, "sub")) {
0 0 if(kwlen != 3 || !strEQ(kw, "sub")) {
0 0 if(kwlen != 3 || !strEQ(kw, "sub")) {
0 0 if(kwlen != 3 || !strEQ(kw, "sub")) {
536 0 1 if(!reg)
537 0 0 croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf,
0 0 croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf,
549 1 0 if(reg) {
554 0 1 return parse(aTHX_ hd, 1 + !!reg, op_ptr);
564 0 6 if(funcs->ver < 5)
567 0 6 if(funcs->ver > XSPARSESUBLIKE_ABI_VERSION)
571 6 0 if(!name || !(name[0] >= 'A' && name[0] <= 'Z'))
0 6 if(!name || !(name[0] >= 'A' && name[0] <= 'Z'))
574 0 6 if(!funcs->permit_hintkey)
604 26755 48 if(!reg)
621 6 43 while(hooks->flags & XS_PARSE_SUBLIKE_FLAG_PREFIX) {
626 6 0 if(!kwsv || !SvCUR(kwsv))
0 6 if(!kwsv || !SvCUR(kwsv))
629 6 0 kw = SvPV_nolen(kwsv);
635 5 1 if(kwlen == 3 && strEQ(kw, "sub"))
5 0 if(kwlen == 3 && strEQ(kw, "sub"))
5 0 if(kwlen == 3 && strEQ(kw, "sub"))
5 0 if(kwlen == 3 && strEQ(kw, "sub"))
0 5 if(kwlen == 3 && strEQ(kw, "sub"))
639 0 1 if(!reg)
640 0 0 croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf,
0 0 croak("Expected a keyword to introduce a sub or sub-like construction, found " QUOTED_PVNf,
645 0 1 if(SvLEN(hdlsv) < (nhooks + 1) * sizeof(struct HooksAndData)) {
646 0 0 SvGROW(hdlsv, SvLEN(hdlsv) * 2);
0 0 SvGROW(hdlsv, SvLEN(hdlsv) * 2);