This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Devel::PPPort 3.15
[perl5.git] / ext / Devel / PPPort / parts / inc / uv
CommitLineData
adfe19db
MHM
1################################################################################
2##
51d6c659 3## $Revision: 17 $
adfe19db 4## $Author: mhx $
51d6c659 5## $Date: 2009/01/18 14:10:54 +0100 $
adfe19db
MHM
6##
7################################################################################
8##
51d6c659 9## Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
adfe19db
MHM
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__
679ad62d 21SvUOK
adfe19db
MHM
22
23=implementation
24
0d0f8426
MHM
25__UNDEFINED__ sv_setuv(sv, uv) \
26 STMT_START { \
27 UV TeMpUv = uv; \
28 if (TeMpUv <= IV_MAX) \
29 sv_setiv(sv, TeMpUv); \
30 else \
31 sv_setnv(sv, (double)TeMpUv); \
32 } STMT_END
33
34__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
adfe19db
MHM
35
36__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
37__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
38__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
39__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
40__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
41
42/* Hint: sv_uv
43 * Always use the SvUVx() macro instead of sv_uv().
44 */
45__UNDEFINED__ sv_uv(sv) SvUVx(sv)
46
679ad62d
MHM
47#if !defined(SvUOK) && defined(SvIOK_UV)
48# define SvUOK(sv) SvIOK_UV(sv)
49#endif
50
adfe19db
MHM
51__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
52__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
53
96ad942f
MHM
54__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
55__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
56
adfe19db
MHM
57=xsubs
58
59SV *
60sv_setuv(uv)
61 UV uv
62 CODE:
63 RETVAL = newSViv(1);
64 sv_setuv(RETVAL, uv);
65 OUTPUT:
66 RETVAL
67
68SV *
69newSVuv(uv)
70 UV uv
71 CODE:
72 RETVAL = newSVuv(uv);
73 OUTPUT:
74 RETVAL
75
76UV
77sv_2uv(sv)
78 SV *sv
79 CODE:
80 RETVAL = sv_2uv(sv);
81 OUTPUT:
82 RETVAL
83
84UV
85SvUVx(sv)
86 SV *sv
87 CODE:
88 sv--;
89 RETVAL = SvUVx(++sv);
90 OUTPUT:
91 RETVAL
92
93void
94XSRETURN_UV()
95 PPCODE:
96 XSRETURN_UV(42);
97
96ad942f
MHM
98void
99PUSHu()
100 PREINIT:
101 dTARG;
102 PPCODE:
103 TARG = sv_newmortal();
104 EXTEND(SP, 1);
105 PUSHu(42);
106 XSRETURN(1);
107
108void
109XPUSHu()
110 PREINIT:
111 dTARG;
112 PPCODE:
113 TARG = sv_newmortal();
114 XPUSHu(43);
115 XSRETURN(1);
116
117=tests plan => 10
adfe19db
MHM
118
119ok(&Devel::PPPort::sv_setuv(42), 42);
120ok(&Devel::PPPort::newSVuv(123), 123);
121ok(&Devel::PPPort::sv_2uv("4711"), 4711);
122ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
123ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
124ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
125ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
126ok(&Devel::PPPort::XSRETURN_UV(), 42);
96ad942f
MHM
127ok(&Devel::PPPort::PUSHu(), 42);
128ok(&Devel::PPPort::XPUSHu(), 43);
adfe19db 129