macros for COP.cop_filegv access
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index 8777426..0ef7d52 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -120,7 +120,7 @@ int* yychar_pointer = NULL;
  * LOOPX        : loop exiting command (goto, last, dump, etc)
  * FTST         : file test operator
  * FUN0         : zero-argument function
- * FUN1         : not used
+ * FUN1         : not used, except for not, which isn't a UNIOP
  * BOop         : bitwise or or xor
  * BAop         : bitwise and
  * SHop         : shift operator
@@ -375,13 +375,13 @@ Perl_lex_start(pTHX_ SV *line)
     SAVESPTR(PL_linestr);
     SAVEPPTR(PL_lex_brackstack);
     SAVEPPTR(PL_lex_casestack);
-    SAVEDESTRUCTOR(restore_rsfp, PL_rsfp);
+    SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
     SAVESPTR(PL_lex_stuff);
     SAVEI32(PL_lex_defer);
     SAVEI32(PL_sublex_info.sub_inwhat);
     SAVESPTR(PL_lex_repl);
-    SAVEDESTRUCTOR(restore_expect, PL_tokenbuf + PL_expect); /* encode as pointer */
-    SAVEDESTRUCTOR(restore_lex_expect, PL_tokenbuf + PL_expect);
+    SAVEDESTRUCTOR_X(restore_expect, PL_tokenbuf + PL_expect); /* encode as pointer */
+    SAVEDESTRUCTOR_X(restore_lex_expect, PL_tokenbuf + PL_expect);
 
     PL_lex_state = LEX_NORMAL;
     PL_lex_defer = 0;
@@ -474,9 +474,9 @@ S_incline(pTHX_ char *s)
     ch = *t;
     *t = '\0';
     if (t - s > 0)
-       PL_curcop->cop_filegv = gv_fetchfile(s);
+       CopFILEGV_set(PL_curcop, gv_fetchfile(s));
     else
-       PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
+       CopFILEGV_set(PL_curcop, gv_fetchfile(PL_origfilename));
     *t = ch;
     PL_curcop->cop_line = atoi(n)-1;
 }
@@ -590,7 +590,7 @@ S_skipspace(pTHX_ register char *s)
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
-           av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+           av_store(CopFILEAV(PL_curcop),(I32)PL_curcop->cop_line,sv);
        }
     }
 }
@@ -1153,7 +1153,7 @@ S_scan_const(pTHX_ char *start)
        ? (PL_sublex_info.sub_op->op_private & (PL_lex_repl ?
                                                OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF))
        : UTF;
-    char *leaveit =                    /* set of acceptably-backslashed characters */
+    const char *leaveit =      /* set of acceptably-backslashed characters */
        PL_lex_inpat
            ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
            : "";
@@ -1330,7 +1330,7 @@ S_scan_const(pTHX_ char *start)
            /* \132 indicates an octal constant */
            case '0': case '1': case '2': case '3':
            case '4': case '5': case '6': case '7':
-               *d++ = scan_oct(s, 3, &len);
+               *d++ = (char)scan_oct(s, 3, &len);
                s += len;
                continue;
 
@@ -1352,7 +1352,7 @@ S_scan_const(pTHX_ char *start)
                    }
                    /* note: utf always shorter than hex */
                    d = (char*)uv_to_utf8((U8*)d,
-                                         scan_hex(s + 1, e - s - 1, &len));
+                                         (UV)scan_hex(s + 1, e - s - 1, &len));
                    s = e + 1;
                }
                else {
@@ -1772,10 +1772,9 @@ S_incl_perldb(pTHX)
 SV *
 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
 {
-    if (!funcp){ /* temporary handy debugging hack to be deleted */
-       PL_filter_debug = atoi((char*)datasv);
-       return NULL;
-    }
+    if (!funcp)
+       return Nullsv;
+
     if (!PL_rsfp_filters)
        PL_rsfp_filters = newAV();
     if (!datasv)
@@ -1783,12 +1782,8 @@ Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
     if (!SvUPGRADE(datasv, SVt_PVIO))
         Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
     IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
-#ifdef DEBUGGING
-    if (PL_filter_debug) {
-       STRLEN n_a;
-       Perl_warn(aTHX_ "filter_add func %p (%s)", funcp, SvPV(datasv, n_a));
-    }
-#endif /* DEBUGGING */
+    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
+                         funcp, SvPV_nolen(datasv)));
     av_unshift(PL_rsfp_filters, 1);
     av_store(PL_rsfp_filters, 0, datasv) ;
     return(datasv);
@@ -1799,10 +1794,7 @@ Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
 void
 Perl_filter_del(pTHX_ filter_t funcp)
 {
-#ifdef DEBUGGING
-    if (PL_filter_debug)
-       Perl_warn(aTHX_ "filter_del func %p", funcp);
-#endif /* DEBUGGING */
+    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", funcp));
     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
        return;
     /* if filter is on top of stack (usual case) just pop it off */
@@ -1832,10 +1824,8 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
     if (idx > AvFILLp(PL_rsfp_filters)){       /* Any more filters?    */
        /* Provide a default input filter to make life easy.    */
        /* Note that we append to the line. This is handy.      */
-#ifdef DEBUGGING
-       if (PL_filter_debug)
-           Perl_warn(aTHX_ "filter_read %d: from rsfp\n", idx);
-#endif /* DEBUGGING */
+       DEBUG_P(PerlIO_printf(Perl_debug_log,
+                             "filter_read %d: from rsfp\n", idx));
        if (maxlen) { 
            /* Want a block */
            int len ;
@@ -1863,21 +1853,16 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
     }
     /* Skip this filter slot if filter has been deleted        */
     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
-#ifdef DEBUGGING
-       if (PL_filter_debug)
-           Perl_warn(aTHX_ "filter_read %d: skipped (filter deleted)\n", idx);
-#endif /* DEBUGGING */
+       DEBUG_P(PerlIO_printf(Perl_debug_log,
+                             "filter_read %d: skipped (filter deleted)\n",
+                             idx));
        return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
     }
     /* Get function pointer hidden within datasv       */
     funcp = (filter_t)IoDIRP(datasv);
-#ifdef DEBUGGING
-    if (PL_filter_debug) {
-       STRLEN n_a;
-       Perl_warn(aTHX_ "filter_read %d: via function %p (%s)\n",
-               idx, funcp, SvPV(datasv,n_a));
-    }
-#endif /* DEBUGGING */
+    DEBUG_P(PerlIO_printf(Perl_debug_log,
+                         "filter_read %d: via function %p (%s)\n",
+                         idx, funcp, SvPV_nolen(datasv)));
     /* Call function. The function is expected to      */
     /* call "FILTER_READ(idx+1, buf_sv)" first.                */
     /* Return: <0:error, =0:eof, >0:not eof            */
@@ -2266,7 +2251,8 @@ Perl_yylex(pTHX)
     PL_oldoldbufptr = PL_oldbufptr;
     PL_oldbufptr = s;
     DEBUG_p( {
-       PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[PL_expect], s);
+       PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at %s\n",
+                     exp_name[PL_expect], s);
     } )
 
   retry:
@@ -2344,7 +2330,7 @@ Perl_yylex(pTHX)
 
                sv_upgrade(sv, SVt_PVMG);
                sv_setsv(sv,PL_linestr);
-               av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+               av_store(CopFILEAV(PL_curcop),(I32)PL_curcop->cop_line,sv);
            }
            goto retry;
        }
@@ -2393,7 +2379,7 @@ Perl_yylex(pTHX)
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
-           av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+           av_store(CopFILEAV(PL_curcop),(I32)PL_curcop->cop_line,sv);
        }
        PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
        if (PL_curcop->cop_line == 1) {
@@ -2434,7 +2420,7 @@ Perl_yylex(pTHX)
                     */
                    SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
                    assert(SvPOK(x) || SvGMAGICAL(x));
-                   if (sv_eq(x, GvSV(PL_curcop->cop_filegv))) {
+                   if (sv_eq(x, CopFILESV(PL_curcop))) {
                        sv_setpvn(x, ipath, ipathend - ipath);
                        SvSETMAGIC(x);
                    }
@@ -3603,7 +3589,8 @@ Perl_yylex(pTHX)
 
                if (PL_oldoldbufptr &&
                    PL_oldoldbufptr < PL_bufptr &&
-                   (PL_oldoldbufptr == PL_last_lop || PL_oldoldbufptr == PL_last_uni) &&
+                   (PL_oldoldbufptr == PL_last_lop
+                    || PL_oldoldbufptr == PL_last_uni) &&
                    /* NO SKIPSPACE BEFORE HERE! */
                    (PL_expect == XREF ||
                     ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
@@ -3737,17 +3724,12 @@ Perl_yylex(pTHX)
 
        case KEY___FILE__:
            yylval.opval = (OP*)newSVOP(OP_CONST, 0,
-                                       newSVsv(GvSV(PL_curcop->cop_filegv)));
+                                       newSVsv(CopFILESV(PL_curcop)));
            TERM(THING);
 
        case KEY___LINE__:
-#ifdef IV_IS_QUAD
             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
-                                    Perl_newSVpvf(aTHX_ "%" PERL_PRId64, (IV)PL_curcop->cop_line));
-#else
-            yylval.opval = (OP*)newSVOP(OP_CONST, 0,
-                                    Perl_newSVpvf(aTHX_ "%ld", (long)PL_curcop->cop_line));
-#endif
+                                    Perl_newSVpvf(aTHX_ "%"IVdf, (IV)PL_curcop->cop_line));
            TERM(THING);
 
        case KEY___PACKAGE__:
@@ -3861,8 +3843,10 @@ Perl_yylex(pTHX)
 
        case KEY_crypt:
 #ifdef FCRYPT
-           if (!PL_cryptseen++)
+           if (!PL_cryptseen) {
+               PL_cryptseen = TRUE;
                init_des();
+           }
 #endif
            LOP(OP_CRYPT,XTERM);
 
@@ -4230,7 +4214,10 @@ Perl_yylex(pTHX)
            OPERATOR(USE);
 
        case KEY_not:
-           OPERATOR(NOTOP);
+           if (*s == '(' || (s = skipspace(s), *s == '('))
+               FUN1(OP_NOT);
+           else
+               OPERATOR(NOTOP);
 
        case KEY_open:
            s = skipspace(s);
@@ -4543,7 +4530,6 @@ Perl_yylex(pTHX)
            UNI(OP_STAT);
 
        case KEY_study:
-           PL_sawstudy++;
            UNI(OP_STUDY);
 
        case KEY_substr:
@@ -4754,7 +4740,6 @@ Perl_yylex(pTHX)
            UNI(OP_VALUES);
 
        case KEY_vec:
-           PL_sawvec = TRUE;
            LOP(OP_VEC,XTERM);
 
        case KEY_while:
@@ -5441,7 +5426,8 @@ S_checkcomma(pTHX_ register char *s, char *name, char *what)
            if (*w)
                for (; *w && isSPACE(*w); w++) ;
            if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
-               Perl_warner(aTHX_ WARN_SYNTAX, "%s (...) interpreted as function",name);
+               Perl_warner(aTHX_ WARN_SYNTAX,
+                           "%s (...) interpreted as function",name);
        }
     }
     while (s < PL_bufend && isSPACE(*s))
@@ -5474,14 +5460,15 @@ S_checkcomma(pTHX_ register char *s, char *name, char *what)
    and type is used with error messages only. */
 
 STATIC SV *
-S_new_constant(pTHX_ char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type) 
+S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
+              const char *type) 
 {
     dSP;
     HV *table = GvHV(PL_hintgv);                /* ^H */
     SV *res;
     SV **cvp;
     SV *cv, *typesv;
-    char *why, *why1, *why2;
+    const char *why, *why1, *why2;
     
     if (!(PL_hints & HINT_LOCALIZE_HH)) {
        SV *msg;
@@ -5539,12 +5526,12 @@ S_new_constant(pTHX_ char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type)
        STRLEN n_a;
        sv_catpv(ERRSV, "Propagated");
        yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
-       POPs ;
+       (void)POPs;
        res = SvREFCNT_inc(sv);
     }
     else {
        res = POPs;
-       SvREFCNT_inc(res);
+       (void)SvREFCNT_inc(res);
     }
     
     PUTBACK ;
@@ -5709,7 +5696,7 @@ S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN des
            if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
                dTHR;                   /* only for ckWARN */
                if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
-                   char *brack = *s == '[' ? "[...]" : "{...}";
+                   const char *brack = *s == '[' ? "[...]" : "{...}";
                    Perl_warner(aTHX_ WARN_AMBIGUOUS,
                        "Ambiguous use of %c{%s%s} resolved to %c%s%s",
                        funny, dest, brack, funny, dest, brack);
@@ -6128,8 +6115,7 @@ S_scan_heredoc(pTHX_ register char *s)
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
-           av_store(GvAV(PL_curcop->cop_filegv),
-             (I32)PL_curcop->cop_line,sv);
+           av_store(CopFILEAV(PL_curcop), (I32)PL_curcop->cop_line,sv);
        }
        if (*s == term && memEQ(s,PL_tokenbuf,len)) {
            s = PL_bufend - 1;
@@ -6452,8 +6438,7 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
-           av_store(GvAV(PL_curcop->cop_filegv),
-             (I32)PL_curcop->cop_line, sv);
+           av_store(CopFILEAV(PL_curcop), (I32)PL_curcop->cop_line, sv);
        }
 
        /* having changed the buffer, we must update PL_bufend */
@@ -6995,28 +6980,16 @@ Perl_yyerror(pTHX_ char *s)
        where = SvPVX(where_sv);
     }
     msg = sv_2mortal(newSVpv(s, 0));
-#ifdef IV_IS_QUAD
-    Perl_sv_catpvf(aTHX_ msg, " at %_ line %" PERL_PRId64 ", ",
-              GvSV(PL_curcop->cop_filegv), (IV)PL_curcop->cop_line);
-#else
-    Perl_sv_catpvf(aTHX_ msg, " at %_ line %ld, ",
-              GvSV(PL_curcop->cop_filegv), (long)PL_curcop->cop_line);
-#endif
+    Perl_sv_catpvf(aTHX_ msg, " at %_ line %"IVdf", ",
+                  CopFILESV(PL_curcop), (IV)PL_curcop->cop_line);
     if (context)
        Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
     else
        Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
     if (PL_multi_start < PL_multi_end && (U32)(PL_curcop->cop_line - PL_multi_end) <= 1) {
-#ifdef IV_IS_QUAD
         Perl_sv_catpvf(aTHX_ msg,
-        "  (Might be a runaway multi-line %c%c string starting on line %" PERL_\
-PRId64 ")\n",
+        "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
-#else
-        Perl_sv_catpvf(aTHX_ msg,
-        "  (Might be a runaway multi-line %c%c string starting on line %ld)\n",
-                (int)PL_multi_open,(int)PL_multi_close,(long)PL_multi_start);
-#endif
         PL_multi_end = 0;
     }
     if (PL_in_eval & EVAL_WARNONLY)
@@ -7024,7 +6997,7 @@ PRId64 ")\n",
     else
        qerror(msg);
     if (PL_error_count >= 10)
-       Perl_croak(aTHX_ "%_ has too many errors.\n", GvSV(PL_curcop->cop_filegv));
+       Perl_croak(aTHX_ "%_ has too many errors.\n", CopFILESV(PL_curcop));
     PL_in_my = 0;
     PL_in_my_stash = Nullhv;
     return 0;