The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
################################################################################
##
##  $Revision: 11 $
##  $Author: mhx $
##  $Date: 2009/01/18 14:10:54 +0100 $
##
################################################################################
##
##  Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
##  Version 2.x, Copyright (C) 2001, Paul Marquess.
##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
##
##  This program is free software; you can redistribute it and/or
##  modify it under the same terms as Perl itself.
##
################################################################################

=provides

__UNDEFINED__

=implementation

__UNDEFINED__  mPUSHs(s)	PUSHs(sv_2mortal(s))
__UNDEFINED__  PUSHmortal	PUSHs(sv_newmortal())
__UNDEFINED__  mPUSHp(p,l)	sv_setpvn(PUSHmortal, (p), (l))
__UNDEFINED__  mPUSHn(n)	sv_setnv(PUSHmortal, (NV)(n))
__UNDEFINED__  mPUSHi(i)	sv_setiv(PUSHmortal, (IV)(i))
__UNDEFINED__  mPUSHu(u)	sv_setuv(PUSHmortal, (UV)(u))

__UNDEFINED__  mXPUSHs(s)	XPUSHs(sv_2mortal(s))
__UNDEFINED__  XPUSHmortal	XPUSHs(sv_newmortal())
__UNDEFINED__  mXPUSHp(p,l)	STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
__UNDEFINED__  mXPUSHn(n)	STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
__UNDEFINED__  mXPUSHi(i)	STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
__UNDEFINED__  mXPUSHu(u)	STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END

=xsubs

void
mPUSHs()
	PPCODE:
	EXTEND(SP, 3);
	mPUSHs(newSVpv("foo", 0));
	mPUSHs(newSVpv("bar13", 3));
	mPUSHs(newSViv(42));
	XSRETURN(3);

void
mPUSHp()
	PPCODE:
	EXTEND(SP, 3);
	mPUSHp("one", 3);
	mPUSHp("two", 3);
	mPUSHp("three", 5);
	XSRETURN(3);

void
mPUSHn()
	PPCODE:
	EXTEND(SP, 3);
	mPUSHn(0.5);
	mPUSHn(-0.25);
	mPUSHn(0.125);
	XSRETURN(3);

void
mPUSHi()
	PPCODE:
	EXTEND(SP, 3);
	mPUSHi(-1);
	mPUSHi(2);
	mPUSHi(-3);
	XSRETURN(3);

void
mPUSHu()
	PPCODE:
	EXTEND(SP, 3);
	mPUSHu(1);
	mPUSHu(2);
	mPUSHu(3);
	XSRETURN(3);

void
mXPUSHs()
	PPCODE:
	mXPUSHs(newSVpv("foo", 0));
	mXPUSHs(newSVpv("bar13", 3));
	mXPUSHs(newSViv(42));
	XSRETURN(3);

void
mXPUSHp()
	PPCODE:
	mXPUSHp("one", 3);
	mXPUSHp("two", 3);
	mXPUSHp("three", 5);
	XSRETURN(3);

void
mXPUSHn()
	PPCODE:
	mXPUSHn(0.5);
	mXPUSHn(-0.25);
	mXPUSHn(0.125);
	XSRETURN(3);

void
mXPUSHi()
	PPCODE:
	mXPUSHi(-1);
	mXPUSHi(2);
	mXPUSHi(-3);
	XSRETURN(3);

void
mXPUSHu()
	PPCODE:
	mXPUSHu(1);
	mXPUSHu(2);
	mXPUSHu(3);
	XSRETURN(3);

=tests plan => 10

ok(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
ok(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
ok(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
ok(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
ok(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");

ok(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
ok(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
ok(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
ok(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
ok(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");