This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
toke.c:S_incline: avoid vivifying GV under threads
authorFather Chrysostomos <sprout@cpan.org>
Sat, 10 Aug 2013 01:00:22 +0000 (18:00 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 10 Aug 2013 02:44:13 +0000 (19:44 -0700)
Since c82ecf346 has been reverted by the previous commit, under
threads we are back to storing the name of the current file in the
cop, rather than a pointer to the GV.  This means the GV may not even
have been created, so CopFILEGV will autovivify it.  We can avoid
autovivifying it in those cases where we are not going to be copying
the lines anyway, which S_incline only does for string eval (when it
sees a #line directive).  Even if the GV already exists, this makes
the check faster, as we no longer have to look it up by name when
parsing a file.

toke.c

diff --git a/toke.c b/toke.c
index 7c24eae..fd970a8 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1753,13 +1753,14 @@ S_incline(pTHX_ const char *s)
 
     if (t - s > 0) {
        const STRLEN len = t - s;
-       GV * const cfgv = CopFILEGV(PL_curcop);
 
-       if (cfgv && !PL_rsfp && !PL_parser->filtered) {
+       if (!PL_rsfp && !PL_parser->filtered) {
            /* must copy *{"::_<(eval N)[oldfilename:L]"}
             * to *{"::_<newfilename"} */
            /* However, the long form of evals is only turned on by the
               debugger - usually they're "(eval %lu)" */
+           GV * const cfgv = CopFILEGV(PL_curcop);
+           if (cfgv) {
                char smallbuf[128];
                STRLEN tmplen2 = len;
                char *tmpbuf2;
@@ -1803,6 +1804,7 @@ S_incline(pTHX_ const char *s)
                }
 
                if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
+           }
        }
        CopFILE_free(PL_curcop);
        CopFILE_setn(PL_curcop, s, len);