This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Devel-PPPort to match 3.67
[perl5.git] / dist / Devel-PPPort / parts / inc / SvREFCNT
CommitLineData
c07deaaf
MHM
1################################################################################
2##
b2049988 3## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
c07deaaf
MHM
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
14SvREFCNT_inc
15SvREFCNT_inc_simple
16SvREFCNT_inc_NN
17SvREFCNT_inc_void
18__UNDEFINED__
19
20=implementation
21
22#ifndef SvREFCNT_inc
23# ifdef PERL_USE_GCC_BRACE_GROUPS
b2049988
MHM
24# define SvREFCNT_inc(sv) \
25 ({ \
26 SV * const _sv = (SV*)(sv); \
27 if (_sv) \
28 (SvREFCNT(_sv))++; \
29 _sv; \
c07deaaf
MHM
30 })
31# else
b2049988 32# define SvREFCNT_inc(sv) \
c07deaaf
MHM
33 ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
34# endif
35#endif
36
37#ifndef SvREFCNT_inc_simple
38# ifdef PERL_USE_GCC_BRACE_GROUPS
b2049988
MHM
39# define SvREFCNT_inc_simple(sv) \
40 ({ \
41 if (sv) \
42 (SvREFCNT(sv))++; \
43 (SV *)(sv); \
c07deaaf
MHM
44 })
45# else
46# define SvREFCNT_inc_simple(sv) \
47 ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
48# endif
49#endif
50
51#ifndef SvREFCNT_inc_NN
52# ifdef PERL_USE_GCC_BRACE_GROUPS
b2049988
MHM
53# define SvREFCNT_inc_NN(sv) \
54 ({ \
55 SV * const _sv = (SV*)(sv); \
56 SvREFCNT(_sv)++; \
57 _sv; \
c07deaaf
MHM
58 })
59# else
60# define SvREFCNT_inc_NN(sv) \
61 (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
62# endif
63#endif
64
65#ifndef SvREFCNT_inc_void
66# ifdef PERL_USE_GCC_BRACE_GROUPS
b2049988
MHM
67# define SvREFCNT_inc_void(sv) \
68 ({ \
69 SV * const _sv = (SV*)(sv); \
70 if (_sv) \
71 (void)(SvREFCNT(_sv)++); \
c07deaaf
MHM
72 })
73# else
74# define SvREFCNT_inc_void(sv) \
75 (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
76# endif
77#endif
78
b2049988
MHM
79__UNDEFINED__ SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
80__UNDEFINED__ SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv))
81__UNDEFINED__ SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
82__UNDEFINED__ SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
c07deaaf
MHM
83
84=xsubs
85
86void
87SvREFCNT()
b2049988
MHM
88 PREINIT:
89 SV *sv, *svr;
90 PPCODE:
91 sv = newSV(0);
92 mXPUSHi(SvREFCNT(sv) == 1);
93 svr = SvREFCNT_inc(sv);
94 mXPUSHi(sv == svr);
95 mXPUSHi(SvREFCNT(sv) == 2);
96 svr = SvREFCNT_inc_simple(sv);
97 mXPUSHi(sv == svr);
98 mXPUSHi(SvREFCNT(sv) == 3);
99 svr = SvREFCNT_inc_NN(sv);
100 mXPUSHi(sv == svr);
101 mXPUSHi(SvREFCNT(sv) == 4);
102 svr = SvREFCNT_inc_simple_NN(sv);
103 mXPUSHi(sv == svr);
104 mXPUSHi(SvREFCNT(sv) == 5);
105 SvREFCNT_inc_void(sv);
106 mXPUSHi(SvREFCNT(sv) == 6);
107 SvREFCNT_inc_simple_void(sv);
108 mXPUSHi(SvREFCNT(sv) == 7);
109 SvREFCNT_inc_void_NN(sv);
110 mXPUSHi(SvREFCNT(sv) == 8);
111 SvREFCNT_inc_simple_void_NN(sv);
112 mXPUSHi(SvREFCNT(sv) == 9);
113 while (SvREFCNT(sv) > 1)
114 SvREFCNT_dec(sv);
115 mXPUSHi(SvREFCNT(sv) == 1);
116 SvREFCNT_dec(sv);
f001cc46 117 XSRETURN(14);
c07deaaf 118
f001cc46 119=tests plan => 14
c07deaaf
MHM
120
121for (Devel::PPPort::SvREFCNT()) {
122 ok(defined $_ and $_);
123}