|
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 |
eval_pv
|
|
Packit |
7d6a7d |
eval_sv
|
|
Packit |
7d6a7d |
call_sv
|
|
Packit |
7d6a7d |
call_pv
|
|
Packit |
7d6a7d |
call_argv
|
|
Packit |
7d6a7d |
call_method
|
|
Packit |
7d6a7d |
load_module
|
|
Packit |
7d6a7d |
vload_module
|
|
Packit |
7d6a7d |
G_METHOD
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=implementation
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
/* Replace: 1 */
|
|
Packit |
7d6a7d |
__UNDEFINED__ call_sv perl_call_sv
|
|
Packit |
7d6a7d |
__UNDEFINED__ call_pv perl_call_pv
|
|
Packit |
7d6a7d |
__UNDEFINED__ call_argv perl_call_argv
|
|
Packit |
7d6a7d |
__UNDEFINED__ call_method perl_call_method
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ eval_sv perl_eval_sv
|
|
Packit |
7d6a7d |
/* Replace: 0 */
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ PERL_LOADMOD_DENY 0x1
|
|
Packit |
7d6a7d |
__UNDEFINED__ PERL_LOADMOD_NOIMPORT 0x2
|
|
Packit |
7d6a7d |
__UNDEFINED__ PERL_LOADMOD_IMPORT_OPS 0x4
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#ifndef G_METHOD
|
|
Packit |
7d6a7d |
# define G_METHOD 64
|
|
Packit |
7d6a7d |
# ifdef call_sv
|
|
Packit |
7d6a7d |
# undef call_sv
|
|
Packit |
7d6a7d |
# endif
|
|
Packit |
7d6a7d |
# if { VERSION < 5.6.0 }
|
|
Packit |
7d6a7d |
# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
|
|
Packit |
7d6a7d |
(flags) & ~G_METHOD) : perl_call_sv(sv, flags))
|
|
Packit |
7d6a7d |
# else
|
|
Packit |
7d6a7d |
# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
|
|
Packit |
7d6a7d |
(flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
|
|
Packit |
7d6a7d |
# endif
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
/* Replace perl_eval_pv with eval_pv */
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#ifndef eval_pv
|
|
Packit |
7d6a7d |
#if { NEED eval_pv }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
SV*
|
|
Packit |
7d6a7d |
eval_pv(char *p, I32 croak_on_error)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
dSP;
|
|
Packit |
7d6a7d |
SV* sv = newSVpv(p, 0);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
PUSHMARK(sp);
|
|
Packit |
7d6a7d |
eval_sv(sv, G_SCALAR);
|
|
Packit |
7d6a7d |
SvREFCNT_dec(sv);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
sv = POPs;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
if (croak_on_error && SvTRUE(GvSV(errgv)))
|
|
Packit |
7d6a7d |
croak(SvPVx(GvSV(errgv), na));
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
return sv;
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#ifndef vload_module
|
|
Packit |
7d6a7d |
#if { NEED vload_module }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
vload_module(U32 flags, SV *name, SV *ver, va_list *args)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
dTHR;
|
|
Packit |
7d6a7d |
dVAR;
|
|
Packit |
7d6a7d |
OP *veop, *imop;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
OP * const modname = newSVOP(OP_CONST, 0, name);
|
|
Packit |
7d6a7d |
/* 5.005 has a somewhat hacky force_normal that doesn't croak on
|
|
Packit |
7d6a7d |
SvREADONLY() if PL_compling is true. Current perls take care in
|
|
Packit |
7d6a7d |
ck_require() to correctly turn off SvREADONLY before calling
|
|
Packit |
7d6a7d |
force_normal_flags(). This seems a better fix than fudging PL_compling
|
|
Packit |
7d6a7d |
*/
|
|
Packit |
7d6a7d |
SvREADONLY_off(((SVOP*)modname)->op_sv);
|
|
Packit |
7d6a7d |
modname->op_private |= OPpCONST_BARE;
|
|
Packit |
7d6a7d |
if (ver) {
|
|
Packit |
7d6a7d |
veop = newSVOP(OP_CONST, 0, ver);
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
else
|
|
Packit |
7d6a7d |
veop = NULL;
|
|
Packit |
7d6a7d |
if (flags & PERL_LOADMOD_NOIMPORT) {
|
|
Packit |
7d6a7d |
imop = sawparens(newNULLLIST());
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
else if (flags & PERL_LOADMOD_IMPORT_OPS) {
|
|
Packit |
7d6a7d |
imop = va_arg(*args, OP*);
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
else {
|
|
Packit |
7d6a7d |
SV *sv;
|
|
Packit |
7d6a7d |
imop = NULL;
|
|
Packit |
7d6a7d |
sv = va_arg(*args, SV*);
|
|
Packit |
7d6a7d |
while (sv) {
|
|
Packit |
7d6a7d |
imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
|
|
Packit |
7d6a7d |
sv = va_arg(*args, SV*);
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
const line_t ocopline = PL_copline;
|
|
Packit |
7d6a7d |
COP * const ocurcop = PL_curcop;
|
|
Packit |
7d6a7d |
const int oexpect = PL_expect;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#if { VERSION >= 5.004 }
|
|
Packit |
7d6a7d |
utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
|
|
Packit |
7d6a7d |
veop, modname, imop);
|
|
Packit |
7d6a7d |
#elif { VERSION > 5.003 }
|
|
Packit |
7d6a7d |
utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
|
|
Packit |
7d6a7d |
veop, modname, imop);
|
|
Packit |
7d6a7d |
#else
|
|
Packit |
7d6a7d |
utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
|
|
Packit |
7d6a7d |
modname, imop);
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
PL_expect = oexpect;
|
|
Packit |
7d6a7d |
PL_copline = ocopline;
|
|
Packit |
7d6a7d |
PL_curcop = ocurcop;
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#ifndef load_module
|
|
Packit |
7d6a7d |
#if { NEED load_module }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
load_module(U32 flags, SV *name, SV *ver, ...)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
va_list args;
|
|
Packit |
7d6a7d |
va_start(args, ver);
|
|
Packit |
7d6a7d |
vload_module(flags, name, ver, &args);
|
|
Packit |
7d6a7d |
va_end(args);
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsinit
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#define NEED_eval_pv
|
|
Packit |
7d6a7d |
#define NEED_load_module
|
|
Packit |
7d6a7d |
#define NEED_vload_module
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsubs
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
I32
|
|
Packit |
7d6a7d |
G_SCALAR()
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = G_SCALAR;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
I32
|
|
Packit |
7d6a7d |
G_ARRAY()
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = G_ARRAY;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
I32
|
|
Packit |
7d6a7d |
G_DISCARD()
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = G_DISCARD;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
eval_sv(sv, flags)
|
|
Packit |
7d6a7d |
SV* sv
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = eval_sv(sv, flags);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
eval_pv(p, croak_on_error)
|
|
Packit |
7d6a7d |
char* p
|
|
Packit |
7d6a7d |
I32 croak_on_error
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
PUSHs(eval_pv(p, croak_on_error));
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
call_sv(sv, flags, ...)
|
|
Packit |
7d6a7d |
SV* sv
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
for (i=0; i
|
|
Packit |
7d6a7d |
ST(i) = ST(i+2); /* pop first two args */
|
|
Packit |
7d6a7d |
PUSHMARK(SP);
|
|
Packit |
7d6a7d |
SP += items - 2;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = call_sv(sv, flags);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
call_pv(subname, flags, ...)
|
|
Packit |
7d6a7d |
char* subname
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
for (i=0; i
|
|
Packit |
7d6a7d |
ST(i) = ST(i+2); /* pop first two args */
|
|
Packit |
7d6a7d |
PUSHMARK(SP);
|
|
Packit |
7d6a7d |
SP += items - 2;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = call_pv(subname, flags);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
call_argv(subname, flags, ...)
|
|
Packit |
7d6a7d |
char* subname
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
char *args[8];
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
if (items > 8) /* play safe */
|
|
Packit |
7d6a7d |
XSRETURN_UNDEF;
|
|
Packit |
7d6a7d |
for (i=2; i
|
|
Packit |
7d6a7d |
args[i-2] = SvPV_nolen(ST(i));
|
|
Packit |
7d6a7d |
args[items-2] = NULL;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = call_argv(subname, flags, args);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
call_method(methname, flags, ...)
|
|
Packit |
7d6a7d |
char* methname
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
for (i=0; i
|
|
Packit |
7d6a7d |
ST(i) = ST(i+2); /* pop first two args */
|
|
Packit |
7d6a7d |
PUSHMARK(SP);
|
|
Packit |
7d6a7d |
SP += items - 2;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = call_method(methname, flags);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
call_sv_G_METHOD(sv, flags, ...)
|
|
Packit |
7d6a7d |
SV* sv
|
|
Packit |
7d6a7d |
I32 flags
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
I32 i;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
for (i=0; i
|
|
Packit |
7d6a7d |
ST(i) = ST(i+2); /* pop first two args */
|
|
Packit |
7d6a7d |
PUSHMARK(SP);
|
|
Packit |
7d6a7d |
SP += items - 2;
|
|
Packit |
7d6a7d |
PUTBACK;
|
|
Packit |
7d6a7d |
i = call_sv(sv, flags | G_METHOD);
|
|
Packit |
7d6a7d |
SPAGAIN;
|
|
Packit |
7d6a7d |
EXTEND(SP, 1);
|
|
Packit |
7d6a7d |
mPUSHi(i);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
load_module(flags, name, version, ...)
|
|
Packit |
7d6a7d |
U32 flags
|
|
Packit |
7d6a7d |
SV *name
|
|
Packit |
7d6a7d |
SV *version
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
/* Both SV parameters are donated to the ops built inside
|
|
Packit |
7d6a7d |
load_module, so we need to bump the refcounts. */
|
|
Packit |
7d6a7d |
Perl_load_module(aTHX_ flags, SvREFCNT_inc_simple(name),
|
|
Packit |
7d6a7d |
SvREFCNT_inc_simple(version), NULL);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=tests plan => 52
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
sub eq_array
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
my($a, $b) = @_;
|
|
Packit |
7d6a7d |
join(':', @$a) eq join(':', @$b);
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
sub f
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
shift;
|
|
Packit |
7d6a7d |
unshift @_, 'b';
|
|
Packit |
7d6a7d |
pop @_;
|
|
Packit |
7d6a7d |
@_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my $obj = bless [], 'Foo';
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
sub Foo::meth
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
return 'bad_self' unless @_ && ref $_[0] && ref($_[0]) eq 'Foo';
|
|
Packit |
7d6a7d |
shift;
|
|
Packit |
7d6a7d |
shift;
|
|
Packit |
7d6a7d |
unshift @_, 'b';
|
|
Packit |
7d6a7d |
pop @_;
|
|
Packit |
7d6a7d |
@_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my $test;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
for $test (
|
|
Packit |
7d6a7d |
# flags args expected description
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_SCALAR, [ ], [ qw(y 1) ], '0 args, G_SCALAR' ],
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_SCALAR, [ qw(a p q) ], [ qw(y 1) ], '3 args, G_SCALAR' ],
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_ARRAY, [ ], [ qw(x 1) ], '0 args, G_ARRAY' ],
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_ARRAY, [ qw(a p q) ], [ qw(b p x 3) ], '3 args, G_ARRAY' ],
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_DISCARD, [ ], [ qw(0) ], '0 args, G_DISCARD' ],
|
|
Packit |
7d6a7d |
[ &Devel::PPPort::G_DISCARD, [ qw(a p q) ], [ qw(0) ], '3 args, G_DISCARD' ],
|
|
Packit |
7d6a7d |
)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
my ($flags, $args, $expected, $description) = @$test;
|
|
Packit |
7d6a7d |
print "# --- $description ---\n";
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_sv(\&f, $flags, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_sv(*f, $flags, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_sv('f', $flags, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_pv('f', $flags, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_argv('f', $flags, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::eval_sv("f(qw(@$args))", $flags) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_method('meth', $flags, $obj, @$args) ], $expected));
|
|
Packit |
7d6a7d |
ok(eq_array( [ &Devel::PPPort::call_sv_G_METHOD('meth', $flags, $obj, @$args) ], $expected));
|
|
Packit |
7d6a7d |
};
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
ok(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
|
|
Packit |
7d6a7d |
Devel::PPPort::load_module(0, "less", undef);
|
|
Packit |
7d6a7d |
ok(defined $::{'less::'}, 1, "Have now loaded less");
|