#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif MODULE = Hash::NoRef PACKAGE = Hash::NoRef # usage: SvREFCNT(\$var) ; I32 SvREFCNT(sv) SV * sv CODE: if ( SvROK(sv) ) { sv = (SV*)SvRV(sv); RETVAL = SvREFCNT(sv) ; } else { RETVAL = -1 ;} OUTPUT: RETVAL # usage: SvREFCNT_inc(\$var) ; # PPCODE needed since otherwise sv_2mortal is inserted that will kill # the value. SV * SvREFCNT_inc(sv) SV * sv PPCODE: if ( SvROK(sv) ) { sv = (SV*)SvRV(sv); RETVAL = SvREFCNT_inc(sv) ; SvFLAGS(sv) |= SVf_BREAK ; PUSHs(RETVAL); } # usage: SvREFCNT_dec(\$var) ; # PPCODE needed since by default it is void SV * SvREFCNT_dec(sv) SV * sv PPCODE: if ( SvROK(sv) ) { sv = (SV*)SvRV(sv); SvREFCNT_dec(sv); SvFLAGS(sv) |= SVf_BREAK ; PUSHs(sv); } # # From Scalar::Util: # void weaken(sv) SV *sv PROTOTYPE: $ CODE: #ifdef SvWEAKREF sv_rvweaken(sv); #else croak("weak references are not implemented in this release of perl"); #endif void isweak(sv) SV *sv PROTOTYPE: $ CODE: #ifdef SvWEAKREF ST(0) = boolSV(SvROK(sv) && SvWEAKREF(sv)); XSRETURN(1); #else croak("weak references are not implemented in this release of perl"); #endif