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