summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorJoshua Pritikin <joshua.pritikin@db.com>1998-07-01 06:09:43 -0400
committerGurusamy Sarathy <gsar@cpan.org>1998-07-04 05:52:34 +0000
commitd689ffdd6d1d8fd913b48f3cb3a376bd99e0a6cf (patch)
tree4149cdb70a157cfb0f43ffc2910a0da15c42f486 /sv.c
parent8fb9a439a71a5e6b7adf7c46052298d23dd9cab7 (diff)
downloadperl-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.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/sv.c b/sv.c
index 94fb230bdc..d4cac52e9a 100644
--- a/sv.c
+++ b/sv.c
@@ -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;
}