From 7f36b525401817121fac79b7005a7f6a86862639 Mon Sep 17 00:00:00 2001 From: "ricow@chromium.org" Date: Wed, 17 Aug 2011 08:22:41 +0000 Subject: [PATCH] Revert 8942 "Make scanner not accept invalid unicode escapes in identifiers" This is causing webkit failures, reverting until we figure out if this is a V8 regression or wrong test expectations. Review URL: http://codereview.chromium.org/7669017 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8947 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/scanner-base.cc | 25 +++++++------------- src/scanner-base.h | 2 +- test/mjsunit/regress/regress-1620.js | 35 ---------------------------- 3 files changed, 10 insertions(+), 52 deletions(-) delete mode 100644 test/mjsunit/regress/regress-1620.js diff --git a/src/scanner-base.cc b/src/scanner-base.cc index 6da6b59e17..848980372d 100644 --- a/src/scanner-base.cc +++ b/src/scanner-base.cc @@ -41,12 +41,12 @@ Scanner::Scanner(UnicodeCache* unicode_cache) : unicode_cache_(unicode_cache) { } - uc32 Scanner::ScanHexNumber(int expected_length) { - ASSERT(expected_length <= 4); // prevent overflow +uc32 Scanner::ScanHexEscape(uc32 c, int length) { + ASSERT(length <= 4); // prevent overflow uc32 digits[4]; uc32 x = 0; - for (int i = 0; i < expected_length; i++) { + for (int i = 0; i < length; i++) { digits[i] = c0_; int d = HexValue(c0_); if (d < 0) { @@ -54,11 +54,12 @@ Scanner::Scanner(UnicodeCache* unicode_cache) // should be illegal, but other JS VMs just return the // non-escaped version of the original character. - // Push back digits that we have advanced past. + // Push back digits read, except the last one (in c0_). for (int j = i-1; j >= 0; j--) { PushBack(digits[j]); } - return unibrow::Utf8::kBadChar; + // Notice: No handling of error - treat it as "\u"->"u". + return c; } x = x * 16 + d; Advance(); @@ -638,17 +639,9 @@ void JavaScriptScanner::ScanEscape() { case 'n' : c = '\n'; break; case 'r' : c = '\r'; break; case 't' : c = '\t'; break; - case 'u' : { - c = ScanHexNumber(4); - if (c == static_cast(unibrow::Utf8::kBadChar)) c = 'u'; - break; - } + case 'u' : c = ScanHexEscape(c, 4); break; case 'v' : c = '\v'; break; - case 'x' : { - c = ScanHexNumber(2); - if (c == static_cast(unibrow::Utf8::kBadChar)) c = 'x'; - break; - } + case 'x' : c = ScanHexEscape(c, 2); break; case '0' : // fall through case '1' : // fall through case '2' : // fall through @@ -810,7 +803,7 @@ uc32 JavaScriptScanner::ScanIdentifierUnicodeEscape() { Advance(); if (c0_ != 'u') return unibrow::Utf8::kBadChar; Advance(); - uc32 c = ScanHexNumber(4); + uc32 c = ScanHexEscape('u', 4); // We do not allow a unicode escape sequence to start another // unicode escape sequence. if (c == '\\') return unibrow::Utf8::kBadChar; diff --git a/src/scanner-base.h b/src/scanner-base.h index da74757648..3e1772a3d2 100644 --- a/src/scanner-base.h +++ b/src/scanner-base.h @@ -419,7 +419,7 @@ class Scanner { } } - uc32 ScanHexNumber(int expected_length); + uc32 ScanHexEscape(uc32 c, int length); // Return the current source position. int source_pos() { diff --git a/test/mjsunit/regress/regress-1620.js b/test/mjsunit/regress/regress-1620.js deleted file mode 100644 index 8deed1e923..0000000000 --- a/test/mjsunit/regress/regress-1620.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2011 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// See: http://code.google.com/p/v8/issues/detail?id=1620 - -assertThrows("var \\u\\u\\u = 42;"); -assertThrows("var \\u41 = 42;"); -assertThrows("var \\u123 = 42;"); -eval("var \\u1234 = 42;"); -assertEquals(42, eval("\u1234")); -assertThrows("var uuu = 42; var x = \\u\\u\\u");