toke.c: Don’t depend on sv_force_normal’s good graces
authorFather Chrysostomos <sprout@cpan.org>
Sat, 22 Jun 2013 19:09:07 +0000 (12:09 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 23 Jun 2013 06:16:41 +0000 (23:16 -0700)
when parsing ‘keyword =>’ with comments or line breaks before the =>.

sv_force_normal will allow modification of read-only values at compile
time.  While this might be convenient, it has resulted in many bugs
elsewhere, so I am trying to change that.  This is a necessary pre-
requisite.

toke.c

diff --git a/toke.c b/toke.c
index 0a16715..e31275d 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -7182,9 +7182,13 @@ Perl_yylex(pTHX)
                if (*s == '=' && s[1] == '>' && !pkgname) {
                    op_free(rv2cv_op);
                    CLINE;
+                   /* This is our own scalar, created a few lines above,
+                      so this is safe. */
+                   SvREADONLY_off(cSVOPx(pl_yylval.opval)->op_sv);
                    sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
                    if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
                      SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
+                   SvREADONLY_on(cSVOPx(pl_yylval.opval)->op_sv);
                    TERM(WORD);
                }