################################################################################ ## ## 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 newSVpvn_share __UNDEFINED__ =implementation /* Hint: newSVpvn_share * The SVs created by this function only mimic the behaviour of * shared PVs without really being shared. Only use if you know * what you're doing. */ #ifndef newSVpvn_share #if { NEED newSVpvn_share } SV * newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash) { SV *sv; if (len < 0) len = -len; if (!hash) PERL_HASH(hash, (char*) src, len); sv = newSVpvn((char *) src, len); sv_upgrade(sv, SVt_PVIV); SvIVX(sv) = hash; SvREADONLY_on(sv); SvPOK_on(sv); return sv; } #endif #endif __UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv)) =xsinit #define NEED_newSVpvn_share =xsubs int newSVpvn_share() PREINIT: const char *s; SV *sv; STRLEN len; U32 hash; CODE: RETVAL = 0; s = "mhx"; len = 3; PERL_HASH(hash, (char *) s, len); sv = newSVpvn_share(s, len, 0); s = 0; RETVAL += strEQ(SvPV_nolen_const(sv), "mhx"); RETVAL += SvCUR(sv) == len; RETVAL += SvSHARED_HASH(sv) == hash; SvREFCNT_dec(sv); s = "foobar"; len = 6; PERL_HASH(hash, (char *) s, len); sv = newSVpvn_share(s, -(I32) len, hash); s = 0; RETVAL += strEQ(SvPV_nolen_const(sv), "foobar"); RETVAL += SvCUR(sv) == len; RETVAL += SvSHARED_HASH(sv) == hash; SvREFCNT_dec(sv); OUTPUT: RETVAL =tests plan => 1 ok(&Devel::PPPort::newSVpvn_share(), 6);