diff options
author | Joshua Pritikin <joshua.pritikin@db.com> | 1998-07-01 06:09:43 -0400 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-07-04 05:52:34 +0000 |
commit | d689ffdd6d1d8fd913b48f3cb3a376bd99e0a6cf (patch) | |
tree | 4149cdb70a157cfb0f43ffc2910a0da15c42f486 /sv.c | |
parent | 8fb9a439a71a5e6b7adf7c46052298d23dd9cab7 (diff) | |
download | perl-d689ffdd6d1d8fd913b48f3cb3a376bd99e0a6cf.tar.gz |
fixes for mortalization bug in xsubpp, other efficiency tweaks
Message-Id: <H00000e500086fb3@MHS>
Subject: [PATCH _69] sv_2mortal fix
p4raw-id: //depot/perl@1306
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 31 |
1 files changed, 17 insertions, 14 deletions
@@ -2959,15 +2959,16 @@ sv_free(SV *sv) if (!sv) return; - if (SvREADONLY(sv)) { - if (sv == &sv_undef || sv == &sv_yes || sv == &sv_no) - return; - } if (SvREFCNT(sv) == 0) { if (SvFLAGS(sv) & SVf_BREAK) return; if (in_clean_all) /* All is fair */ return; + if (SvREADONLY(sv) && SvIMMORTAL(sv)) { + /* make sure SvREFCNT(sv)==0 happens very seldom */ + SvREFCNT(sv) = (~(U32)0)/2; + return; + } warn("Attempt to free unreferenced scalar"); return; } @@ -2980,6 +2981,11 @@ sv_free(SV *sv) return; } #endif + if (SvREADONLY(sv) && SvIMMORTAL(sv)) { + /* make sure SvREFCNT(sv)==0 happens very seldom */ + SvREFCNT(sv) = (~(U32)0)/2; + return; + } sv_clear(sv); if (! SvREFCNT(sv)) del_SV(sv); @@ -3602,8 +3608,8 @@ sv_2mortal(register SV *sv) dTHR; if (!sv) return sv; - if (SvREADONLY(sv) && curcop != &compiling) - croak(no_modify); + if (SvREADONLY(sv) && SvIMMORTAL(sv)) + return; if (++tmps_ix >= tmps_max) sv_mortalgrow(); tmps_stack[tmps_ix] = sv; @@ -3683,7 +3689,7 @@ newSViv(IV i) } SV * -newRV(SV *tmpRef) +newRV_noinc(SV *tmpRef) { dTHR; register SV *sv; @@ -3694,20 +3700,17 @@ newRV(SV *tmpRef) SvFLAGS(sv) = 0; sv_upgrade(sv, SVt_RV); SvTEMP_off(tmpRef); - SvRV(sv) = SvREFCNT_inc(tmpRef); + SvRV(sv) = tmpRef; SvROK_on(sv); return sv; } - - SV * -Perl_newRV_noinc(SV *tmpRef) +newRV(SV *tmpRef) { register SV *sv; - - sv = newRV(tmpRef); - SvREFCNT_dec(tmpRef); + sv = newRV_noinc(tmpRef); + SvREFCNT_inc(tmpRef); return sv; } |