Branch Coverage

src/xs/next.cc
Criterion Covered Total %
branch 131 284 46.1


line true false branch
27 68 1 for (i = startingblock; i >= 0; --i) if (CxTYPE(cxstk+i) == CXt_SUB) return i;
62 6 for (i = startingblock; i >= 0; --i) if (CxTYPE(cxstk+i) == CXt_SUB) return i;
40 1 62 while (cxix < 0) {
41 1 0 if (top_si->si_type == PERLSI_MAIN) throw std::logic_error("next::method/next::can/maybe::next::method must be used in method context");
1 0 if (top_si->si_type == PERLSI_MAIN) throw std::logic_error("next::method/next::can/maybe::next::method must be used in method context");
47 62 0 if (PL_DBsub && GvCV(PL_DBsub)) {
0 62 if (PL_DBsub && GvCV(PL_DBsub)) {
48 0 0 if (ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) {
53 0 0 if (dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) {
0 0 if (dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) {
54 0 0 if (CxTYPE((PERL_CONTEXT*)(&ccstack[dbcxix])) != CXt_SUB) {
67 10 52 if (mg && (HV*)mg->mg_ptr == stash) {
10 0 if (mg && (HV*)mg->mg_ptr == stash) {
72 52 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
52 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
52 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
0 52 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
0 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
52 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
0 52 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
52 0 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
11 41 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
7 4 if (!stash || !HvNAME(stash) || (GvNAMELEN(gv) == 8 && !memcmp(GvNAME(gv), "__ANON__", 8))) { // ANON sub
83 55 0 STRLEN pkglen = HvNAMELEN(stash);
55 0 STRLEN pkglen = HvNAMELEN(stash);
0 55 STRLEN pkglen = HvNAMELEN(stash);
0 0 STRLEN pkglen = HvNAMELEN(stash);
55 0 STRLEN pkglen = HvNAMELEN(stash);
0 55 STRLEN pkglen = HvNAMELEN(stash);
86 55 0 memcpy(fqn, HvNAME(stash), pkglen);
55 0 memcpy(fqn, HvNAME(stash), pkglen);
0 55 memcpy(fqn, HvNAME(stash), pkglen);
0 0 memcpy(fqn, HvNAME(stash), pkglen);
55 0 memcpy(fqn, HvNAME(stash), pkglen);
0 55 memcpy(fqn, HvNAME(stash), pkglen);
91 55 0 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
55 0 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
0 55 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
0 0 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
55 0 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
0 55 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
0 55 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
33 22 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
0 33 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
55 0 return newSVpvn_share(fqn, (HvNAMEUTF8(stash) || GvNAMEUTF8(gv)) ? -(I32)fqnlen : (I32)fqnlen, 0);
95 2 0 std::string subname(GvNAME(context), GvNAMELEN(context));
96 2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 2 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 2 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 2 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 2 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
2 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
97 2 0 throw std::logic_error(std::string("No next::method '") + subname + "' found for " + stashname);
2 0 throw std::logic_error(std::string("No next::method '") + subname + "' found for " + stashname);
2 0 throw std::logic_error(std::string("No next::method '") + subname + "' found for " + stashname);
2 0 throw std::logic_error(std::string("No next::method '") + subname + "' found for " + stashname);
2 0 throw std::logic_error(std::string("No next::method '") + subname + "' found for " + stashname);
101 129 10 if (!fqnsv) { // cache FQN SV with shared COW hash of current sub in magic to perform hash lookup with precomputed hash
104 74 55 if (!mg || (HV*)mg->mg_ptr != stash) {
0 74 if (!mg || (HV*)mg->mg_ptr != stash) {
106 0 55 if (mg) sv_unmagicext((SV*)context, PERL_MAGIC_ext, &c3_marker);
111 0 55 if (!had_magic) SvRMAGICAL_off(context);
117 138 1 struct mro_meta* selfmeta = HvMROMETA(selfstash);
119 119 20 if (nmcache) { // Use the cached coderef if it exists
121 80 39 if (he) {
123 69 11 return val == &PL_sv_undef ? NULL : (CV*)val;
133 59 0 char* stashname = HvNAME(stash);
59 0 char* stashname = HvNAME(stash);
0 59 char* stashname = HvNAME(stash);
0 0 char* stashname = HvNAME(stash);
59 0 char* stashname = HvNAME(stash);
0 59 char* stashname = HvNAME(stash);
134 59 0 STRLEN stashname_len = HvNAMELEN(stash);
59 0 STRLEN stashname_len = HvNAMELEN(stash);
0 59 STRLEN stashname_len = HvNAMELEN(stash);
0 0 STRLEN stashname_len = HvNAMELEN(stash);
59 0 STRLEN stashname_len = HvNAMELEN(stash);
0 59 STRLEN stashname_len = HvNAMELEN(stash);
143 89 1 while (entries--) {
146 86 3 if (SvCUR(linear_sv) == stashname_len && !memcmp(SvPVX(linear_sv), stashname, stashname_len)) break;
58 28 if (SvCUR(linear_sv) == stashname_len && !memcmp(SvPVX(linear_sv), stashname, stashname_len)) break;
150 57 2 if (entries > 0) {
151 86 8 while (entries--) {
156 0 86 if (!curstash) {
157 0 0 if (ckWARN(WARN_SYNTAX)) Perl_warner(aTHX_
0 0 if (ckWARN(WARN_SYNTAX)) Perl_warner(aTHX_
0 0 if (ckWARN(WARN_SYNTAX)) Perl_warner(aTHX_
159 0 0 (void*)linear_sv, HEKfARG( HvNAME_HEK(selfstash) )
164 29 57 GV** gvp = (GV**)hv_fetch(curstash, subname, subname_utf8 ? -(I32)subname_len : (I32)subname_len, 0);
165 37 49 if (!gvp) continue;
170 0 49 if (SvTYPE(candidate) != SVt_PVGV)
171 0 0 gv_init_pvn(candidate, curstash, subname, subname_len, GV_ADDMULTI|(subname_utf8 ? SVf_UTF8 : 0));
177 49 0 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
49 0 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
49 0 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
49 0 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
191 15 0 GV* context = _find_sub(&fqn);
192 15 0 return _method(selfstash, context, fqn);
197 40 1 GV* context = _find_sub(&fqn);
198 40 0 CV* ret = _method(selfstash, context, fqn);
199 2 38 if (!ret) _throw_no_next_method(selfstash, context);
0 2 if (!ret) _throw_no_next_method(selfstash, context);
207 0 0 if (!ret) _throw_no_next_method(selfstash, context);
214 312 0 if (HvMROMETA(selfstash)->mro_which->length != 3) return _method(selfstash, context, NULL); // C3
84 228 if (HvMROMETA(selfstash)->mro_which->length != 3) return _method(selfstash, context, NULL); // C3
218 228 0 HV* cache = HvSUPERCACHE(stash);
219 224 4 if (cache) {
221 218 6 if (he) {
223 218 0 if (isGV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) return GvCV(gv);
218 0 if (isGV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) return GvCV(gv);
218 0 if (isGV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) return GvCV(gv);
218 0 if (isGV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) return GvCV(gv);
218 0 if (isGV(gv) && (!GvCVGEN(gv) || GvCVGEN(gv) == (PL_sub_generation + HvMROMETA(stash)->cache_gen))) return GvCV(gv);
227 9 1 return ret ? (isGV(ret) ? GvCV(ret) : (CV*)ret) : NULL;
9 0 return ret ? (isGV(ret) ? GvCV(ret) : (CV*)ret) : NULL;
234 0 132 if (!ret) {
235 0 0 std::string subname(GvNAME(context), GvNAMELEN(context));
236 0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
0 0 std::string stashname(HvNAME(selfstash), HvNAMELEN(selfstash));
237 0 0 throw std::logic_error(std::string("No super::") + subname + " found for " + stashname);
0 0 throw std::logic_error(std::string("No super::") + subname + " found for " + stashname);
0 0 throw std::logic_error(std::string("No super::") + subname + " found for " + stashname);
0 0 throw std::logic_error(std::string("No super::") + subname + " found for " + stashname);
0 0 throw std::logic_error(std::string("No super::") + subname + " found for " + stashname);