Blame parts/inc/newCONSTSUB

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
newCONSTSUB
Packit 7d6a7d
Packit 7d6a7d
=implementation
Packit 7d6a7d
Packit 7d6a7d
/* Hint: newCONSTSUB
Packit 7d6a7d
 * Returns a CV* as of perl-5.7.1. This return value is not supported
Packit 7d6a7d
 * by Devel::PPPort.
Packit 7d6a7d
 */
Packit 7d6a7d
Packit 7d6a7d
/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
Packit 7d6a7d
#if { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
Packit 7d6a7d
#if { NEED newCONSTSUB }
Packit 7d6a7d
Packit 7d6a7d
/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
Packit 7d6a7d
/* (There's no PL_parser in perl < 5.005, so this is completely safe)     */
Packit 7d6a7d
#define D_PPP_PL_copline PL_copline
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
newCONSTSUB(HV *stash, const char *name, SV *sv)
Packit 7d6a7d
{
Packit 7d6a7d
        U32 oldhints = PL_hints;
Packit 7d6a7d
        HV *old_cop_stash = PL_curcop->cop_stash;
Packit 7d6a7d
        HV *old_curstash = PL_curstash;
Packit 7d6a7d
        line_t oldline = PL_curcop->cop_line;
Packit 7d6a7d
        PL_curcop->cop_line = D_PPP_PL_copline;
Packit 7d6a7d
Packit 7d6a7d
        PL_hints &= ~HINT_BLOCK_SCOPE;
Packit 7d6a7d
        if (stash)
Packit 7d6a7d
                PL_curstash = PL_curcop->cop_stash = stash;
Packit 7d6a7d
Packit 7d6a7d
        newSUB(
Packit 7d6a7d
Packit 7d6a7d
#if   { VERSION <  5.003_22 }
Packit 7d6a7d
                start_subparse(),
Packit 7d6a7d
#elif { VERSION == 5.003_22 }
Packit 7d6a7d
                start_subparse(0),
Packit 7d6a7d
#else  /* 5.003_23  onwards */
Packit 7d6a7d
                start_subparse(FALSE, 0),
Packit 7d6a7d
#endif
Packit 7d6a7d
Packit 7d6a7d
                newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
Packit 7d6a7d
                newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
Packit 7d6a7d
                newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
Packit 7d6a7d
        );
Packit 7d6a7d
Packit 7d6a7d
        PL_hints = oldhints;
Packit 7d6a7d
        PL_curcop->cop_stash = old_cop_stash;
Packit 7d6a7d
        PL_curstash = old_curstash;
Packit 7d6a7d
        PL_curcop->cop_line = oldline;
Packit 7d6a7d
}
Packit 7d6a7d
#endif
Packit 7d6a7d
#endif
Packit 7d6a7d
Packit 7d6a7d
=xsinit
Packit 7d6a7d
Packit 7d6a7d
#define NEED_newCONSTSUB
Packit 7d6a7d
Packit 7d6a7d
=xsmisc
Packit 7d6a7d
Packit 7d6a7d
void call_newCONSTSUB_1(void)
Packit 7d6a7d
{
Packit 7d6a7d
#ifdef PERL_NO_GET_CONTEXT
Packit 7d6a7d
        dTHX;
Packit 7d6a7d
#endif
Packit 7d6a7d
        newCONSTSUB(gv_stashpv("Devel::PPPort", FALSE), "test_value_1", newSViv(1));
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
extern void call_newCONSTSUB_2(void);
Packit 7d6a7d
extern void call_newCONSTSUB_3(void);
Packit 7d6a7d
Packit 7d6a7d
=xsubs
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
call_newCONSTSUB_1()
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
call_newCONSTSUB_2()
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
call_newCONSTSUB_3()
Packit 7d6a7d
Packit 7d6a7d
=tests plan => 3
Packit 7d6a7d
Packit 7d6a7d
&Devel::PPPort::call_newCONSTSUB_1();
Packit 7d6a7d
ok(&Devel::PPPort::test_value_1(), 1);
Packit 7d6a7d
Packit 7d6a7d
&Devel::PPPort::call_newCONSTSUB_2();
Packit 7d6a7d
ok(&Devel::PPPort::test_value_2(), 2);
Packit 7d6a7d
Packit 7d6a7d
&Devel::PPPort::call_newCONSTSUB_3();
Packit 7d6a7d
ok(&Devel::PPPort::test_value_3(), 3);