PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
PERL_UNUSED_ARG(mg);
+ SvGETMAGIC(lsv);
+ if (SvROK(lsv))
+ Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
+ "Attempt to use reference as lvalue in substr"
+ );
if (DO_UTF8(sv)) {
sv_utf8_upgrade(lsv);
lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
- sv_insert(lsv, lvoff, lvlen, tmps, len);
+ sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
LvTARGLEN(sv) = sv_len_utf8(sv);
SvUTF8_on(lsv);
}
lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
LvTARGLEN(sv) = len;
utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
- sv_insert(lsv, lvoff, lvlen, utf8, len);
+ sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
Safefree(utf8);
}
else {
- sv_insert(lsv, lvoff, lvlen, tmps, len);
+ sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
LvTARGLEN(sv) = len;
}
else if (DO_UTF8(sv))
repl_need_utf8_upgrade = TRUE;
}
- tmps = SvPV_const(sv, curlen);
+ if (lvalue && !repl) {
+ tmps = NULL; /* unused */
+ SvGETMAGIC(sv);
+ if (SvOK(sv)) (void)SvPV_nomg_const(sv, curlen);
+ else curlen = 0;
+ }
+ else tmps = SvPV_const(sv, curlen);
if (DO_UTF8(sv)) {
utf8_curlen = sv_len_utf8(sv);
if (utf8_curlen == curlen)
if (lvalue && !repl) {
SV * ret;
-
- if (!SvGMAGICAL(sv)) {
- if (SvROK(sv)) {
- SvPV_force_nolen(sv);
- Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
- "Attempt to use reference as lvalue in substr");
- }
- if (isGV_with_GP(sv))
- SvPV_force_nolen(sv);
- else if (SvOK(sv)) /* is it defined ? */
- (void)SvPOK_only_UTF8(sv);
- else
- sv_setpvs(sv, ""); /* avoid lexical reincarnation */
- }
-
ret = sv_2mortal(newSV_type(SVt_PVLV)); /* Not TARG RT#67838 */
sv_magic(ret, NULL, PERL_MAGIC_substr, NULL, 0);
LvTYPE(ret) = 'x';
Use of uninitialized value $g1 in substr at - line 7.
Use of uninitialized value $m1 in substr at - line 7.
Use of uninitialized value $g1 in substr at - line 8.
-Use of uninitialized value $m1 in substr at - line 8.
Use of uninitialized value in scalar assignment at - line 8.
+Use of uninitialized value $m1 in scalar assignment at - line 8.
Use of uninitialized value $m2 in substr at - line 9.
Use of uninitialized value $g1 in substr at - line 9.
-Use of uninitialized value $m1 in substr at - line 9.
Use of uninitialized value in scalar assignment at - line 9.
+Use of uninitialized value $m1 in scalar assignment at - line 9.
Use of uninitialized value $m2 in vec at - line 11.
Use of uninitialized value $g1 in vec at - line 11.
Use of uninitialized value $m1 in vec at - line 11.
BEGIN { require './test.pl'; }
-plan(358);
+plan(360);
run_tests() unless caller;
substr $t, 0, 9, *ザ::ワルド;
is($t, "*ザ::ワルド!", "substr works on a UTF-8 glob + stash");
}
+
+{
+ my $x = *foo;
+ my $y = \substr *foo, 0, 0;
+ is ref \$x, 'GLOB', '\substr does not coerce its glob arg just yet';
+ $x = \"foo";
+ $y = \substr *foo, 0, 0;
+ is ref \$x, 'REF', '\substr does not coerce its ref arg just yet';
+}