Branch Coverage

src/xs/lib/merge.cc
Criterion Covered Total %
branch 102 146 69.8


line true false branch
13 18 6 if (SvROK(source)) {
15 6 12 if (type == SVt_PVHV && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
6 0 if (type == SVt_PVHV && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
5 1 if (type == SVt_PVHV && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
5 0 if (type == SVt_PVHV && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
19 12 1 else if (type == SVt_PVAV && (flags & MERGE_ARRAY_CM) && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
10 2 else if (type == SVt_PVAV && (flags & MERGE_ARRAY_CM) && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
10 0 else if (type == SVt_PVAV && (flags & MERGE_ARRAY_CM) && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
9 1 else if (type == SVt_PVAV && (flags & MERGE_ARRAY_CM) && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
9 0 else if (type == SVt_PVAV && (flags & MERGE_ARRAY_CM) && dest != NULL && SvROK(dest) && SvTYPE(SvRV(dest)) == type) {
24 2 2 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
2 0 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
2 0 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
0 2 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
26 3 1 if (flags & MERGE_COPY_SOURCE) { // deep copy reference value
28 3 0 SvSetSV_nosteal(dest, copy);
33 1 0 SvSetSV_nosteal(dest, source);
36 2 4 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
1 1 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
1 0 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
0 1 if ((flags & MERGE_LAZY) && SvOK(dest)) return;
37 5 0 SvSetSV_nosteal(dest, source);
44 1 18 if (!hvarr) return;
45 144 18 for (STRLEN i = 0; i <= hvmax; ++i) {
47 50 144 for (entry = hvarr[i]; entry; entry = HeNEXT(entry)) {
50 3 47 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(valueSV)) continue; // skip undefs
1 2 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(valueSV)) continue; // skip undefs
1 0 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(valueSV)) continue; // skip undefs
1 0 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(valueSV)) continue; // skip undefs
51 3 46 if ((flags & MERGE_DELETE_UNDEF) && !SvOK(valueSV)) {
2 1 if ((flags & MERGE_DELETE_UNDEF) && !SvOK(valueSV)) {
2 0 if ((flags & MERGE_DELETE_UNDEF) && !SvOK(valueSV)) {
2 0 if ((flags & MERGE_DELETE_UNDEF) && !SvOK(valueSV)) {
55 10 37 if (MERGE_CAN_LAZY(flags, valueSV)) {
6 4 if (MERGE_CAN_LAZY(flags, valueSV)) {
57 2 4 if (elemref != NULL && SvOK(*elemref)) continue;
0 2 if (elemref != NULL && SvOK(*elemref)) continue;
0 0 if (elemref != NULL && SvOK(*elemref)) continue;
0 0 if (elemref != NULL && SvOK(*elemref)) continue;
59 38 7 if (MERGE_CAN_ALIAS(flags, valueSV)) { // make aliases for simple values
32 6 if (MERGE_CAN_ALIAS(flags, valueSV)) { // make aliases for simple values
72 0 9 if (SvREADONLY(dest)) Perl_croak_no_modify();
76 2 7 if (flags & MERGE_ARRAY_CONCAT) {
80 0 2 if (flags & MERGE_COPY_SOURCE) {
81 0 0 while (srcfill-- >= 0) {
83 0 0 dstlist[savei++] = elem == NULL ? newSV(0) : clone(aTHX_ elem, false);
86 6 2 while (srcfill-- >= 0) {
88 0 6 if (elem == NULL) dstlist[savei++] = newSV(0);
100 19 7 for (int i = 0; i <= srcfill; ++i) {
102 0 19 if (elem == NULL) continue; // skip empty slots
103 2 17 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(elem)) continue; // skip undefs
1 1 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(elem)) continue; // skip undefs
1 0 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(elem)) continue; // skip undefs
1 0 if ((flags & MERGE_SKIP_UNDEF) && !SvOK(elem)) continue; // skip undefs
104 6 12 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
4 2 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
4 0 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
0 4 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
0 0 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
0 0 if (MERGE_CAN_LAZY(flags, elem) && dstlist[i] && SvOK(dstlist[i])) continue;
105 13 1 if (MERGE_CAN_ALIAS(flags, elem)) { // hardcode for speed - make aliases for simple values
11 2 if (MERGE_CAN_ALIAS(flags, elem)) { // hardcode for speed - make aliases for simple values
107 11 0 if (AvREAL(dest)) SvREFCNT_dec(dstlist[i]);
111 0 3 if (!dstlist[i]) dstlist[i] = newSV(0);
114 0 7 if (AvFILLp(dest) < srcfill) AvFILLp(dest) = srcfill;
119 2 15 if (!dest) dest = newHV();
120 3 12 else if (flags & MERGE_COPY_DEST) dest = (HV*)clone(aTHX_ (SV*)dest, false);
121 14 3 if (source) _hash_merge(aTHX_ dest, source, flags);
126 1 7 if ((flags & MERGE_COPY) && dest) dest = clone(aTHX_ dest, false);
1 0 if ((flags & MERGE_COPY) && dest) dest = clone(aTHX_ dest, false);
127 0 8 if (!source) source = &PL_sv_undef;
132 11 0 }}
11 0 }}