################################################################################ ## ## Version 3.x, Copyright (C) 2004-2013, 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 $_); }