Branch Coverage

Legba.xs
Criterion Covered Total %
branch 268 438 61.1


line true false branch
182 6 11488 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) {
183 3 3 croak("Attempt to set %s slot",
187 5 11483 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
200 6 0 if (name_svp) {
205 1 5 if (existing && SvROK(*existing)) {
1 0 if (existing && SvROK(*existing)) {
222 3 0 if (name_svp) {
238 0 0 if (name_svp) {
242 0 0 if (existing && SvROK(*existing)) {
0 0 if (existing && SvROK(*existing)) {
245 0 0 for (i = len; i >= 0; i--) {
247 0 0 if (cb && SvRV(*cb) == SvRV(callback))
0 0 if (cb && SvRV(*cb) == SvRV(callback))
250 0 0 if (av_len(callbacks) < 0)
263 3 0 if (name_svp) {
285 169 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
286 169 0 argop = OpSIBLING(pushop);
288 81 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
81 169 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
290 88 81 if (argop == cvop) {
297 81 0 } else if (OpSIBLING(argop) == cvop) {
81 0 } else if (OpSIBLING(argop) == cvop) {
318 32 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
319 32 0 argop = OpSIBLING(pushop);
321 32 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
32 32 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
322 32 0 if (argop == cvop || OpSIBLING(argop) != cvop) return NULL;
32 0 if (argop == cvop || OpSIBLING(argop) != cvop) return NULL;
0 32 if (argop == cvop || OpSIBLING(argop) != cvop) return NULL;
323 29 3 if (argop->op_type == OP_CONST)
325 3 0 if (argop->op_type == OP_PADSV) {
327 3 0 if (PL_comppad_name && po < (PADOFFSET)(PadnamelistMAX(PL_comppad_name) + 1)) {
3 0 if (PL_comppad_name && po < (PADOFFSET)(PadnamelistMAX(PL_comppad_name) + 1)) {
329 3 0 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
0 3 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
0 0 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
331 0 0 if (svp && SvPOK(*svp)) return *svp;
0 0 if (svp && SvPOK(*svp)) return *svp;
343 29 3 if (namesv && SvPOK(namesv)) {
29 0 if (namesv && SvPOK(namesv)) {
347 14 15 if (svp) {
365 44 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
366 44 0 argop = OpSIBLING(pushop);
368 88 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
88 44 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
369 44 0 valop = OpSIBLING(argop);
370 44 0 if (argop == cvop || !valop || valop == cvop || OpSIBLING(valop) != cvop)
44 0 if (argop == cvop || !valop || valop == cvop || OpSIBLING(valop) != cvop)
44 0 if (argop == cvop || !valop || valop == cvop || OpSIBLING(valop) != cvop)
44 0 if (argop == cvop || !valop || valop == cvop || OpSIBLING(valop) != cvop)
0 44 if (argop == cvop || !valop || valop == cvop || OpSIBLING(valop) != cvop)
373 42 2 if (argop->op_type == OP_CONST) {
375 2 0 } else if (argop->op_type == OP_PADSV) {
377 2 0 if (PL_comppad_name && po < (PADOFFSET)(PadnamelistMAX(PL_comppad_name) + 1)) {
2 0 if (PL_comppad_name && po < (PADOFFSET)(PadnamelistMAX(PL_comppad_name) + 1)) {
379 2 0 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
0 2 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
0 0 if (pn && (PadnameFLAGS(pn) & PADNAMEf_CONST) && PL_comppad) {
381 0 0 if (svp && SvPOK(*svp)) namesv = *svp;
0 0 if (svp && SvPOK(*svp)) namesv = *svp;
385 42 2 if (namesv && SvPOK(namesv)) {
42 0 if (namesv && SvPOK(namesv)) {
389 15 27 if (svp) {
410 14 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
411 14 0 argop = OpSIBLING(pushop);
413 14 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
14 14 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
414 14 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
14 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
14 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
13 1 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
416 13 0 if (SvPOK(namesv)) {
420 6 7 if (svp) {
435 15 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
436 15 0 argop = OpSIBLING(pushop);
438 30 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
30 15 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
439 15 0 cbop = OpSIBLING(argop);
440 15 0 if (argop != cvop && cbop && cbop != cvop && OpSIBLING(cbop) == cvop
15 0 if (argop != cvop && cbop && cbop != cvop && OpSIBLING(cbop) == cvop
15 0 if (argop != cvop && cbop && cbop != cvop && OpSIBLING(cbop) == cvop
15 0 if (argop != cvop && cbop && cbop != cvop && OpSIBLING(cbop) == cvop
15 0 if (argop != cvop && cbop && cbop != cvop && OpSIBLING(cbop) == cvop
441 15 0 && argop->op_type == OP_CONST) {
443 15 0 if (SvPOK(namesv)) {
447 6 9 if (svp) {
468 5 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
469 5 0 argop = OpSIBLING(pushop);
471 6 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
6 5 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
472 5 0 if (argop != cvop && argop->op_type == OP_CONST) {
5 0 if (argop != cvop && argop->op_type == OP_CONST) {
474 5 0 if (SvPOK(namesv)) {
478 3 2 if (svp) {
480 3 0 cbop = OpSIBLING(argop);
481 3 0 if (cbop == cvop) {
487 0 0 } else if (OpSIBLING(cbop) == cvop) {
0 0 } else if (OpSIBLING(cbop) == cvop) {
509 8 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
510 8 0 argop = OpSIBLING(pushop);
512 9 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
9 8 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
513 8 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
8 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
7 1 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
7 0 if (argop != cvop && OpSIBLING(argop) == cvop && argop->op_type == OP_CONST) {
515 7 0 if (SvPOK(namesv)) {
519 3 4 if (svp) {
538 150 150 if (items) {
540 0 150 if (flags & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) {
541 0 0 croak("Attempt to set %s slot",
545 0 150 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
561 1023 0 if (!name_sv || !SvOK(*name_sv)) return;
0 1023 if (!name_sv || !SvOK(*name_sv)) return;
566 1023 0 if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
1023 0 if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
1023 0 if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
569 1031 1022 for (i = 0; i <= len; i++) {
571 1029 2 if (cb && SvROK(*cb)) {
1029 0 if (cb && SvROK(*cb)) {
574 0 1029 PUSHMARK(SP);
575 0 1029 mXPUSHs(newSVpvn(name, name_len));
576 0 1029 XPUSHs(new_val);
579 1028 0 FREETMPS; LEAVE;
591 10 482 if (needed >= g_slots_size) {
592 10 0 IV new_size = g_slots_size ? g_slots_size * 2 : 16;
594 0 10 while (new_size <= needed) new_size *= 2;
595 0 10 Renew(g_slots, new_size, SV*);
597 0 10 Renew(slot_flags, new_size, UV);
598 528 10 for (i = g_slots_size; i < new_size; i++) {
620 1136 24 return svp ? SvIV(*svp) : create_slot(aTHX_ name, len);
638 113 0 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
113 0 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
0 113 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
0 0 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
113 0 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
0 113 const char *pkg = HvNAME((HV*)CopSTASH(PL_curcop));
640 0 113 if (!pkg) pkg = "main";
641 225 113 for (i = 1; i < items; i++) {
645 12 213 IV idx = existing ? SvIV(*existing) : create_slot(aTHX_ name, name_len);
650 2 223 if (gvp && isGV(*gvp)) {
2 0 if (gvp && isGV(*gvp)) {
652 2 0 if (ecv && CvISXSUB(ecv) && CvXSUB(ecv) == xs_slot_accessor)
2 0 if (ecv && CvISXSUB(ecv) && CvXSUB(ecv) == xs_slot_accessor)
2 0 if (ecv && CvISXSUB(ecv) && CvXSUB(ecv) == xs_slot_accessor)
664 256 46 for (i = 0; i < items; i++) {
667 255 1 if (!hv_fetch(g_slot_index, name, name_len, 0))
681 0 20 if (items < 2) croak("Usage: Legba::watch($name, $callback)");
685 5 15 if (existing && SvROK(*existing)) {
5 0 if (existing && SvROK(*existing)) {
693 20 0 if (idx_sv) g_has_watchers[SvIV(*idx_sv)] = 1;
703 0 4 if (items < 1) croak("Usage: Legba::unwatch($name [, $callback])");
705 2 2 if (items == 1) {
711 2 0 if (existing && SvROK(*existing)) {
2 0 if (existing && SvROK(*existing)) {
714 5 2 for (i = len; i >= 0; i--) {
716 5 0 if (cb && SvRV(*cb) == SvRV(callback))
2 3 if (cb && SvRV(*cb) == SvRV(callback))
719 0 2 if (av_len(callbacks) < 0) clear_flag = 1;
722 2 2 if (clear_flag) {
724 2 0 if (idx_sv) g_has_watchers[SvIV(*idx_sv)] = 0;
732 0 18 if (items < 1) XSRETURN_UNDEF;
735 17 1 if (svp) { ST(0) = *svp; XSRETURN(1); }
742 0 6 if (items < 1) XSRETURN_UNDEF;
744 6 0 if (idx >= 0 && idx < g_slots_count) { ST(0) = g_slots[idx]; XSRETURN(1); }
5 1 if (idx >= 0 && idx < g_slots_count) { ST(0) = g_slots[idx]; XSRETURN(1); }
751 0 10008 if (items < 2) XSRETURN_EMPTY;
753 10008 0 if (idx >= 0 && idx < g_slots_count) {
10008 0 if (idx >= 0 && idx < g_slots_count) {
755 2 10006 if (flags & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
756 1 1 croak("Attempt to set %s slot",
759 1 10005 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
769 0 101 if (items < 1) XSRETURN_UNDEF;
772 99 2 if (svp) { ST(0) = g_slots[SvIV(*svp)]; XSRETURN(1); }
781 0 1131 if (items < 2) XSRETURN_EMPTY;
784 2 1129 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
785 1 1 croak("Attempt to set %s slot '%s'",
788 1017 112 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
799 48 2 while ((entry = hv_iternext(g_slot_index)))
800 0 48 XPUSHs(hv_iterkeysv(entry));
808 0 26 if (items != 1) croak("Usage: Legba::exists($name)");
810 19 7 if (hv_exists(g_slot_index, name, name_len)) XSRETURN_YES;
818 7 6 for (i = 0; i < items; i++) {
822 7 0 if (svp) {
824 2 5 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) continue;
836 3 2 for (i = 0; i < items; i++) {
838 3 0 if (idx >= 0 && idx < g_slots_count) {
3 0 if (idx >= 0 && idx < g_slots_count) {
843 3 0 if (name_sv && SvOK(*name_sv)) {
3 0 if (name_sv && SvOK(*name_sv)) {
858 0 5 if (items < 1) XSRETURN_EMPTY;
861 5 0 if (svp) {
863 2 3 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
864 1 1 croak("Attempt to delete %s slot '%s'",
878 45 3 while ((entry = hv_iternext(g_slot_index))) {
880 0 45 mXPUSHp(key, klen);
891 142 6 for (i = 0; i < g_slots_count; i++) {
892 141 1 if (!(slot_flags[i] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)))
904 0 0 if (items < 2) croak("Usage: Legba::_install_accessor($pkg, $slot_name)");
916 0 11 if (items < 1) XSRETURN_UNDEF;
935 0 15 if (items < 1) XSRETURN_UNDEF;
949 0 3 if (items < 1) XSRETURN_UNDEF;
965 0 7 if (items < 1) croak("Usage: Legba::_lock($name)");
968 1 6 if (!svp) croak("Cannot lock non-existent slot '%s'", n);
970 1 5 if (slot_flags[idx] & SLOT_FLAG_FROZEN) croak("Cannot lock frozen slot '%s'", n);
978 0 6 if (items < 1) croak("Usage: Legba::_unlock($name)");
981 0 6 if (!svp) croak("Cannot unlock non-existent slot '%s'", n);
983 1 5 if (slot_flags[idx] & SLOT_FLAG_FROZEN) croak("Cannot unlock frozen slot '%s'", n);
991 0 6 if (items < 1) croak("Usage: Legba::_freeze($name)");
994 1 5 if (!svp) croak("Cannot freeze non-existent slot '%s'", n);
1004 0 3 if (items < 1) XSRETURN_NO;
1007 1 2 if (!svp) XSRETURN_NO;
1008 1 1 if (slot_flags[SvIV(*svp)] & SLOT_FLAG_LOCKED) XSRETURN_YES;
1015 0 8 if (items < 1) XSRETURN_NO;
1018 1 7 if (!svp) XSRETURN_NO;
1019 7 0 if (slot_flags[SvIV(*svp)] & SLOT_FLAG_FROZEN) XSRETURN_YES;
1071 0 13 Newx(g_slots, g_slots_size, SV*);
1073 0 13 Newxz(slot_flags, g_slots_size, UV);
1076 208 13 for (i = 0; i < g_slots_size; i++)