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