| line |
true |
false |
branch |
|
26
|
5 |
28 |
if (cross) { |
|
27
|
0 |
2 |
CloneMap map; |
|
29
|
5 |
0 |
_clone(aTHX_ ret, source, mapref, 0); |
|
31
|
26 |
2 |
else _clone(aTHX_ ret, source, mapref, 0); |
|
33
|
2 |
0 |
SvREFCNT_dec(ret); |
|
40
|
2 |
40104 |
if (depth > CLONE_MAX_DEPTH) throw 1; |
|
42
|
10034 |
30070 |
if (SvROK(source)) { // reference |
|
46
|
10033 |
1 |
if (unlikely(val_type == SVt_PVCV || val_type == SVt_PVIO)) { // CV and IO cannot be copied - just set reference to the same SV |
|
|
1 |
10032 |
if (unlikely(val_type == SVt_PVCV || val_type == SVt_PVIO)) { // CV and IO cannot be copied - just set reference to the same SV |
|
|
2 |
10032 |
if (unlikely(val_type == SVt_PVCV || val_type == SVt_PVIO)) { // CV and IO cannot be copied - just set reference to the same SV |
|
47
|
2 |
0 |
SvSetSV_nosteal(dest, source); |
|
|
2 |
0 |
SvSetSV_nosteal(dest, source); |
|
52
|
15 |
10017 |
if (map) { |
|
53
|
15 |
0 |
CloneMap::iterator it = map->find(id); |
|
54
|
4 |
11 |
if (it != map->end()) { |
|
55
|
4 |
0 |
SvSetSV_nosteal(dest, it->second); |
|
|
4 |
0 |
SvSetSV_nosteal(dest, it->second); |
|
64
|
5008 |
5020 |
if (is_object) { |
|
65
|
5008 |
0 |
auto mg = mg_findext(source_val, PERL_MAGIC_ext, &clone_marker); |
|
66
|
2 |
5006 |
if (mg) { |
|
69
|
5006 |
0 |
else if ((cloneGV = gv_fetchmeth(SvSTASH(source_val), HOOK_METHOD, HOOK_METHLEN, 0))) { |
|
|
3 |
5003 |
else if ((cloneGV = gv_fetchmeth(SvSTASH(source_val), HOOK_METHOD, HOOK_METHLEN, 0))) { |
|
71
|
3 |
0 |
sv_magicext(source_val, NULL, PERL_MAGIC_ext, &clone_marker, (const char*)map, 0); |
|
72
|
3 |
0 |
dSP; ENTER; SAVETMPS; |
|
|
3 |
0 |
dSP; ENTER; SAVETMPS; |
|
73
|
0 |
3 |
PUSHMARK(SP); |
|
|
0 |
0 |
PUSHMARK(SP); |
|
74
|
0 |
3 |
XPUSHs(source); |
|
|
0 |
0 |
XPUSHs(source); |
|
76
|
3 |
0 |
int count = call_sv((SV*)GvCV(cloneGV), G_SCALAR); |
|
79
|
3 |
3 |
while (count--) retval = POPs; |
|
80
|
3 |
0 |
if (retval) SvSetSV(dest, retval); |
|
|
3 |
0 |
if (retval) SvSetSV(dest, retval); |
|
|
3 |
0 |
if (retval) SvSetSV(dest, retval); |
|
82
|
3 |
0 |
FREETMPS; LEAVE; |
|
|
3 |
0 |
FREETMPS; LEAVE; |
|
|
3 |
0 |
FREETMPS; LEAVE; |
|
84
|
3 |
0 |
sv_unmagicext(source_val, PERL_MAGIC_ext, &clone_marker); |
|
85
|
1 |
2 |
if (map) (*map)[id] = dest; |
|
|
1 |
0 |
if (map) (*map)[id] = dest; |
|
90
|
10025 |
0 |
SV* refval = newSV(0); |
|
91
|
10025 |
0 |
sv_upgrade(dest, SVt_RV); |
|
95
|
5005 |
5020 |
if (is_object) sv_bless(dest, SvSTASH(source_val)); // cloning an object without any specific clone behavior |
|
|
5005 |
0 |
if (is_object) sv_bless(dest, SvSTASH(source_val)); // cloning an object without any specific clone behavior |
|
96
|
10 |
10015 |
if (map) (*map)[id] = dest; |
|
|
10 |
0 |
if (map) (*map)[id] = dest; |
|
97
|
5023 |
5002 |
_clone(aTHX_ refval, source_val, map, depth+1); |
|
113
|
20045 |
0 |
SvSetSV_nosteal(dest, source); |
|
128
|
15024 |
5009 |
for (SSize_t i = 0; i <= srcfill; ++i) { |
|
130
|
15024 |
0 |
if (srcval != NULL) { // if not empty slot |
|
142
|
0 |
5014 |
if (!hvarr) return; |
|
144
|
30114 |
16 |
for (STRLEN i = 0; i <= hvmax; ++i) { |
|
146
|
15024 |
25116 |
for (entry = hvarr[i]; entry; entry = HeNEXT(entry)) { |
|
162
|
11 |
0 |
}} |
|
|
11 |
0 |
}} |