15759b3d2Safresh1################################################################################
25759b3d2Safresh1##
35759b3d2Safresh1##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
45759b3d2Safresh1##  Version 2.x, Copyright (C) 2001, Paul Marquess.
55759b3d2Safresh1##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
65759b3d2Safresh1##
75759b3d2Safresh1##  This program is free software; you can redistribute it and/or
85759b3d2Safresh1##  modify it under the same terms as Perl itself.
95759b3d2Safresh1##
105759b3d2Safresh1################################################################################
115759b3d2Safresh1
125759b3d2Safresh1=provides
135759b3d2Safresh1
14*9a4edab6Sbluhm__UNDEFINED__
155759b3d2Safresh1
165759b3d2Safresh1=implementation
175759b3d2Safresh1
18de8cc8edSafresh1#if { VERSION >= 5.9.2 } && { VERSION <= 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
19de8cc8edSafresh1#undef gv_fetchpvn_flags
205759b3d2Safresh1#endif
21de8cc8edSafresh1
22*9a4edab6Sbluhm#ifdef GV_NOADD_MASK
23*9a4edab6Sbluhm#  define D_PPP_GV_NOADD_MASK  GV_NOADD_MASK
24*9a4edab6Sbluhm#else
25*9a4edab6Sbluhm#  define D_PPP_GV_NOADD_MASK  0xE0
26*9a4edab6Sbluhm#endif
27*9a4edab6Sbluhm
28*9a4edab6Sbluhm__UNDEFINED__ gv_fetchpvn_flags(name, len, flags, sv_type) gv_fetchpv(SvPVX(sv_2mortal(newSVpvn((name), (len)))), ((flags) & D_PPP_GV_NOADD_MASK) ? FALSE : TRUE, (I32)(sv_type))
295759b3d2Safresh1
305759b3d2Safresh1__UNDEFINED__ GvSVn(gv)        GvSV(gv)
315759b3d2Safresh1__UNDEFINED__ isGV_with_GP(gv) isGV(gv)
325759b3d2Safresh1__UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
335759b3d2Safresh1
345759b3d2Safresh1__UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags)
355759b3d2Safresh1__UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
365759b3d2Safresh1
375759b3d2Safresh1=xsubs
385759b3d2Safresh1
395759b3d2Safresh1int
405759b3d2Safresh1GvSVn()
415759b3d2Safresh1        PREINIT:
425759b3d2Safresh1                GV* gv;
435759b3d2Safresh1        CODE:
445759b3d2Safresh1                RETVAL = 0;
455759b3d2Safresh1                gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
465759b3d2Safresh1                if (GvSVn(gv) != NULL)
475759b3d2Safresh1                {
485759b3d2Safresh1                  RETVAL++;
495759b3d2Safresh1                }
505759b3d2Safresh1        OUTPUT:
515759b3d2Safresh1                RETVAL
525759b3d2Safresh1
535759b3d2Safresh1int
545759b3d2Safresh1isGV_with_GP()
555759b3d2Safresh1        PREINIT:
565759b3d2Safresh1                GV* gv;
575759b3d2Safresh1        CODE:
585759b3d2Safresh1                RETVAL = 0;
595759b3d2Safresh1                gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
605759b3d2Safresh1                if (isGV_with_GP(gv))
615759b3d2Safresh1                {
625759b3d2Safresh1                  RETVAL++;
635759b3d2Safresh1                }
645759b3d2Safresh1                if (!isGV(&PL_sv_undef))
655759b3d2Safresh1                {
665759b3d2Safresh1                  RETVAL++;
675759b3d2Safresh1                }
685759b3d2Safresh1        OUTPUT:
695759b3d2Safresh1                RETVAL
705759b3d2Safresh1
715759b3d2Safresh1int
725759b3d2Safresh1get_cvn_flags()
735759b3d2Safresh1        PREINIT:
745759b3d2Safresh1                CV* xv;
755759b3d2Safresh1        CODE:
765759b3d2Safresh1                RETVAL = 0;
775759b3d2Safresh1                xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, 0);
785759b3d2Safresh1                if(xv == NULL) RETVAL++;
795759b3d2Safresh1                xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, GV_ADDMULTI);
805759b3d2Safresh1                if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
815759b3d2Safresh1                xv = get_cvn_flags("Devel::PPPort::get_cvn_flags", sizeof("Devel::PPPort::get_cvn_flags")-1, 0);
825759b3d2Safresh1                if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
835759b3d2Safresh1        OUTPUT:
845759b3d2Safresh1                RETVAL
855759b3d2Safresh1
865759b3d2Safresh1SV*
875759b3d2Safresh1gv_fetchpvn_flags()
885759b3d2Safresh1        CODE:
895759b3d2Safresh1                RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV));
905759b3d2Safresh1        OUTPUT:
915759b3d2Safresh1                RETVAL
925759b3d2Safresh1
935759b3d2Safresh1SV*
945759b3d2Safresh1gv_fetchsv(name)
955759b3d2Safresh1        SV *name
965759b3d2Safresh1        CODE:
975759b3d2Safresh1                RETVAL = newRV_inc((SV*)gv_fetchsv(name, 0, SVt_PV));
985759b3d2Safresh1        OUTPUT:
995759b3d2Safresh1                RETVAL
1005759b3d2Safresh1
1015759b3d2Safresh1void
1025759b3d2Safresh1gv_init_type(namesv, multi, flags)
1035759b3d2Safresh1    SV* namesv
1045759b3d2Safresh1    int multi
1055759b3d2Safresh1    I32 flags
1065759b3d2Safresh1    PREINIT:
1075759b3d2Safresh1        HV *defstash = gv_stashpv("main", 0);
1085759b3d2Safresh1        STRLEN len;
1095759b3d2Safresh1        const char * const name = SvPV_const(namesv, len);
1105759b3d2Safresh1        GV *gv = *(GV**)hv_fetch(defstash, name, len, TRUE);
1115759b3d2Safresh1    PPCODE:
1125759b3d2Safresh1        if (SvTYPE(gv) == SVt_PVGV)
1135759b3d2Safresh1            Perl_croak(aTHX_ "GV is already a PVGV");
1145759b3d2Safresh1        if (multi) flags |= GV_ADDMULTI;
1155759b3d2Safresh1        gv_init_pvn(gv, defstash, name, len, flags);
1165759b3d2Safresh1	XPUSHs( gv ? (SV*)gv : &PL_sv_undef);
1175759b3d2Safresh1
1185759b3d2Safresh1=tests plan => 7
1195759b3d2Safresh1
120de8cc8edSafresh1is(Devel::PPPort::GvSVn(), 1);
1215759b3d2Safresh1
122de8cc8edSafresh1is(Devel::PPPort::isGV_with_GP(), 2);
1235759b3d2Safresh1
124de8cc8edSafresh1is(Devel::PPPort::get_cvn_flags(), 3);
1255759b3d2Safresh1
126de8cc8edSafresh1is(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
1275759b3d2Safresh1
128de8cc8edSafresh1is(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
1295759b3d2Safresh1
130de8cc8edSafresh1is(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
1315759b3d2Safresh1ok($::{sanity_check});
132