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