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