| ################################################################################ |
| ## |
| ## $Revision: 6 $ |
| ## $Author: mhx $ |
| ## $Date: 2010/03/07 13:15:45 +0100 $ |
| ## |
| ################################################################################ |
| ## |
| ## Version 3.x, Copyright (C) 2004-2010, Marcus Holland-Moritz. |
| ## Version 2.x, Copyright (C) 2001, Paul Marquess. |
| ## Version 1.x, Copyright (C) 1999, Kenneth Albanowski. |
| ## |
| ## This program is free software; you can redistribute it and/or |
| ## modify it under the same terms as Perl itself. |
| ## |
| ################################################################################ |
| |
| =provides |
| |
| SvREFCNT_inc |
| SvREFCNT_inc_simple |
| SvREFCNT_inc_NN |
| SvREFCNT_inc_void |
| __UNDEFINED__ |
| |
| =implementation |
| |
| #ifndef SvREFCNT_inc |
| # ifdef PERL_USE_GCC_BRACE_GROUPS |
| # define SvREFCNT_inc(sv) \ |
| ({ \ |
| SV * const _sv = (SV*)(sv); \ |
| if (_sv) \ |
| (SvREFCNT(_sv))++; \ |
| _sv; \ |
| }) |
| # else |
| # define SvREFCNT_inc(sv) \ |
| ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) |
| # endif |
| #endif |
| |
| #ifndef SvREFCNT_inc_simple |
| # ifdef PERL_USE_GCC_BRACE_GROUPS |
| # define SvREFCNT_inc_simple(sv) \ |
| ({ \ |
| if (sv) \ |
| (SvREFCNT(sv))++; \ |
| (SV *)(sv); \ |
| }) |
| # else |
| # define SvREFCNT_inc_simple(sv) \ |
| ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) |
| # endif |
| #endif |
| |
| #ifndef SvREFCNT_inc_NN |
| # ifdef PERL_USE_GCC_BRACE_GROUPS |
| # define SvREFCNT_inc_NN(sv) \ |
| ({ \ |
| SV * const _sv = (SV*)(sv); \ |
| SvREFCNT(_sv)++; \ |
| _sv; \ |
| }) |
| # else |
| # define SvREFCNT_inc_NN(sv) \ |
| (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) |
| # endif |
| #endif |
| |
| #ifndef SvREFCNT_inc_void |
| # ifdef PERL_USE_GCC_BRACE_GROUPS |
| # define SvREFCNT_inc_void(sv) \ |
| ({ \ |
| SV * const _sv = (SV*)(sv); \ |
| if (_sv) \ |
| (void)(SvREFCNT(_sv)++); \ |
| }) |
| # else |
| # define SvREFCNT_inc_void(sv) \ |
| (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) |
| # endif |
| #endif |
| |
| __UNDEFINED__ SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END |
| __UNDEFINED__ SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) |
| __UNDEFINED__ SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) |
| __UNDEFINED__ SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) |
| |
| =xsubs |
| |
| void |
| SvREFCNT() |
| PREINIT: |
| SV *sv, *svr; |
| PPCODE: |
| sv = newSV(0); |
| mXPUSHi(SvREFCNT(sv) == 1); |
| svr = SvREFCNT_inc(sv); |
| mXPUSHi(sv == svr); |
| mXPUSHi(SvREFCNT(sv) == 2); |
| svr = SvREFCNT_inc_simple(sv); |
| mXPUSHi(sv == svr); |
| mXPUSHi(SvREFCNT(sv) == 3); |
| svr = SvREFCNT_inc_NN(sv); |
| mXPUSHi(sv == svr); |
| mXPUSHi(SvREFCNT(sv) == 4); |
| svr = SvREFCNT_inc_simple_NN(sv); |
| mXPUSHi(sv == svr); |
| mXPUSHi(SvREFCNT(sv) == 5); |
| SvREFCNT_inc_void(sv); |
| mXPUSHi(SvREFCNT(sv) == 6); |
| SvREFCNT_inc_simple_void(sv); |
| mXPUSHi(SvREFCNT(sv) == 7); |
| SvREFCNT_inc_void_NN(sv); |
| mXPUSHi(SvREFCNT(sv) == 8); |
| SvREFCNT_inc_simple_void_NN(sv); |
| mXPUSHi(SvREFCNT(sv) == 9); |
| while (SvREFCNT(sv) > 1) |
| SvREFCNT_dec(sv); |
| mXPUSHi(SvREFCNT(sv) == 1); |
| SvREFCNT_dec(sv); |
| XSRETURN(14); |
| |
| =tests plan => 14 |
| |
| for (Devel::PPPort::SvREFCNT()) { |
| ok(defined $_ and $_); |
| } |
| |