must copy changes from win32/makeifle.mk to wince/makefile.ce
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index aa20096..3b010ec 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1324,7 +1324,7 @@ S_scan_const(pTHX_ char *start)
           except for the last char, which will be done separately. */
        else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
            if (s[2] == '#') {
-               while (s < send && *s != ')')
+               while (s+1 < send && *s != ')')
                    *d++ = NATIVE_TO_NEED(has_utf8,*s++);
            }
            else if (s[2] == '{' /* This should match regcomp.c */
@@ -1343,10 +1343,8 @@ S_scan_const(pTHX_ char *start)
                        count--;
                    regparse++;
                }
-               if (*regparse != ')') {
+               if (*regparse != ')')
                    regparse--;         /* Leave one char for continuation. */
-                   yyerror("Sequence (?{...}) not terminated or not {}-balanced");
-               }
                while (s < regparse)
                    *d++ = NATIVE_TO_NEED(has_utf8,*s++);
            }
@@ -2877,10 +2875,10 @@ Perl_yylex(pTHX)
                /* Assume it was a minus followed by a one-letter named
                 * subroutine call (or a -bareword), then. */
                DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                       "### %c looked like a file test but was not\n",
-                       (int)ftst);
+                       "### '-%c' looked like a file test but was not\n",
+                       tmp);
                } );
-               s -= 2;
+               s = --PL_bufptr;
            }
        }
        tmp = *s++;
@@ -3038,10 +3036,12 @@ Perl_yylex(pTHX)
                        CvMETHOD_on(PL_compcv);
                    else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
                        CvASSERTION_on(PL_compcv);
-#ifdef USE_ITHREADS
                    else if (PL_in_my == KEY_our && len == 6 &&
                             strnEQ(s, "unique", len))
+#ifdef USE_ITHREADS
                        GvUNIQUE_on(cGVOPx_gv(yylval.opval));
+#else
+                       ; /* skip that case to avoid loading attributes.pm */
 #endif
                    /* After we've set the flags, it could be argued that
                       we don't need to do the attributes.pm-based setting
@@ -7252,6 +7252,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
            UV u = 0;
            I32 shift;
            bool overflowed = FALSE;
+           bool just_zero  = TRUE;     /* just plain 0 or binary number? */
            static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
            static char* bases[5] = { "", "binary", "", "octal",
                                      "hexadecimal" };
@@ -7268,9 +7269,11 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
            if (s[1] == 'x') {
                shift = 4;
                s += 2;
+               just_zero = FALSE;
            } else if (s[1] == 'b') {
                shift = 1;
                s += 2;
+               just_zero = FALSE;
            }
            /* check for a decimal in disguise */
            else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
@@ -7342,6 +7345,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
                    */
 
                  digit:
+                   just_zero = FALSE;
                    if (!overflowed) {
                        x = u << shift; /* make room for the digit */
 
@@ -7400,7 +7404,10 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
 #endif
                sv_setuv(sv, u);
            }
-           if (PL_hints & HINT_NEW_BINARY)
+           if (just_zero && (PL_hints & HINT_NEW_INTEGER))
+               sv = new_constant(start, s - start, "integer", 
+                                 sv, Nullsv, NULL);
+           else if (PL_hints & HINT_NEW_BINARY)
                sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
        }
        break;