1################################################################################
2##
3##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
4##  Version 2.x, Copyright (C) 2001, Paul Marquess.
5##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
6##
7##  This program is free software; you can redistribute it and/or
8##  modify it under the same terms as Perl itself.
9##
10################################################################################
11
12=provides
13
14__UNDEFINED__
15
16=implementation
17
18__UNDEFINED__  mPUSHs(s)        PUSHs(sv_2mortal(s))
19__UNDEFINED__  PUSHmortal       PUSHs(sv_newmortal())
20__UNDEFINED__  mPUSHp(p,l)      sv_setpvn(PUSHmortal, (p), (l))
21__UNDEFINED__  mPUSHn(n)        sv_setnv(PUSHmortal, (NV)(n))
22__UNDEFINED__  mPUSHi(i)        sv_setiv(PUSHmortal, (IV)(i))
23__UNDEFINED__  mPUSHu(u)        sv_setuv(PUSHmortal, (UV)(u))
24
25__UNDEFINED__  mXPUSHs(s)       XPUSHs(sv_2mortal(s))
26__UNDEFINED__  XPUSHmortal      XPUSHs(sv_newmortal())
27__UNDEFINED__  mXPUSHp(p,l)     STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
28__UNDEFINED__  mXPUSHn(n)       STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
29__UNDEFINED__  mXPUSHi(i)       STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
30__UNDEFINED__  mXPUSHu(u)       STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
31
32=xsubs
33
34void
35mPUSHs()
36        PPCODE:
37        EXTEND(SP, 3);
38        mPUSHs(newSVpv("foo", 0));
39        mPUSHs(newSVpv("bar13", 3));
40        mPUSHs(newSViv(42));
41        XSRETURN(3);
42
43void
44mPUSHp()
45        PPCODE:
46        EXTEND(SP, 3);
47        mPUSHp("one", 3);
48        mPUSHp("two", 3);
49        mPUSHp("three", 5);
50        XSRETURN(3);
51
52void
53mPUSHn()
54        PPCODE:
55        EXTEND(SP, 3);
56        mPUSHn(0.5);
57        mPUSHn(-0.25);
58        mPUSHn(0.125);
59        XSRETURN(3);
60
61void
62mPUSHi()
63        PPCODE:
64        EXTEND(SP, 3);
65        mPUSHi(-1);
66        mPUSHi(2);
67        mPUSHi(-3);
68        XSRETURN(3);
69
70void
71mPUSHu()
72        PPCODE:
73        EXTEND(SP, 3);
74        mPUSHu(1);
75        mPUSHu(2);
76        mPUSHu(3);
77        XSRETURN(3);
78
79void
80mXPUSHs()
81        PPCODE:
82        mXPUSHs(newSVpv("foo", 0));
83        mXPUSHs(newSVpv("bar13", 3));
84        mXPUSHs(newSViv(42));
85        XSRETURN(3);
86
87void
88mXPUSHp()
89        PPCODE:
90        mXPUSHp("one", 3);
91        mXPUSHp("two", 3);
92        mXPUSHp("three", 5);
93        XSRETURN(3);
94
95void
96mXPUSHn()
97        PPCODE:
98        mXPUSHn(0.5);
99        mXPUSHn(-0.25);
100        mXPUSHn(0.125);
101        XSRETURN(3);
102
103void
104mXPUSHi()
105        PPCODE:
106        mXPUSHi(-1);
107        mXPUSHi(2);
108        mXPUSHi(-3);
109        XSRETURN(3);
110
111void
112mXPUSHu()
113        PPCODE:
114        mXPUSHu(1);
115        mXPUSHu(2);
116        mXPUSHu(3);
117        XSRETURN(3);
118
119=tests plan => 10
120
121is(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
122is(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
123is(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
124is(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
125is(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
126
127is(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
128is(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
129is(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
130is(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
131is(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
132