summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorRichard Leach <richardleach@users.noreply.github.com>2021-12-03 00:10:51 +0000
committerPaul Evans <leonerd@leonerd.org.uk>2021-12-04 11:49:42 +0000
commitf7f919a02477385250997b98fe25f99657653150 (patch)
treee82e9cd32275eed214553785ba0c77d2a13e501b /pp_hot.c
parent6ac93b496cce8882a9d5494bfedb84f4da7e0aee (diff)
downloadperl-f7f919a02477385250997b98fe25f99657653150.tar.gz
Misc microoptimizations when dealing with new SVs
In a few places, SVs can be created more efficiently or new SVs can be assigned to more efficiently. Small changes included: * Use sv_setpvn_fresh instead of sv_setpvn * Use sv_mortalcopy_flags instead of sv_newmortal + sv_setsv_flags * newSVsv_flags instead of newSV + sv_setsv_flags * sv_newmortal instead of sv_2mortal(newSV(0)) * Remove a SvGROW(sv, 257) following a newSV(257)
Diffstat (limited to 'pp_hot.c')
-rw-r--r--pp_hot.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/pp_hot.c b/pp_hot.c
index f22628617f..477cdd48b8 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1077,16 +1077,15 @@ PP(pp_multiconcat)
/* if both args are the same magical value, make one a copy */
if (left == right && SvGMAGICAL(left)) {
- left = sv_newmortal();
+ SV * targetsv = right;
/* Print the uninitialized warning now, so it includes the
* variable name. */
if (!SvOK(right)) {
if (ckWARN(WARN_UNINITIALIZED))
report_uninit(right);
- sv_setbool(left, FALSE);
+ targetsv = &PL_sv_no;
}
- else
- sv_setsv_flags(left, right, 0);
+ left = sv_mortalcopy_flags(targetsv, 0);
SvGETMAGIC(right);
}
}
@@ -2407,13 +2406,10 @@ PP(pp_aassign)
}
else {
SV *nsv;
- /* do get before newSV, in case it dies and leaks */
- SvGETMAGIC(rsv);
- nsv = newSV(0);
/* see comment in S_aassign_copy_common about
* SV_NOSTEAL */
- sv_setsv_flags(nsv, rsv,
- (SV_DO_COW_SVSETSV|SV_NOSTEAL));
+ nsv = newSVsv_flags(rsv,
+ (SV_DO_COW_SVSETSV|SV_NOSTEAL|SV_GMAGIC));
rsv = *svp = nsv;
}
@@ -2531,13 +2527,10 @@ PP(pp_aassign)
}
else {
SV *nsv;
- /* do get before newSV, in case it dies and leaks */
- SvGETMAGIC(rsv);
- nsv = newSV(0);
/* see comment in S_aassign_copy_common about
* SV_NOSTEAL */
- sv_setsv_flags(nsv, rsv,
- (SV_DO_COW_SVSETSV|SV_NOSTEAL));
+ nsv = newSVsv_flags(rsv,
+ (SV_DO_COW_SVSETSV|SV_NOSTEAL|SV_GMAGIC));
rsv = *svp = nsv;
}