Integrate from mainperl.
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index 66d9947..4ab20c2 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -598,8 +598,6 @@ force_word(register char *start, int token, int check_keyword, int allow_pack, i
                PL_expect = XTERM;
            else {
                PL_expect = XOPERATOR;
-               force_next(')');
-               force_next('(');
            }
        }
        PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
@@ -1450,13 +1448,12 @@ incl_perldb(void)
  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
  * private use must be set using malloc'd pointers.
  */
-static int filter_debug = 0;
 
 SV *
 filter_add(filter_t funcp, SV *datasv)
 {
     if (!funcp){ /* temporary handy debugging hack to be deleted */
-       filter_debug = atoi((char*)datasv);
+       PL_filter_debug = atoi((char*)datasv);
        return NULL;
     }
     if (!PL_rsfp_filters)
@@ -1466,7 +1463,7 @@ filter_add(filter_t funcp, SV *datasv)
     if (!SvUPGRADE(datasv, SVt_PVIO))
         die("Can't upgrade filter_add data to SVt_PVIO");
     IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
-    if (filter_debug) {
+    if (PL_filter_debug) {
        STRLEN n_a;
        warn("filter_add func %p (%s)", funcp, SvPV(datasv, n_a));
     }
@@ -1480,7 +1477,7 @@ filter_add(filter_t funcp, SV *datasv)
 void
 filter_del(filter_t funcp)
 {
-    if (filter_debug)
+    if (PL_filter_debug)
        warn("filter_del func %p", funcp);
     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
        return;
@@ -1510,7 +1507,7 @@ filter_read(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.      */
-       if (filter_debug)
+       if (PL_filter_debug)
            warn("filter_read %d: from rsfp\n", idx);
        if (maxlen) { 
            /* Want a block */
@@ -1539,13 +1536,13 @@ filter_read(int idx, SV *buf_sv, int maxlen)
     }
     /* Skip this filter slot if filter has been deleted        */
     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
-       if (filter_debug)
+       if (PL_filter_debug)
            warn("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);
-    if (filter_debug) {
+    if (PL_filter_debug) {
        STRLEN n_a;
        warn("filter_read %d: via function %p (%s)\n",
                idx, funcp, SvPV(datasv,n_a));
@@ -2134,7 +2131,7 @@ int yylex(PERL_YYLEX_PARAM_DECL)
                    else
                        newargv = PL_origargv;
                    newargv[0] = ipath;
-                   execv(ipath, newargv);
+                   PerlProc_execv(ipath, newargv);
                    croak("Can't exec %s", ipath);
                }
                if (d) {
@@ -3841,36 +3838,46 @@ int yylex(PERL_YYLEX_PARAM_DECL)
            s = scan_str(s);
            if (!s)
                missingterm((char*)0);
-           if (ckWARN(WARN_SYNTAX) && SvLEN(PL_lex_stuff)) {
+           force_next(')');
+           if (SvCUR(PL_lex_stuff)) {
+               OP *words = Nullop;
+               int warned = 0;
                d = SvPV_force(PL_lex_stuff, len);
-               for (; len; --len, ++d) {
-                   if (*d == ',') {
-                       warner(WARN_SYNTAX,
-                           "Possible attempt to separate words with commas");
-                       break;
-                   }
-                   if (*d == '#') {
-                       warner(WARN_SYNTAX,
-                           "Possible attempt to put comments in qw() list");
-                       break;
+               while (len) {
+                   for (; isSPACE(*d) && len; --len, ++d) ;
+                   if (len) {
+                       char *b = d;
+                       if (!warned && ckWARN(WARN_SYNTAX)) {
+                           for (; !isSPACE(*d) && len; --len, ++d) {
+                               if (*d == ',') {
+                                   warner(WARN_SYNTAX,
+                                       "Possible attempt to separate words with commas");
+                                   ++warned;
+                               }
+                               else if (*d == '#') {
+                                   warner(WARN_SYNTAX,
+                                       "Possible attempt to put comments in qw() list");
+                                   ++warned;
+                               }
+                           }
+                       }
+                       else {
+                           for (; !isSPACE(*d) && len; --len, ++d) ;
+                       }
+                       words = append_elem(OP_LIST, words,
+                                           newSVOP(OP_CONST, 0, newSVpvn(b, d-b)));
                    }
                }
+               if (words) {
+                   PL_nextval[PL_nexttoke].opval = words;
+                   force_next(THING);
+               }
            }
-           force_next(')');
-           PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, tokeq(PL_lex_stuff));
+           if (PL_lex_stuff)
+               SvREFCNT_dec(PL_lex_stuff);
            PL_lex_stuff = Nullsv;
-           force_next(THING);
-           force_next(',');
-           PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
-           force_next(THING);
-           force_next('(');
-           yylval.ival = OP_SPLIT;
-           CLINE;
            PL_expect = XTERM;
-           PL_bufptr = s;
-           PL_last_lop = PL_oldbufptr;
-           PL_last_lop_op = OP_SPLIT;
-           return FUNC;
+           TOKEN('(');
 
        case KEY_qq:
            s = scan_str(s);