Skip to content

Commit 19765a4

Browse files
committed
SvPV_shrink_to_cur: include space for COW
The `SvPV_shrink_to_cur` macro shrinks an allocation to `SvCUR(sv) + 1`, which does not include an additional byte for Copy-On-Write (COW). GH#22116 - a902d92 - short-circuited constant folding on CONST OPs, as this should be unnecessary. However, Dave Mitchell noticed that it had the inadvertent effect of disabling COW on SVs holding UTF8 string literals (e.g. `"\x{100}abcd"`). When a CONST OP is created, `Perl_ck_svconst` should mark its SV as being COW-able. But SVs built via `S_scan_const`, when that has called `SvPV_shrink_to_cur`, have resulting `SvLEN(sv)` values that fail the `SvCANCOW(sv)` test. Previously, constant folding had the effect of copying the literal into a buffer large enough for COW. This commit modifies `SvPV_shrink_to_cur` to: allocate an additional byte to allow for subsequent COWing directly. Additionally, this macro will no longer try to shrink the buffer below PERL_STRLEN_NEW_MIN, since that is likely to have no effect.
1 parent 482fd30 commit 19765a4

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

sv.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,9 +1590,14 @@ L</C<SV_CHECK_THINKFIRST_COW_DROP>> before calling this.
15901590
=cut
15911591
*/
15921592

1593-
#define SvPV_shrink_to_cur(sv) STMT_START { \
1594-
const STRLEN _lEnGtH = SvCUR(sv) + 1; \
1595-
SvPV_renew(sv, _lEnGtH); \
1593+
/* Notes: Make sure the buffer is big enough to be COWed in the future.
1594+
* Don't try to shrink smaller than PERL_STRLEN_NEW_MIN, as that is
1595+
* unlikely to result in a smaller allocation. */
1596+
1597+
#define SvPV_shrink_to_cur(sv) STMT_START { \
1598+
const STRLEN _lEnGtH = SvCUR(sv) + 2; \
1599+
if (PERL_STRLEN_NEW_MIN < _lEnGtH) \
1600+
SvPV_renew(sv, _lEnGtH); \
15961601
} STMT_END
15971602

15981603
/*

0 commit comments

Comments
 (0)