Commit | Line | Data |
---|---|---|
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 | ||
14 | SvREFCNT_inc | |
15 | SvREFCNT_inc_simple | |
16 | SvREFCNT_inc_NN | |
17 | SvREFCNT_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 | ||
86 | void | |
87 | SvREFCNT() | |
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 | |
121 | for (Devel::PPPort::SvREFCNT()) { | |
122 | ok(defined $_ and $_); | |
123 | } |