File Coverage

DMD_helper.h
Criterion Covered Total %
statement 12 45 26.6
branch 4 26 15.3
condition n/a
subroutine n/a
pod n/a
total 16 71 22.5


line stmt bran cond sub pod time code
1             #ifndef __DEVEL_MAT_DUMPER_HELPER_H__
2             #define __DEVEL_MAT_DUMPER_HELPER_H__
3              
4             #define DMD_ANNOTATE_SV(targ, val, name) S_DMD_AnnotateSv(aTHX_ targ, val, name)
5 0           static int S_DMD_AnnotateSv(pTHX_ const SV *targ, const SV *val, const char *name)
6             {
7 0           dSP;
8 0 0         if(!targ || !val)
    0          
9 0           return 0;
10              
11 0 0         mXPUSHi(0x87); /* TODO PMAT_SVxSVSVnote */
12 0 0         XPUSHs((SV *)targ);
13 0 0         XPUSHs((SV *)val);
14 0 0         mXPUSHp(name, strlen(name));
15 0           PUTBACK;
16 0           return 4;
17             }
18              
19             #ifdef WANT_DMD_API_044
20             typedef struct DMDContext DMDContext;
21              
22             typedef int DMD_Helper(pTHX_ DMDContext *ctx, const SV *sv);
23              
24             #define DMD_SET_PACKAGE_HELPER(package, helper) S_DMD_SetPackageHelper(aTHX_ package, helper)
25 16           static void S_DMD_SetPackageHelper(pTHX_ char *package, DMD_Helper *helper)
26             {
27             HV *helper_per_package;
28             SV **svp;
29 16 100         if((svp = hv_fetchs(PL_modglobal, "Devel::MAT::Dumper/%helper_per_package", 0)))
30 8           helper_per_package = (HV *)SvRV(*svp);
31             else {
32 8           helper_per_package = newHV();
33 8           hv_stores(PL_modglobal, "Devel::MAT::Dumper/%helper_per_package", newRV_noinc((SV *)helper_per_package));
34             }
35              
36 16           hv_store(helper_per_package, package, strlen(package), newSVuv(PTR2UV(helper)), 0);
37 16           }
38              
39             typedef int DMD_MagicHelper(pTHX_ DMDContext *ctx, const SV *sv, MAGIC *mg);
40              
41             #define DMD_SET_MAGIC_HELPER(vtbl, helper) S_DMD_SetMagicHelper(aTHX_ vtbl, helper)
42 0           static void S_DMD_SetMagicHelper(pTHX_ MGVTBL *vtbl, DMD_MagicHelper *helper)
43             {
44             HV *helper_per_magic;
45             SV **svp;
46 0 0         if((svp = hv_fetchs(PL_modglobal, "Devel::MAT::Dumper/%helper_per_magic", 0)))
47 0           helper_per_magic = (HV *)SvRV(*svp);
48             else {
49 0           helper_per_magic = newHV();
50 0           hv_stores(PL_modglobal, "Devel::MAT::Dumper/%helper_per_magic", newRV_noinc((SV *)helper_per_magic));
51             }
52              
53 0           SV *keysv = newSViv((IV)vtbl);
54 0           hv_store_ent(helper_per_magic, keysv, newSVuv(PTR2UV(helper)), 0);
55 0           SvREFCNT_dec(keysv);
56 0           }
57              
58             typedef struct
59             {
60             const char *name;
61             enum {
62             DMD_FIELD_PTR,
63             DMD_FIELD_BOOL,
64             DMD_FIELD_U8,
65             DMD_FIELD_U32,
66             DMD_FIELD_UINT,
67             } type;
68             struct {
69             void *ptr;
70             bool b;
71             long n;
72             };
73             } DMDNamedField;
74              
75             #define DMD_DUMP_STRUCT(ctx, name, addr, size, nfields, fields) \
76             S_DMD_DumpStruct(aTHX_ ctx, name, addr, size, nfields, fields)
77 0           static void S_DMD_DumpStruct(pTHX_ DMDContext *ctx, const char *name, void *addr, size_t size,
78             size_t nfields, const DMDNamedField fields[])
79             {
80             static void (*func)(pTHX_ DMDContext *ctx, const char *, void *, size_t,
81             size_t, const DMDNamedField []);
82 0 0         if(!func) {
83 0           SV **svp = hv_fetchs(PL_modglobal, "Devel::MAT::Dumper/writestruct()", 0);
84 0 0         if(svp)
85 0 0         func = INT2PTR(void (*)(pTHX_ DMDContext *ctx, const char *, void *, size_t,
86             size_t, const DMDNamedField[]), SvUV(*svp));
87             else
88 0           func = (void *)(-1);
89             }
90              
91 0 0         if(func != (void *)(-1))
92 0           (*func)(aTHX_ ctx, name, addr, size, nfields, fields);
93 0           }
94              
95             #else
96             typedef int DMD_Helper(pTHX_ const SV *sv);
97              
98             #define DMD_SET_PACKAGE_HELPER(package, helper) S_DMD_SetPackageHelper(aTHX_ package, helper)
99             static void S_DMD_SetPackageHelper(pTHX_ char *package, DMD_Helper *helper)
100             {
101             HV *helper_per_package = get_hv("Devel::MAT::Dumper::HELPER_PER_PACKAGE", GV_ADD);
102              
103             hv_store(helper_per_package, package, strlen(package), newSVuv(PTR2UV(helper)), 0);
104             }
105              
106             typedef int DMD_MagicHelper(pTHX_ const SV *sv, MAGIC *mg);
107              
108             #define DMD_SET_MAGIC_HELPER(vtbl, helper) S_DMD_SetMagicHelper(aTHX_ vtbl, helper)
109             static void S_DMD_SetMagicHelper(pTHX_ MGVTBL *vtbl, DMD_MagicHelper *helper)
110             {
111             HV *helper_per_magic = get_hv("Devel::MAT::Dumper::HELPER_PER_MAGIC", GV_ADD);
112             SV *keysv = newSViv((IV)vtbl);
113              
114             hv_store_ent(helper_per_magic, keysv, newSVuv(PTR2UV(helper)), 0);
115              
116             SvREFCNT_dec(keysv);
117             }
118             #endif
119              
120             #define DMD_IS_ACTIVE() S_DMD_is_active(aTHX)
121 45           static bool S_DMD_is_active(pTHX)
122             {
123             #ifdef MULTIPLICITY
124             return !!get_cv("Devel::MAT::Dumper::dump", 0);
125             #else
126             static bool active;
127             static bool cached = FALSE;
128 45 100         if(!cached) {
129 1           active = !!get_cv("Devel::MAT::Dumper::dump", 0);
130 1           cached = TRUE;
131             }
132 45           return active;
133             #endif
134             }
135              
136             #define DMD_ADD_ROOT(sv, name) S_DMD_add_root(aTHX_ sv, name)
137 0           static void S_DMD_add_root(pTHX_ SV *sv, const char *name)
138             {
139 0           AV *moreroots = get_av("Devel::MAT::Dumper::MORE_ROOTS", GV_ADD);
140              
141 0           av_push(moreroots, newSVpvn(name, strlen(name)));
142 0           av_push(moreroots, sv);
143 0           }
144              
145             #endif