File Coverage

src/xs/Glob.cc
Criterion Covered Total %
statement 33 34 97.0
branch 16 26 61.5
condition n/a
subroutine n/a
pod n/a
total 49 60 81.6


line stmt bran cond sub pod time code
1             #include
2             #include
3             #include
4             #include
5              
6             namespace xs {
7              
8 1           Glob Glob::create (const Stash& stash, panda::string_view name, U32 flags) {
9 1           GV* gv = (GV*)newSV(0);
10 1           flags |= GV_ADDMULTI; // suppress 'used only once' warning
11 1           gv_init_pvn(gv, stash, name.data(), name.length(), flags);
12 1           return gv;
13             }
14              
15 4           Stash Glob::stash () const { return GvSTASH((GV*)sv); }
16 2 50         Stash Glob::effective_stash () const { return GvESTASH((GV*)sv); }
17              
18 69           static inline void _set_slot (SV** where, SV* what) {
19 69           auto old = *where;
20 69           *where = what;
21 69 100         SvREFCNT_inc_simple_void(what);
22 69 50         SvREFCNT_dec(old);
23 69           }
24              
25 17           static inline void _set_slot (GV* where, CV* what) {
26 17           auto old = GvCV(where);
27 17           GvCV_set(where, what);
28 17 100         SvREFCNT_inc_simple_void(what);
29 17 50         SvREFCNT_dec(old);
30 17           }
31              
32 24           void Glob::slot (SV* val) {
33 24           GV* gv = (GV*)sv;
34 24 100         if (!val || SvTYPE(val) <= SVt_PVMG) _set_slot(&GvSV(gv), val);
    100          
    50          
35 13           else switch (SvTYPE(val)) {
36 3 50         case SVt_PVCV: _set_slot(gv, (CV*)val); break;
37 3 50         case SVt_PVHV: _set_slot((SV**)&GvHV(gv), val); break;
38 6 50         case SVt_PVAV: _set_slot((SV**)&GvAV(gv), val); break;
39 1 50         case SVt_PVIO: _set_slot((SV**)&GvIOp(gv), val); break;
40 0 0         default: throw std::invalid_argument("can set unsupported type to a typeglob");
41             }
42 24           }
43              
44 26           void Glob::slot (AV* val) { _set_slot((SV**)&GvAV((GV*)sv), (SV*)val); }
45 30           void Glob::slot (HV* val) { _set_slot((SV**)&GvHV((GV*)sv), (SV*)val); }
46 28           void Glob::slot (CV* val) { _set_slot((GV*)sv, val); }
47 6           void Glob::slot (IO* val) { _set_slot((SV**)&GvIOp((GV*)sv), (SV*)val); }
48 34           void Glob::slot (const Scalar& val) { _set_slot(&GvSV((GV*)sv), val); }
49              
50             }