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
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
24#    define SvREFCNT_inc(sv)            \
25      ({                                \
26          SV * const _sv = (SV*)(sv);   \
27          if (_sv)                      \
28               (SvREFCNT(_sv))++;       \
29          _sv;                          \
30      })
31#  else
32#    define SvREFCNT_inc(sv)    \
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
39#    define SvREFCNT_inc_simple(sv)     \
40      ({                                        \
41          if (sv)                               \
42               (SvREFCNT(sv))++;                \
43          (SV *)(sv);                           \
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
53#    define SvREFCNT_inc_NN(sv)         \
54      ({                                        \
55          SV * const _sv = (SV*)(sv);   \
56          SvREFCNT(_sv)++;              \
57          _sv;                          \
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
67#    define SvREFCNT_inc_void(sv)               \
68      ({                                        \
69          SV * const _sv = (SV*)(sv);   \
70          if (_sv)                      \
71              (void)(SvREFCNT(_sv)++);  \
72      })
73#  else
74#    define SvREFCNT_inc_void(sv) \
75          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
76#  endif
77#endif
78
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)))
83
84=xsubs
85
86void
87SvREFCNT()
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);
117                XSRETURN(14);
118
119=tests plan => 14
120
121for (Devel::PPPort::SvREFCNT()) {
122  ok(defined $_ and $_);
123}
124