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