Branch Coverage

Legba.xs
Criterion Covered Total %
branch 268 438 61.1


line true false branch
177 6 11488 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) {
178 3 3 croak("Attempt to set %s slot",
182 5 11483 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
195 6 0 if (name_svp) {
200 1 5 if (existing && SvROK(*existing)) {
1 0 if (existing && SvROK(*existing)) {
217 3 0 if (name_svp) {
233 0 0 if (name_svp) {
237 0 0 if (existing && SvROK(*existing)) {
0 0 if (existing && SvROK(*existing)) {
240 0 0 for (i = len; i >= 0; i--) {
242 0 0 if (cb && SvRV(*cb) == SvRV(callback))
0 0 if (cb && SvRV(*cb) == SvRV(callback))
245 0 0 if (av_len(callbacks) < 0)
258 3 0 if (name_svp) {
280 169 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
281 169 0 argop = OpSIBLING(pushop);
283 81 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
81 169 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
285 88 81 if (argop == cvop) {
292 81 0 } else if (OpSIBLING(argop) == cvop) {
81 0 } else if (OpSIBLING(argop) == cvop) {
312 32 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
313 32 0 argop = OpSIBLING(pushop);
315 32 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
32 32 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
316 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;
317 29 3 if (argop->op_type == OP_CONST)
319 3 0 if (argop->op_type == OP_PADSV) {
321 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)) {
323 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) {
325 0 0 if (svp && SvPOK(*svp)) return *svp;
0 0 if (svp && SvPOK(*svp)) return *svp;
337 29 3 if (namesv && SvPOK(namesv)) {
29 0 if (namesv && SvPOK(namesv)) {
341 14 15 if (svp) {
359 44 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
360 44 0 argop = OpSIBLING(pushop);
362 88 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
88 44 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
363 44 0 valop = OpSIBLING(argop);
364 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)
367 42 2 if (argop->op_type == OP_CONST) {
369 2 0 } else if (argop->op_type == OP_PADSV) {
371 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)) {
373 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) {
375 0 0 if (svp && SvPOK(*svp)) namesv = *svp;
0 0 if (svp && SvPOK(*svp)) namesv = *svp;
379 42 2 if (namesv && SvPOK(namesv)) {
42 0 if (namesv && SvPOK(namesv)) {
383 15 27 if (svp) {
403 14 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
404 14 0 argop = OpSIBLING(pushop);
406 14 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
14 14 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
407 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) {
409 13 0 if (SvPOK(namesv)) {
413 6 7 if (svp) {
428 15 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
429 15 0 argop = OpSIBLING(pushop);
431 30 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
30 15 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
432 15 0 cbop = OpSIBLING(argop);
433 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
434 15 0 && argop->op_type == OP_CONST) {
436 15 0 if (SvPOK(namesv)) {
440 6 9 if (svp) {
460 5 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
461 5 0 argop = OpSIBLING(pushop);
463 6 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
6 5 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
464 5 0 if (argop != cvop && argop->op_type == OP_CONST) {
5 0 if (argop != cvop && argop->op_type == OP_CONST) {
466 5 0 if (SvPOK(namesv)) {
470 3 2 if (svp) {
472 3 0 cbop = OpSIBLING(argop);
473 3 0 if (cbop == cvop) {
479 0 0 } else if (OpSIBLING(cbop) == cvop) {
0 0 } else if (OpSIBLING(cbop) == cvop) {
500 8 0 if (!OpHAS_SIBLING(pushop)) pushop = cUNOPx(pushop)->op_first;
501 8 0 argop = OpSIBLING(pushop);
503 9 0 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
9 8 while (OpHAS_SIBLING(cvop)) cvop = OpSIBLING(cvop);
504 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) {
506 7 0 if (SvPOK(namesv)) {
510 3 4 if (svp) {
529 150 150 if (items) {
531 0 150 if (flags & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) {
532 0 0 croak("Attempt to set %s slot",
536 0 150 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
552 1023 0 if (!name_sv || !SvOK(*name_sv)) return;
0 1023 if (!name_sv || !SvOK(*name_sv)) return;
557 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) {
560 1031 1022 for (i = 0; i <= len; i++) {
562 1029 2 if (cb && SvROK(*cb)) {
1029 0 if (cb && SvROK(*cb)) {
565 0 1029 PUSHMARK(SP);
566 0 1029 mXPUSHs(newSVpvn(name, name_len));
567 0 1029 XPUSHs(new_val);
570 1028 0 FREETMPS; LEAVE;
582 10 482 if (needed >= g_slots_size) {
583 10 0 IV new_size = g_slots_size ? g_slots_size * 2 : 16;
585 0 10 while (new_size <= needed) new_size *= 2;
586 0 10 Renew(g_slots, new_size, SV*);
588 0 10 Renew(slot_flags, new_size, UV);
589 528 10 for (i = g_slots_size; i < new_size; i++) {
611 1136 24 return svp ? SvIV(*svp) : create_slot(aTHX_ name, len);
629 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));
631 0 113 if (!pkg) pkg = "main";
632 225 113 for (i = 1; i < items; i++) {
636 12 213 IV idx = existing ? SvIV(*existing) : create_slot(aTHX_ name, name_len);
641 2 223 if (gvp && isGV(*gvp)) {
2 0 if (gvp && isGV(*gvp)) {
643 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)
655 256 46 for (i = 0; i < items; i++) {
658 255 1 if (!hv_fetch(g_slot_index, name, name_len, 0))
672 0 20 if (items < 2) croak("Usage: Legba::watch($name, $callback)");
676 5 15 if (existing && SvROK(*existing)) {
5 0 if (existing && SvROK(*existing)) {
684 20 0 if (idx_sv) g_has_watchers[SvIV(*idx_sv)] = 1;
694 0 4 if (items < 1) croak("Usage: Legba::unwatch($name [, $callback])");
696 2 2 if (items == 1) {
702 2 0 if (existing && SvROK(*existing)) {
2 0 if (existing && SvROK(*existing)) {
705 5 2 for (i = len; i >= 0; i--) {
707 5 0 if (cb && SvRV(*cb) == SvRV(callback))
2 3 if (cb && SvRV(*cb) == SvRV(callback))
710 0 2 if (av_len(callbacks) < 0) clear_flag = 1;
713 2 2 if (clear_flag) {
715 2 0 if (idx_sv) g_has_watchers[SvIV(*idx_sv)] = 0;
723 0 18 if (items < 1) XSRETURN_UNDEF;
726 17 1 if (svp) { ST(0) = *svp; XSRETURN(1); }
733 0 6 if (items < 1) XSRETURN_UNDEF;
735 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); }
742 0 10008 if (items < 2) XSRETURN_EMPTY;
744 10008 0 if (idx >= 0 && idx < g_slots_count) {
10008 0 if (idx >= 0 && idx < g_slots_count) {
746 2 10006 if (flags & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
747 1 1 croak("Attempt to set %s slot",
750 1 10005 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
760 0 101 if (items < 1) XSRETURN_UNDEF;
763 99 2 if (svp) { ST(0) = g_slots[SvIV(*svp)]; XSRETURN(1); }
772 0 1131 if (items < 2) XSRETURN_EMPTY;
775 2 1129 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
776 1 1 croak("Attempt to set %s slot '%s'",
779 1017 112 if (g_has_watchers[idx]) fire_watchers(aTHX_ idx, g_slots[idx]);
790 48 2 while ((entry = hv_iternext(g_slot_index)))
791 0 48 XPUSHs(hv_iterkeysv(entry));
799 0 26 if (items != 1) croak("Usage: Legba::exists($name)");
801 19 7 if (hv_exists(g_slot_index, name, name_len)) XSRETURN_YES;
809 7 6 for (i = 0; i < items; i++) {
813 7 0 if (svp) {
815 2 5 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)) continue;
827 3 2 for (i = 0; i < items; i++) {
829 3 0 if (idx >= 0 && idx < g_slots_count) {
3 0 if (idx >= 0 && idx < g_slots_count) {
834 3 0 if (name_sv && SvOK(*name_sv)) {
3 0 if (name_sv && SvOK(*name_sv)) {
849 0 5 if (items < 1) XSRETURN_EMPTY;
852 5 0 if (svp) {
854 2 3 if (slot_flags[idx] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN))
855 1 1 croak("Attempt to delete %s slot '%s'",
869 45 3 while ((entry = hv_iternext(g_slot_index))) {
871 0 45 mXPUSHp(key, klen);
882 142 6 for (i = 0; i < g_slots_count; i++) {
883 141 1 if (!(slot_flags[i] & (SLOT_FLAG_LOCKED | SLOT_FLAG_FROZEN)))
895 0 0 if (items < 2) croak("Usage: Legba::_install_accessor($pkg, $slot_name)");
907 0 11 if (items < 1) XSRETURN_UNDEF;
926 0 15 if (items < 1) XSRETURN_UNDEF;
940 0 3 if (items < 1) XSRETURN_UNDEF;
955 0 7 if (items < 1) croak("Usage: Legba::_lock($name)");
958 1 6 if (!svp) croak("Cannot lock non-existent slot '%s'", n);
960 1 5 if (slot_flags[idx] & SLOT_FLAG_FROZEN) croak("Cannot lock frozen slot '%s'", n);
968 0 6 if (items < 1) croak("Usage: Legba::_unlock($name)");
971 0 6 if (!svp) croak("Cannot unlock non-existent slot '%s'", n);
973 1 5 if (slot_flags[idx] & SLOT_FLAG_FROZEN) croak("Cannot unlock frozen slot '%s'", n);
981 0 6 if (items < 1) croak("Usage: Legba::_freeze($name)");
984 1 5 if (!svp) croak("Cannot freeze non-existent slot '%s'", n);
994 0 3 if (items < 1) XSRETURN_NO;
997 1 2 if (!svp) XSRETURN_NO;
998 1 1 if (slot_flags[SvIV(*svp)] & SLOT_FLAG_LOCKED) XSRETURN_YES;
1005 0 8 if (items < 1) XSRETURN_NO;
1008 1 7 if (!svp) XSRETURN_NO;
1009 7 0 if (slot_flags[SvIV(*svp)] & SLOT_FLAG_FROZEN) XSRETURN_YES;
1061 0 13 Newx(g_slots, g_slots_size, SV*);
1063 0 13 Newxz(slot_flags, g_slots_size, UV);
1066 208 13 for (i = 0; i < g_slots_size; i++)