Branch Coverage

lib/XS/Parse/Sublike.xs
Criterion Covered Total %
branch 164 214 76.6


line true false branch
94 49 47 FOREACH_HOOKS_FORWARD {
49 47 FOREACH_HOOKS_FORWARD {
97 48 1 if(!(hooks->flags & XS_PARSE_SUBLIKE_FLAG_BODY_OPTIONAL))
99 3 46 if(hooks->flags & XS_PARSE_SUBLIKE_COMPAT_FLAG_DYNAMIC_ACTIONS)
103 46 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_NAME)) {
107 4 43 if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name)
1 3 if((require_parts & XS_PARSE_SUBLIKE_PART_NAME) && !ctx.name)
111 9 37 ctx.actions = ctx.name
115 48 46 FOREACH_HOOKS_FORWARD {
48 46 FOREACH_HOOKS_FORWARD {
116 13 35 if(hooks->pre_subparse)
126 43 3 if(!have_dynamic_actions) {
127 34 9 if(ctx.name)
134 9 37 if(ctx.actions & XS_PARSE_SUBLIKE_ACTION_CVf_ANON)
144 45 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) {
4 41 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_ATTRS) && (lex_peek_unichar(0) == ':')) {
153 4 4 if(!lex_scan_attrval_into(attr, val))
156 0 4 if(lex_peek_unichar(0) == ':') {
163 4 4 FOREACH_HOOKS_FORWARD {
4 4 FOREACH_HOOKS_FORWARD {
164 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))
168 1 3 if(handled) {
174 0 3 if(strEQ(SvPVX(attr), "lvalue")) {
179 1 2 if(SvPOK(val))
190 48 46 FOREACH_HOOKS_FORWARD {
48 46 FOREACH_HOOKS_FORWARD {
191 10 38 if(hooks->post_blockstart)
203 45 1 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) {
19 26 if(!(skip_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) && (lex_peek_unichar(0) == '(')) {
207 19 0 if(require_parts & XS_PARSE_SUBLIKE_PART_SIGNATURE) {
251 19 19 FOREACH_HOOKS_FORWARD {
19 19 FOREACH_HOOKS_FORWARD {
252 7 12 if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_NAMED_PARAMS)
254 4 15 if(hooks->flags & XS_PARSE_SUBLIKE_FLAG_SIGNATURE_PARAM_ATTRIBUTES)
258 8 11 if(flags)
263 0 19 if(PL_parser->error_count) {
270 0 19 if(lex_peek_unichar(0) != ')')
277 42 4 if(lex_peek_unichar(0) == '{') {
282 3 1 else if(require_parts & XS_PARSE_SUBLIKE_PART_BODY)
284 0 1 else if(lex_peek_unichar(0) == ';') {
291 42 1 if(ctx.body && sigop) {
19 23 if(ctx.body && sigop) {
295 5 14 if (ctx.body->op_type == OP_STUB) {
303 0 43 if(PL_parser->error_count) {
317 0 0 while(PL_scopestack_ix > was_scopestack_ix)
321 0 0 if(ctx.name) {
334 45 43 FOREACH_HOOKS_REVERSE {
45 43 FOREACH_HOOKS_REVERSE {
335 12 33 if(hooks->pre_blockend)
345 42 1 if(ctx.body) {
348 39 3 if(!have_dynamic_actions) {
349 31 8 if(ctx.name)
361 34 8 if(ctx.name && action_set_cvname && action_install_symbol)
33 1 if(ctx.name && action_set_cvname && action_install_symbol)
364 0 42 if(!nameop && action_install_symbol)
369 1 41 if(!nameop && action_set_cvname) {
372 1 0 const char *name = SvPV_const(ctx.name, namelen);
383 1 0 CvNAME_HEK_set(ctx.cv,
392 45 43 FOREACH_HOOKS_FORWARD {
45 43 FOREACH_HOOKS_FORWARD {
393 11 34 if(hooks->post_newcv)
400 40 3 if(!have_dynamic_actions) {
401 8 32 if(!ctx.name)
407 33 10 if(!(ctx.actions & XS_PARSE_SUBLIKE_ACTION_REFGEN_ANONCODE)) {
417 40 3 if(!have_dynamic_actions) {
418 8 32 if(!ctx.name)
424 33 10 return (ctx.actions & XS_PARSE_SUBLIKE_ACTION_RET_EXPR) ? KEYWORD_PLUGIN_EXPR : KEYWORD_PLUGIN_STMT;
468 26 9 if(reg->hooks->permit_hintkey)
473 26 9 if(!reg->hooks->permit && !reg->hooks->permit_hintkey)
0 26 if(!reg->hooks->permit && !reg->hooks->permit_hintkey)
500 45145 26739 for(reg = registrations; reg; reg = reg->next) {
501 3759 41386 if(reg->kwlen != kwlen || !strEQ(reg->kw, kw))
3709 50 if(reg->kwlen != kwlen || !strEQ(reg->kw, kw))
504 33 17 if(reg->hooks->permit_hintkey &&
33 0 if(reg->hooks->permit_hintkey &&
505 1 32 (!hints || !hv_fetch(hints, reg->hooks->permit_hintkey, reg->permit_hintkey_len, 0)))
521 1 0 if(!kwsv || !SvCUR(kwsv))
0 1 if(!kwsv || !SvCUR(kwsv))
524 1 0 const char *kw = SvPV_nolen(kwsv);
531 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")) {
533 0 1 if(!reg)
546 1 0 if(reg) {
551 0 1 return parse(aTHX_ hd, 1 + !!reg, op_ptr);
561 0 6 if(funcs->ver < 5)
564 0 6 if(funcs->ver > XSPARSESUBLIKE_ABI_VERSION)
568 6 0 if(!name || !(name[0] >= 'A' && name[0] <= 'Z'))
0 6 if(!name || !(name[0] >= 'A' && name[0] <= 'Z'))
571 0 6 if(!funcs->permit_hintkey)
601 26739 46 if(!reg)
618 6 41 while(hooks->flags & XS_PARSE_SUBLIKE_FLAG_PREFIX) {
623 6 0 if(!kwsv || !SvCUR(kwsv))
0 6 if(!kwsv || !SvCUR(kwsv))
626 6 0 kw = SvPV_nolen(kwsv);
632 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"))
636 0 1 if(!reg)
642 0 1 if(SvLEN(hdlsv) < (nhooks + 1) * sizeof(struct HooksAndData)) {
643 0 0 SvGROW(hdlsv, SvLEN(hdlsv) * 2);
0 0 SvGROW(hdlsv, SvLEN(hdlsv) * 2);