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