|
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 |
__UNDEFINED__
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=implementation
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvMAGIC_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
|
|
Packit |
7d6a7d |
(((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#if { VERSION < 5.9.3 }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvPVX_const(sv) ((const char*) (0 + SvPVX(sv)))
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvPVX_mutable(sv) (0 + SvPVX(sv))
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvRV_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
|
|
Packit |
7d6a7d |
(((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#else
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvRV_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
|
|
Packit |
7d6a7d |
((sv)->sv_u.svu_rv = (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvSTASH_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
|
|
Packit |
7d6a7d |
(((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#if { VERSION < 5.004 }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvUV_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
|
|
Packit |
7d6a7d |
(((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#else
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvUV_set(sv, val) \
|
|
Packit |
7d6a7d |
STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
|
|
Packit |
7d6a7d |
(((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsubs
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
IV
|
|
Packit |
7d6a7d |
TestSvUV_set(sv, val)
|
|
Packit |
7d6a7d |
SV *sv
|
|
Packit |
7d6a7d |
UV val
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
SvUV_set(sv, val);
|
|
Packit |
7d6a7d |
RETVAL = SvUVX(sv) == val ? 42 : -1;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
IV
|
|
Packit |
7d6a7d |
TestSvPVX_const(sv)
|
|
Packit |
7d6a7d |
SV *sv
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = strEQ(SvPVX_const(sv), "mhx") ? 43 : -1;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
IV
|
|
Packit |
7d6a7d |
TestSvPVX_mutable(sv)
|
|
Packit |
7d6a7d |
SV *sv
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = strEQ(SvPVX_mutable(sv), "mhx") ? 44 : -1;
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
TestSvSTASH_set(sv, name)
|
|
Packit |
7d6a7d |
SV *sv
|
|
Packit |
7d6a7d |
char *name
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
sv = SvRV(sv);
|
|
Packit |
7d6a7d |
SvREFCNT_dec(SvSTASH(sv));
|
|
Packit |
7d6a7d |
SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=tests plan => 5
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my $foo = 5;
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my $bar = [];
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
bless $bar, 'foo';
|
|
Packit |
7d6a7d |
ok($bar->x(), 'foobar');
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
Devel::PPPort::TestSvSTASH_set($bar, 'bar');
|
|
Packit |
7d6a7d |
ok($bar->x(), 'hacker');
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
package foo;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
sub x { 'foobar' }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
package bar;
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
sub x { 'hacker' }
|