File Coverage

XS_xsgen.cc
Criterion Covered Total %
statement 17 48 35.4
branch 8 76 10.5
condition n/a
subroutine n/a
pod n/a
total 25 124 20.1


line stmt bran cond sub pod time code
1             /*
2             * This file was generated automatically by ExtUtils::ParseXS version 3.34 from the
3             * contents of XS.xs. Do not edit this file, edit XS.xs instead.
4             *
5             * ANY CHANGES MADE HERE WILL BE LOST!
6             *
7             */
8              
9             #line 1 "XS.xs"
10             #include
11             #include
12             using namespace xs;
13             using namespace xs::exp;
14              
15             static void throw_nopackage (const Simple& name) {
16             throw Simple::format("Export::XS: context package '%" SVf "' doesn't exist", SVfARG(name.get()));
17             }
18              
19             #line 20 "XS_xsgen.cc"
20             #ifndef PERL_UNUSED_VAR
21             # define PERL_UNUSED_VAR(var) if (0) var = var
22             #endif
23              
24             #ifndef dVAR
25             # define dVAR dNOOP
26             #endif
27              
28              
29             /* This stuff is not part of the API! You have been warned. */
30             #ifndef PERL_VERSION_DECIMAL
31             # define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
32             #endif
33             #ifndef PERL_DECIMAL_VERSION
34             # define PERL_DECIMAL_VERSION \
35             PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
36             #endif
37             #ifndef PERL_VERSION_GE
38             # define PERL_VERSION_GE(r,v,s) \
39             (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
40             #endif
41             #ifndef PERL_VERSION_LE
42             # define PERL_VERSION_LE(r,v,s) \
43             (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s))
44             #endif
45              
46             /* XS_INTERNAL is the explicit static-linkage variant of the default
47             * XS macro.
48             *
49             * XS_EXTERNAL is the same as XS_INTERNAL except it does not include
50             * "STATIC", ie. it exports XSUB symbols. You probably don't want that
51             * for anything but the BOOT XSUB.
52             *
53             * See XSUB.h in core!
54             */
55              
56              
57             /* TODO: This might be compatible further back than 5.10.0. */
58             #if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1)
59             # undef XS_EXTERNAL
60             # undef XS_INTERNAL
61             # if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
62             # define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
63             # define XS_INTERNAL(name) STATIC XSPROTO(name)
64             # endif
65             # if defined(__SYMBIAN32__)
66             # define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
67             # define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
68             # endif
69             # ifndef XS_EXTERNAL
70             # if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
71             # define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
72             # define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
73             # else
74             # ifdef __cplusplus
75             # define XS_EXTERNAL(name) extern "C" XSPROTO(name)
76             # define XS_INTERNAL(name) static XSPROTO(name)
77             # else
78             # define XS_EXTERNAL(name) XSPROTO(name)
79             # define XS_INTERNAL(name) STATIC XSPROTO(name)
80             # endif
81             # endif
82             # endif
83             #endif
84              
85             /* perl >= 5.10.0 && perl <= 5.15.1 */
86              
87              
88             /* The XS_EXTERNAL macro is used for functions that must not be static
89             * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL
90             * macro defined, the best we can do is assume XS is the same.
91             * Dito for XS_INTERNAL.
92             */
93             #ifndef XS_EXTERNAL
94             # define XS_EXTERNAL(name) XS(name)
95             #endif
96             #ifndef XS_INTERNAL
97             # define XS_INTERNAL(name) XS(name)
98             #endif
99              
100             /* Now, finally, after all this mess, we want an ExtUtils::ParseXS
101             * internal macro that we're free to redefine for varying linkage due
102             * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use
103             * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to!
104             */
105              
106             #undef XS_EUPXS
107             #if defined(PERL_EUPXS_ALWAYS_EXPORT)
108             # define XS_EUPXS(name) XS_EXTERNAL(name)
109             #else
110             /* default to internal */
111             # define XS_EUPXS(name) XS_INTERNAL(name)
112             #endif
113              
114             #ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
115             #define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
116              
117             /* prototype to pass -Wmissing-prototypes */
118             STATIC void
119             S_croak_xs_usage(const CV *const cv, const char *const params);
120              
121             STATIC void
122             S_croak_xs_usage(const CV *const cv, const char *const params)
123             {
124             const GV *const gv = CvGV(cv);
125              
126             PERL_ARGS_ASSERT_CROAK_XS_USAGE;
127              
128             if (gv) {
129             const char *const gvname = GvNAME(gv);
130             const HV *const stash = GvSTASH(gv);
131             const char *const hvname = stash ? HvNAME(stash) : NULL;
132              
133             if (hvname)
134             Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params);
135             else
136             Perl_croak_nocontext("Usage: %s(%s)", gvname, params);
137             } else {
138             /* Pants. I don't think that it should be possible to get here. */
139             Perl_croak_nocontext("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
140             }
141             }
142             #undef PERL_ARGS_ASSERT_CROAK_XS_USAGE
143              
144             #define croak_xs_usage S_croak_xs_usage
145              
146             #endif
147              
148             /* NOTE: the prototype of newXSproto() is different in versions of perls,
149             * so we define a portable version of newXSproto()
150             */
151             #ifdef newXS_flags
152             #define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0)
153             #else
154             #define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv)
155             #endif /* !defined(newXS_flags) */
156              
157             #if PERL_VERSION_LE(5, 21, 5)
158             # define newXS_deffile(a,b) Perl_newXS(aTHX_ a,b,file)
159             #else
160             # define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b)
161             #endif
162              
163             #line 164 "XS_xsgen.cc"
164              
165              
166 32           XS_EUPXS(XS_Export__XS_import) { xs::throw_guard(cv, [=]()
167             {
168 16           dVAR; dXSARGS;
169 16 50         if (items < 1)
170 0           croak_xs_usage(cv, "ctx_class, ...");
171             PERL_UNUSED_VAR(ax); /* -Wall */
172 16           SP -= items;
173             {
174 32 50         Simple ctx_class = ST(0);
175 16 50         if (!ctx_class && SvOK(ST(0))) throw "arg is not a 'Simple' value"
    0          
    0          
    0          
    50          
176 0           ;
177             #line 14 "XS.xs"
178             Stash caller_stash = CopSTASH(PL_curcop);
179              
180             bool create = false;
181             panda::string_view ctx_clname = ctx_class;
182             if (ctx_clname == "Export::XS") create = true;
183             else if (ctx_clname == "Export::XS::Auto") {
184             create = true;
185             autoexport(caller_stash);
186             }
187              
188             if (create) {
189             if (items < 2) XSRETURN_EMPTY;
190             if (Sv(ST(1)).is_hash_ref()) create_constants(caller_stash, ST(1));
191             else create_constants(caller_stash, &ST(1), items-1);
192             }
193             else {
194             auto ctx_stash = Stash::from_name(ctx_class);
195             if (!ctx_stash) throw_nopackage(ctx_class);
196             if (items > 1) {
197             for (I32 i = 1; i < items; ++i) {
198             panda::string_view name = Simple(ST(i));
199             if (name == ":const") export_constants(ctx_stash, caller_stash);
200             else export_sub(ctx_stash, caller_stash, name);
201             }
202             }
203             else export_constants(ctx_stash, caller_stash);
204             }
205             #line 206 "XS_xsgen.cc"
206 10           PUTBACK;
207 10           return;
208             }
209 16 50         }); }
210              
211              
212              
213 0           XS_EUPXS(XS_Export__XS_constants_list) { xs::throw_guard(cv, [=]()
214             {
215 0           dVAR; dXSARGS;
216 0 0         if (items != 1)
217 0           croak_xs_usage(cv, "ctx_class");
218             {
219 0           Array RETVAL;
220 0 0         Simple ctx_class = ST(0);
    0          
221 0 0         if (!ctx_class && SvOK(ST(0))) throw "arg is not a 'Simple' value"
    0          
    0          
    0          
    0          
222 0           ;
223             #line 44 "XS.xs"
224             auto ctx_stash = Stash::from_name(ctx_class);
225             if (!ctx_stash) throw_nopackage(ctx_class);
226             RETVAL = constants_list(ctx_stash);
227             #line 228 "XS_xsgen.cc"
228             {
229             SV * RETVALSV;
230 0           RETVALSV = NULL;
231 0 0         if (!RETVAL) XSRETURN_UNDEF;
232 0 0         RETVALSV = newRV_noinc(RETVAL.detach());
233 0 0         RETVALSV = sv_2mortal(RETVALSV);
234 0 0         ST(0) = RETVALSV;
235             }
236             }
237 0           XSRETURN(1);
238 0 0         }); }
239              
240              
241              
242 0           XS_EUPXS(XS_Export__XS_export_constants) { xs::throw_guard(cv, [=]()
243             {
244 0           dVAR; dXSARGS;
245 0 0         if (items != 2)
246 0           croak_xs_usage(cv, "ctx_class, trg_class");
247             PERL_UNUSED_VAR(ax); /* -Wall */
248 0           SP -= items;
249             {
250 0 0         Simple ctx_class = ST(0);
251 0 0         if (!ctx_class && SvOK(ST(0))) throw "arg is not a 'Simple' value"
    0          
    0          
    0          
    0          
252 0           ;
253 0 0         Simple trg_class = ST(1);
254 0 0         if (!trg_class && SvOK(ST(1))) throw "arg is not a 'Simple' value"
    0          
    0          
    0          
    0          
255 0           ;
256             #line 50 "XS.xs"
257             auto ctx_stash = Stash::from_name(ctx_class);
258             auto trg_stash = Stash::from_name(trg_class);
259              
260             export_constants(ctx_stash, trg_stash);
261             #line 262 "XS_xsgen.cc"
262 0           PUTBACK;
263 0           return;
264             }
265 0 0         }); }
266              
267             #ifdef __cplusplus
268             extern "C"
269             #endif
270              
271 6           XS_EXTERNAL(boot_Export__XS) { xs::throw_guard(cv, [=]() mutable
272             {
273             #if PERL_VERSION_LE(5, 21, 5)
274             dVAR; dXSARGS;
275             #else
276 3 50         dVAR; dXSBOOTARGSXSAPIVERCHK;
    50          
277             #endif
278             #if (PERL_REVISION == 5 && PERL_VERSION < 9)
279             char* file = __FILE__;
280             #else
281 3           const char* file = __FILE__;
282             #endif
283              
284             PERL_UNUSED_VAR(file);
285              
286             PERL_UNUSED_VAR(cv); /* -W */
287             PERL_UNUSED_VAR(items); /* -W */
288             #if PERL_VERSION_LE(5, 21, 5)
289             XS_VERSION_BOOTCHECK;
290             # ifdef XS_APIVERSION_BOOTCHECK
291             XS_APIVERSION_BOOTCHECK;
292             # endif
293             #endif
294              
295 3           newXS_deffile("Export::XS::import", XS_Export__XS_import);
296 3           newXS_deffile("Export::XS::constants_list", XS_Export__XS_constants_list);
297 3           newXS_deffile("Export::XS::export_constants", XS_Export__XS_export_constants);
298             #if PERL_VERSION_LE(5, 21, 5)
299             # if PERL_VERSION_GE(5, 9, 0)
300             if (PL_unitcheckav)
301             call_list(PL_scopestack_ix, PL_unitcheckav);
302             # endif
303             XSRETURN_YES;
304             #else
305 3           Perl_xs_boot_epilog(aTHX_ ax);
306             #endif
307 3 50         }); }
308