This would cause valgrind to complain about:
vec($Foo, 0, 1) = 1; # for example
when $Foo was undef, since SvPVX()[1] isn't initialized until the SV is
at least a SVt_PV.
[1] well, sv_u.svu_rv, but sv_u is a union, so the same memory is
initialized. This isn't technically legal from a C point of view,
but pointer types are compatible enough with each other for it to not
be an issue.
if (lp)
*lp = len;
- if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
+ if (SvTYPE(sv) < SVt_PV ||
+ s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
if (SvROK(sv))
sv_unref(sv);
SvUPGRADE(sv, SVt_PV); /* Never FALSE */