Branch Coverage

XS.xs
Criterion Covered Total %
branch 82 262 31.3


line true false branch
10 157 211 if (SvROK(proto)) {
12 157 0 if (SvOBJECT(val)) return SvSTASH(val);
61 61 0 if ((op->op_spare & 1) || op->op_type != OP_ENTERSUB || !(op->op_flags & OPf_STACKED) || op->op_ppaddr != PL_ppaddr[OP_ENTERSUB]) return;
53 8 if ((op->op_spare & 1) || op->op_type != OP_ENTERSUB || !(op->op_flags & OPf_STACKED) || op->op_ppaddr != PL_ppaddr[OP_ENTERSUB]) return;
53 0 if ((op->op_spare & 1) || op->op_type != OP_ENTERSUB || !(op->op_flags & OPf_STACKED) || op->op_ppaddr != PL_ppaddr[OP_ENTERSUB]) return;
0 53 if ((op->op_spare & 1) || op->op_type != OP_ENTERSUB || !(op->op_flags & OPf_STACKED) || op->op_ppaddr != PL_ppaddr[OP_ENTERSUB]) return;
64 0 53 if (!curop) return; /* Such op can be created by call_sv(G_METHOD_NAMED) */
65 100 53 while (OpHAS_SIBLING(curop)) curop = OpSIBLING(curop);
100 0 while (OpHAS_SIBLING(curop)) curop = OpSIBLING(curop);
68 53 0 if (curop->op_next == op && curop->op_type == OP_METHOD_REDIR && curop->op_ppaddr == PL_ppaddr[OP_METHOD_REDIR]) {
46 7 if (curop->op_next == op && curop->op_type == OP_METHOD_REDIR && curop->op_ppaddr == PL_ppaddr[OP_METHOD_REDIR]) {
46 0 if (curop->op_next == op && curop->op_type == OP_METHOD_REDIR && curop->op_ppaddr == PL_ppaddr[OP_METHOD_REDIR]) {
70 38 8 if (!payload) return;
80 7 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_LIST)) return;
7 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_LIST)) return;
0 7 if (!OP_TYPE_IS_OR_WAS(curop, OP_LIST)) return;
0 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_LIST)) return;
82 0 7 if (!curop) return;
84 15 7 while (OpHAS_SIBLING(curop)) curop = OpSIBLING(curop);
15 0 while (OpHAS_SIBLING(curop)) curop = OpSIBLING(curop);
85 7 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_RV2CV)) return;
7 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_RV2CV)) return;
0 7 if (!OP_TYPE_IS_OR_WAS(curop, OP_RV2CV)) return;
0 0 if (!OP_TYPE_IS_OR_WAS(curop, OP_RV2CV)) return;
88 7 0 if (!curop || curop->op_type != OP_GV) return;
0 7 if (!curop || curop->op_type != OP_GV) return;
90 0 7 if (GvCV(gv) != check) return;
94 0 7 if (!payload) return;
105 0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
106 0 0 *PL_stack_sp = sub ? sv_2mortal(newRV((SV*)sub)) : &PL_sv_undef;
107 0 0 return PL_op->op_next->op_next; // skip ENTERSUB
114 0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ *PL_stack_sp)); });
115 0 0 *PL_stack_sp = sub ? sv_2mortal(newRV((SV*)sub)) : &PL_sv_undef;
116 0 0 return PL_op->op_next;
122 10 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
10 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
123 0 10 PP_METHOD_EXEC(sub);
0 0 PP_METHOD_EXEC(sub);
130 0 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
131 0 0 PP_SUB_EXEC(sub);
137 0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
138 0 0 PP_METHOD_MAYBE_EXEC(sub);
0 0 PP_METHOD_MAYBE_EXEC(sub);
0 0 PP_METHOD_MAYBE_EXEC(sub);
0 0 PP_METHOD_MAYBE_EXEC(sub);
0 0 PP_METHOD_MAYBE_EXEC(sub);
145 0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1])); });
146 0 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
152 62 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
62 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
0 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
153 0 62 PP_METHOD_EXEC(sub);
0 0 PP_METHOD_EXEC(sub);
160 62 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
62 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
0 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
161 0 0 PP_SUB_EXEC(sub);
167 140 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
140 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
0 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)cMETHOPx_rclass(PL_op)); });
168 69 71 PP_METHOD_MAYBE_EXEC(sub);
0 69 PP_METHOD_MAYBE_EXEC(sub);
71 0 PP_METHOD_MAYBE_EXEC(sub);
71 0 PP_METHOD_MAYBE_EXEC(sub);
0 0 PP_METHOD_MAYBE_EXEC(sub);
175 33 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
33 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
0 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ PL_stack_base[TOPMARK+1]), (GV*)TOPs); });
176 33 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
0 0 PP_SUB_MAYBE_EXEC(sub);
183 15 0 if (ent) return (GV*)HeVAL(ent);
186 0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
0 0 sv_catpvn(fqn, HvNAME(CopSTASH(PL_curcop)), HvNAMELEN(CopSTASH(PL_curcop)));
189 0 0 return gv_fetchpvn_flags(SvPVX(fqn), SvCUR(fqn), GV_ADD|(is_utf8 ? SVf_UTF8 : 0), SVt_PVCV);
194 0 15 if (items < 1) croak_xs_usage(cv, "proto, ...");
203 8 7 if (ix == 0) { // super
205 8 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ proto), context); });
8 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ proto), context); });
0 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ proto), context); });
0 0 _TRYNEXT({ sub = xs::super::method_strict(aTHX_ proto_stash(aTHX_ proto), context); });
208 7 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ proto), context); });
7 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ proto), context); });
0 0 _TRYNEXT({ sub = xs::super::method(aTHX_ proto_stash(aTHX_ proto), context); });
209 1 6 if (!sub) XSRETURN_EMPTY;
213 0 14 PUSHMARK(SP);
214 14 0 call_sv((SV*)sub, GIMME_V);
215 0 0 LEAVE;
221 2 1 SV* fqn = get_sv(ix == 0 ? "super::AUTOLOAD" : "super::maybe::AUTOLOAD", 0);
234 7 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
7 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
235 4 3 RETVAL = sub ? newRV((SV*)sub) : &PL_sv_undef;
242 31 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ proto)); });
28 3 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ proto)); });
3 0 _TRYNEXT({ sub = xs::next::method_strict(aTHX_ proto_stash(aTHX_ proto)); });
245 0 28 PUSHMARK(SP);
246 26 2 call_sv((SV*)sub, GIMME_V);
248 0 3 return;
258 8 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
8 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
0 0 _TRYNEXT({ sub = xs::next::method(aTHX_ proto_stash(aTHX_ proto)); });
259 4 4 if (!sub) XSRETURN_EMPTY;
262 0 4 PUSHMARK(SP);
263 4 0 call_sv((SV*)sub, GIMME_V);
265 0 0 return;