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