Re: [PATCH] Optimize split //
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / parts / inc / uv
CommitLineData
adfe19db 1################################################################################
2##
d2dacc4f 3## $Revision: 13 $
adfe19db 4## $Author: mhx $
d2dacc4f 5## $Date: 2007/01/02 12:32:33 +0100 $
adfe19db 6##
7################################################################################
8##
d2dacc4f 9## Version 3.x, Copyright (C) 2004-2007, Marcus Holland-Moritz.
adfe19db 10## Version 2.x, Copyright (C) 2001, Paul Marquess.
11## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
12##
13## This program is free software; you can redistribute it and/or
14## modify it under the same terms as Perl itself.
15##
16################################################################################
17
18=provides
19
adfe19db 20__UNDEFINED__
21
22=implementation
23
0d0f8426 24__UNDEFINED__ sv_setuv(sv, uv) \
25 STMT_START { \
26 UV TeMpUv = uv; \
27 if (TeMpUv <= IV_MAX) \
28 sv_setiv(sv, TeMpUv); \
29 else \
30 sv_setnv(sv, (double)TeMpUv); \
31 } STMT_END
32
33__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
adfe19db 34
35__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
36__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
37__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
38__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
39__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
40
41/* Hint: sv_uv
42 * Always use the SvUVx() macro instead of sv_uv().
43 */
44__UNDEFINED__ sv_uv(sv) SvUVx(sv)
45
46__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
47__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
48
96ad942f 49__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
50__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
51
adfe19db 52=xsubs
53
54SV *
55sv_setuv(uv)
56 UV uv
57 CODE:
58 RETVAL = newSViv(1);
59 sv_setuv(RETVAL, uv);
60 OUTPUT:
61 RETVAL
62
63SV *
64newSVuv(uv)
65 UV uv
66 CODE:
67 RETVAL = newSVuv(uv);
68 OUTPUT:
69 RETVAL
70
71UV
72sv_2uv(sv)
73 SV *sv
74 CODE:
75 RETVAL = sv_2uv(sv);
76 OUTPUT:
77 RETVAL
78
79UV
80SvUVx(sv)
81 SV *sv
82 CODE:
83 sv--;
84 RETVAL = SvUVx(++sv);
85 OUTPUT:
86 RETVAL
87
88void
89XSRETURN_UV()
90 PPCODE:
91 XSRETURN_UV(42);
92
96ad942f 93void
94PUSHu()
95 PREINIT:
96 dTARG;
97 PPCODE:
98 TARG = sv_newmortal();
99 EXTEND(SP, 1);
100 PUSHu(42);
101 XSRETURN(1);
102
103void
104XPUSHu()
105 PREINIT:
106 dTARG;
107 PPCODE:
108 TARG = sv_newmortal();
109 XPUSHu(43);
110 XSRETURN(1);
111
112=tests plan => 10
adfe19db 113
114ok(&Devel::PPPort::sv_setuv(42), 42);
115ok(&Devel::PPPort::newSVuv(123), 123);
116ok(&Devel::PPPort::sv_2uv("4711"), 4711);
117ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
118ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
119ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
120ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
121ok(&Devel::PPPort::XSRETURN_UV(), 42);
96ad942f 122ok(&Devel::PPPort::PUSHu(), 42);
123ok(&Devel::PPPort::XPUSHu(), 43);
adfe19db 124