Blame parts/inc/gv

Packit 7d6a7d
################################################################################
Packit 7d6a7d
##
Packit 7d6a7d
##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
Packit 7d6a7d
##  Version 2.x, Copyright (C) 2001, Paul Marquess.
Packit 7d6a7d
##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
Packit 7d6a7d
##
Packit 7d6a7d
##  This program is free software; you can redistribute it and/or
Packit 7d6a7d
##  modify it under the same terms as Perl itself.
Packit 7d6a7d
##
Packit 7d6a7d
################################################################################
Packit 7d6a7d
Packit 7d6a7d
=provides
Packit 7d6a7d
Packit 7d6a7d
gv_fetchpvn_flags
Packit 7d6a7d
Packit 7d6a7d
=implementation
Packit 7d6a7d
Packit 7d6a7d
#ifndef gv_fetchpvn_flags
Packit 7d6a7d
#if { NEED gv_fetchpvn_flags }
Packit 7d6a7d
Packit 7d6a7d
GV*
Packit 7d6a7d
gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, int flags, int types) {
Packit 7d6a7d
	char *namepv = savepvn(name, len);
Packit 7d6a7d
	GV* stash = gv_fetchpv(namepv, TRUE, SVt_PVHV);
Packit 7d6a7d
	Safefree(namepv);
Packit 7d6a7d
	return stash;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
#endif
Packit 7d6a7d
#endif
Packit 7d6a7d
Packit 7d6a7d
__UNDEFINED__ GvSVn(gv)        GvSV(gv)
Packit 7d6a7d
__UNDEFINED__ isGV_with_GP(gv) isGV(gv)
Packit 7d6a7d
__UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
Packit 7d6a7d
Packit 7d6a7d
__UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags)
Packit 7d6a7d
__UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
Packit 7d6a7d
Packit 7d6a7d
=xsinit
Packit 7d6a7d
Packit 7d6a7d
#define NEED_gv_fetchpvn_flags
Packit 7d6a7d
Packit 7d6a7d
=xsubs
Packit 7d6a7d
Packit 7d6a7d
int
Packit 7d6a7d
GvSVn()
Packit 7d6a7d
        PREINIT:
Packit 7d6a7d
                GV* gv;
Packit 7d6a7d
        CODE:
Packit 7d6a7d
                RETVAL = 0;
Packit 7d6a7d
                gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
Packit 7d6a7d
                if (GvSVn(gv) != NULL)
Packit 7d6a7d
                {
Packit 7d6a7d
                  RETVAL++;
Packit 7d6a7d
                }
Packit 7d6a7d
        OUTPUT:
Packit 7d6a7d
                RETVAL
Packit 7d6a7d
Packit 7d6a7d
int
Packit 7d6a7d
isGV_with_GP()
Packit 7d6a7d
        PREINIT:
Packit 7d6a7d
                GV* gv;
Packit 7d6a7d
        CODE:
Packit 7d6a7d
                RETVAL = 0;
Packit 7d6a7d
                gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
Packit 7d6a7d
                if (isGV_with_GP(gv))
Packit 7d6a7d
                {
Packit 7d6a7d
                  RETVAL++;
Packit 7d6a7d
                }
Packit 7d6a7d
                if (!isGV(&PL_sv_undef))
Packit 7d6a7d
                {
Packit 7d6a7d
                  RETVAL++;
Packit 7d6a7d
                }
Packit 7d6a7d
        OUTPUT:
Packit 7d6a7d
                RETVAL
Packit 7d6a7d
Packit 7d6a7d
int
Packit 7d6a7d
get_cvn_flags()
Packit 7d6a7d
        PREINIT:
Packit 7d6a7d
                CV* xv;
Packit 7d6a7d
        CODE:
Packit 7d6a7d
                RETVAL = 0;
Packit 7d6a7d
                xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, 0);
Packit 7d6a7d
                if(xv == NULL) RETVAL++;
Packit 7d6a7d
                xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, GV_ADDMULTI);
Packit 7d6a7d
                if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
Packit 7d6a7d
                xv = get_cvn_flags("Devel::PPPort::get_cvn_flags", sizeof("Devel::PPPort::get_cvn_flags")-1, 0);
Packit 7d6a7d
                if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
Packit 7d6a7d
        OUTPUT:
Packit 7d6a7d
                RETVAL
Packit 7d6a7d
Packit 7d6a7d
SV*
Packit 7d6a7d
gv_fetchpvn_flags()
Packit 7d6a7d
        CODE:
Packit 7d6a7d
#if { VERSION < 5.9.2 } || { VERSION > 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
Packit 7d6a7d
                RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV));
Packit 7d6a7d
#else
Packit 7d6a7d
                RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSION", 0, 0, SVt_PV));
Packit 7d6a7d
#endif
Packit 7d6a7d
        OUTPUT:
Packit 7d6a7d
                RETVAL
Packit 7d6a7d
Packit 7d6a7d
SV*
Packit 7d6a7d
gv_fetchsv(name)
Packit 7d6a7d
        SV *name
Packit 7d6a7d
        CODE:
Packit 7d6a7d
                RETVAL = newRV_inc((SV*)gv_fetchsv(name, 0, SVt_PV));
Packit 7d6a7d
        OUTPUT:
Packit 7d6a7d
                RETVAL
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
gv_init_type(namesv, multi, flags)
Packit 7d6a7d
    SV* namesv
Packit 7d6a7d
    int multi
Packit 7d6a7d
    I32 flags
Packit 7d6a7d
    PREINIT:
Packit 7d6a7d
        HV *defstash = gv_stashpv("main", 0);
Packit 7d6a7d
        STRLEN len;
Packit 7d6a7d
        const char * const name = SvPV_const(namesv, len);
Packit 7d6a7d
        GV *gv = *(GV**)hv_fetch(defstash, name, len, TRUE);
Packit 7d6a7d
    PPCODE:
Packit 7d6a7d
        if (SvTYPE(gv) == SVt_PVGV)
Packit 7d6a7d
            Perl_croak(aTHX_ "GV is already a PVGV");
Packit 7d6a7d
        if (multi) flags |= GV_ADDMULTI;
Packit 7d6a7d
        gv_init_pvn(gv, defstash, name, len, flags);
Packit 7d6a7d
	XPUSHs( gv ? (SV*)gv : &PL_sv_undef);
Packit 7d6a7d
Packit 7d6a7d
=tests plan => 7
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::GvSVn(), 1);
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::isGV_with_GP(), 2);
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::get_cvn_flags(), 3);
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
Packit 7d6a7d
Packit 7d6a7d
ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
Packit 7d6a7d
ok($::{sanity_check});