This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
when unCOWing a string, set SvCUR to 0
authorDavid Mitchell <davem@iabyn.com>
Thu, 5 Jun 2014 14:03:32 +0000 (15:03 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 5 Jun 2014 14:03:32 +0000 (15:03 +0100)
commita7ab896004fe7cc32eeddadf760d0829e9fed13d
treeb0bf66c8565ee123b467d0f16acfc1f8dde290b9
parent694625fc91bc6ae388505cfe945237dfb255bb3c
when unCOWing a string, set SvCUR to 0

When a COW string is unCOWed, as well as setting SvPVX to NULL and SvLEN
to 0, set SvCUR to 0 too.

This is to avoid a later SvGROW on the same using the old SvCUR() value
to calculate a roundup to the buffer size.

Consider the following code:

    use Devel::Peek;
    for (1..3) {
        my $t;
        my $s = 'x' x 100;
        $t = $s;
        Dump $s;
    }

Looking at the LEN line of the Dump output, we got on 5.20.0:

  LEN = 102
  LEN = 135
  LEN = 135

and after this commit,

  LEN = 102
  LEN = 102
  LEN = 102

As well as wasting space, this extra LEN was then triggering the 'skip COW
if LEN >> CUR' mechanism, causing extra copies. See:

    [perl #121977] COWification seems expensive in PADMY variables
sv.c