Commit | Line | Data |
---|---|---|
8565c31a MHM |
1 | ################################################################################ |
2 | ## | |
b2049988 | 3 | ## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz. |
8565c31a MHM |
4 | ## Version 2.x, Copyright (C) 2001, Paul Marquess. |
5 | ## Version 1.x, Copyright (C) 1999, Kenneth Albanowski. | |
6 | ## | |
7 | ## This program is free software; you can redistribute it and/or | |
8 | ## modify it under the same terms as Perl itself. | |
9 | ## | |
10 | ################################################################################ | |
11 | ||
12 | =provides | |
13 | ||
dca7d424 | 14 | GV_NOADD_MASK |
94e22bd6 | 15 | gv_fetchpvn_flags |
dca7d424 P |
16 | GvSVn |
17 | isGV_with_GP | |
18 | gv_fetchsv | |
19 | get_cvn_flags | |
20 | gv_init_pvn | |
8565c31a MHM |
21 | |
22 | =implementation | |
23 | ||
dca7d424 P |
24 | #if { VERSION >= 5.9.2 } && { VERSION <= 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */ |
25 | #undef gv_fetchpvn_flags | |
94e22bd6 MH |
26 | #endif |
27 | ||
dca7d424 P |
28 | __UNDEFINED__ GV_NOADD_MASK 0xE0 |
29 | __UNDEFINED__ gv_fetchpvn_flags(name, len, flags, sv_type) gv_fetchpv(SvPVX(sv_2mortal(newSVpvn((name), (len)))), ((flags) & GV_NOADD_MASK) ? FALSE : TRUE, (I32)(sv_type)) | |
30 | ||
8565c31a MHM |
31 | __UNDEFINED__ GvSVn(gv) GvSV(gv) |
32 | __UNDEFINED__ isGV_with_GP(gv) isGV(gv) | |
49ef49fe CBW |
33 | __UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) |
34 | ||
35 | __UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags) | |
94e22bd6 MH |
36 | __UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE) |
37 | ||
8565c31a MHM |
38 | =xsubs |
39 | ||
40 | int | |
41 | GvSVn() | |
b2049988 MHM |
42 | PREINIT: |
43 | GV* gv; | |
44 | CODE: | |
45 | RETVAL = 0; | |
46 | gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV); | |
47 | if (GvSVn(gv) != NULL) | |
48 | { | |
49 | RETVAL++; | |
50 | } | |
51 | OUTPUT: | |
52 | RETVAL | |
8565c31a MHM |
53 | |
54 | int | |
55 | isGV_with_GP() | |
b2049988 MHM |
56 | PREINIT: |
57 | GV* gv; | |
58 | CODE: | |
59 | RETVAL = 0; | |
60 | gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV); | |
61 | if (isGV_with_GP(gv)) | |
62 | { | |
63 | RETVAL++; | |
64 | } | |
65 | if (!isGV(&PL_sv_undef)) | |
66 | { | |
67 | RETVAL++; | |
68 | } | |
69 | OUTPUT: | |
70 | RETVAL | |
8565c31a | 71 | |
49ef49fe CBW |
72 | int |
73 | get_cvn_flags() | |
b2049988 MHM |
74 | PREINIT: |
75 | CV* xv; | |
76 | CODE: | |
77 | RETVAL = 0; | |
78 | xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, 0); | |
79 | if(xv == NULL) RETVAL++; | |
80 | xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, GV_ADDMULTI); | |
81 | if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++; | |
82 | xv = get_cvn_flags("Devel::PPPort::get_cvn_flags", sizeof("Devel::PPPort::get_cvn_flags")-1, 0); | |
83 | if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++; | |
84 | OUTPUT: | |
85 | RETVAL | |
49ef49fe CBW |
86 | |
87 | SV* | |
88 | gv_fetchpvn_flags() | |
b2049988 | 89 | CODE: |
94e22bd6 | 90 | RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV)); |
b2049988 MHM |
91 | OUTPUT: |
92 | RETVAL | |
49ef49fe CBW |
93 | |
94 | SV* | |
95 | gv_fetchsv(name) | |
b2049988 MHM |
96 | SV *name |
97 | CODE: | |
98 | RETVAL = newRV_inc((SV*)gv_fetchsv(name, 0, SVt_PV)); | |
99 | OUTPUT: | |
100 | RETVAL | |
8565c31a | 101 | |
94e22bd6 MH |
102 | void |
103 | gv_init_type(namesv, multi, flags) | |
104 | SV* namesv | |
105 | int multi | |
106 | I32 flags | |
107 | PREINIT: | |
108 | HV *defstash = gv_stashpv("main", 0); | |
109 | STRLEN len; | |
110 | const char * const name = SvPV_const(namesv, len); | |
111 | GV *gv = *(GV**)hv_fetch(defstash, name, len, TRUE); | |
112 | PPCODE: | |
113 | if (SvTYPE(gv) == SVt_PVGV) | |
114 | Perl_croak(aTHX_ "GV is already a PVGV"); | |
115 | if (multi) flags |= GV_ADDMULTI; | |
116 | gv_init_pvn(gv, defstash, name, len, flags); | |
117 | XPUSHs( gv ? (SV*)gv : &PL_sv_undef); | |
118 | ||
119 | =tests plan => 7 | |
8565c31a MHM |
120 | |
121 | ok(Devel::PPPort::GvSVn(), 1); | |
122 | ||
49ef49fe CBW |
123 | ok(Devel::PPPort::isGV_with_GP(), 2); |
124 | ||
125 | ok(Devel::PPPort::get_cvn_flags(), 3); | |
126 | ||
127 | ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION); | |
128 | ||
129 | ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION); | |
94e22bd6 MH |
130 | |
131 | ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check"); | |
132 | ok($::{sanity_check}); |