|
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);
|