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 14newSVpvn_share 15__UNDEFINED__ 16 17=implementation 18 19/* Hint: newSVpvn_share 20 * The SVs created by this function only mimic the behaviour of 21 * shared PVs without really being shared. Only use if you know 22 * what you're doing. 23 */ 24 25#ifndef newSVpvn_share 26 27#if { NEED newSVpvn_share } 28 29SV * 30newSVpvn_share(pTHX_ const char *s, I32 len, U32 hash) 31{ 32 SV *sv; 33 if (len < 0) 34 len = -len; 35 if (!hash) 36 PERL_HASH(hash, (char*) s, len); 37 sv = newSVpvn((char *) s, len); 38 sv_upgrade(sv, SVt_PVIV); 39 SvIVX(sv) = hash; 40 SvREADONLY_on(sv); 41 SvPOK_on(sv); 42 return sv; 43} 44 45#endif 46 47#endif 48 49__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv)) 50 51=xsinit 52 53#define NEED_newSVpvn_share 54 55=xsubs 56 57int 58newSVpvn_share() 59 PREINIT: 60 const char *s; 61 SV *sv; 62 STRLEN len; 63 U32 hash; 64 CODE: 65 RETVAL = 0; 66 s = "mhx"; 67 len = 3; 68 PERL_HASH(hash, (char *) s, len); 69 sv = newSVpvn_share(s, len, 0); 70 s = 0; 71 RETVAL += strEQ(SvPV_nolen_const(sv), "mhx"); 72 RETVAL += SvCUR(sv) == len; 73 RETVAL += SvSHARED_HASH(sv) == hash; 74 SvREFCNT_dec(sv); 75 s = "foobar"; 76 len = 6; 77 PERL_HASH(hash, (char *) s, len); 78 sv = newSVpvn_share(s, -(I32) len, hash); 79 s = 0; 80 RETVAL += strEQ(SvPV_nolen_const(sv), "foobar"); 81 RETVAL += SvCUR(sv) == len; 82 RETVAL += SvSHARED_HASH(sv) == hash; 83 SvREFCNT_dec(sv); 84 OUTPUT: 85 RETVAL 86 87 88=tests plan => 1 89 90is(&Devel::PPPort::newSVpvn_share(), 6); 91