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 145759b3d2Safresh1newCONSTSUB 155759b3d2Safresh1 16de8cc8edSafresh1=dontwarn 17de8cc8edSafresh1 18de8cc8edSafresh1NEED_newCONSTSUB /* Because we define this weirdly */ 19de8cc8edSafresh1 205759b3d2Safresh1=implementation 215759b3d2Safresh1 225759b3d2Safresh1/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ 235759b3d2Safresh1#if { VERSION < 5.004_63 } && { VERSION != 5.004_05 } 24de8cc8edSafresh1 25de8cc8edSafresh1/* And before that, we need to make sure this gets compiled for the functions 26de8cc8edSafresh1 * that rely on it */ 27de8cc8edSafresh1#define NEED_newCONSTSUB 28de8cc8edSafresh1 295759b3d2Safresh1#if { NEED newCONSTSUB } 305759b3d2Safresh1 315759b3d2Safresh1/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ 325759b3d2Safresh1/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ 335759b3d2Safresh1#define D_PPP_PL_copline PL_copline 345759b3d2Safresh1 35*9a4edab6SbluhmCV * 365759b3d2Safresh1newCONSTSUB(HV *stash, const char *name, SV *sv) 375759b3d2Safresh1{ 38*9a4edab6Sbluhm CV *cv; 395759b3d2Safresh1 U32 oldhints = PL_hints; 405759b3d2Safresh1 HV *old_cop_stash = PL_curcop->cop_stash; 415759b3d2Safresh1 HV *old_curstash = PL_curstash; 425759b3d2Safresh1 line_t oldline = PL_curcop->cop_line; 435759b3d2Safresh1 PL_curcop->cop_line = D_PPP_PL_copline; 445759b3d2Safresh1 455759b3d2Safresh1 PL_hints &= ~HINT_BLOCK_SCOPE; 465759b3d2Safresh1 if (stash) 475759b3d2Safresh1 PL_curstash = PL_curcop->cop_stash = stash; 485759b3d2Safresh1 49*9a4edab6Sbluhm cv = newSUB( 505759b3d2Safresh1 515759b3d2Safresh1 start_subparse(FALSE, 0), 525759b3d2Safresh1 535759b3d2Safresh1 newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), 545759b3d2Safresh1 newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ 555759b3d2Safresh1 newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) 565759b3d2Safresh1 ); 575759b3d2Safresh1 585759b3d2Safresh1 PL_hints = oldhints; 595759b3d2Safresh1 PL_curcop->cop_stash = old_cop_stash; 605759b3d2Safresh1 PL_curstash = old_curstash; 615759b3d2Safresh1 PL_curcop->cop_line = oldline; 62*9a4edab6Sbluhm 63*9a4edab6Sbluhm return cv; 645759b3d2Safresh1} 655759b3d2Safresh1#endif 665759b3d2Safresh1#endif 675759b3d2Safresh1 685759b3d2Safresh1=xsinit 695759b3d2Safresh1 705759b3d2Safresh1#define NEED_newCONSTSUB 715759b3d2Safresh1 725759b3d2Safresh1=xsmisc 735759b3d2Safresh1 745759b3d2Safresh1void call_newCONSTSUB_1(void) 755759b3d2Safresh1{ 765759b3d2Safresh1#ifdef PERL_NO_GET_CONTEXT 775759b3d2Safresh1 dTHX; 785759b3d2Safresh1#endif 795759b3d2Safresh1 newCONSTSUB(gv_stashpv("Devel::PPPort", FALSE), "test_value_1", newSViv(1)); 805759b3d2Safresh1} 815759b3d2Safresh1 825759b3d2Safresh1extern void call_newCONSTSUB_2(void); 835759b3d2Safresh1extern void call_newCONSTSUB_3(void); 845759b3d2Safresh1 855759b3d2Safresh1=xsubs 865759b3d2Safresh1 875759b3d2Safresh1void 885759b3d2Safresh1call_newCONSTSUB_1() 895759b3d2Safresh1 905759b3d2Safresh1void 915759b3d2Safresh1call_newCONSTSUB_2() 925759b3d2Safresh1 935759b3d2Safresh1void 945759b3d2Safresh1call_newCONSTSUB_3() 955759b3d2Safresh1 965759b3d2Safresh1=tests plan => 3 975759b3d2Safresh1 985759b3d2Safresh1&Devel::PPPort::call_newCONSTSUB_1(); 99de8cc8edSafresh1is(&Devel::PPPort::test_value_1(), 1); 1005759b3d2Safresh1 1015759b3d2Safresh1&Devel::PPPort::call_newCONSTSUB_2(); 102de8cc8edSafresh1is(&Devel::PPPort::test_value_2(), 2); 1035759b3d2Safresh1 1045759b3d2Safresh1&Devel::PPPort::call_newCONSTSUB_3(); 105de8cc8edSafresh1is(&Devel::PPPort::test_value_3(), 3); 106