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