[strong] Deprecate ellisions
authorrossberg <rossberg@chromium.org>
Tue, 24 Feb 2015 12:50:56 +0000 (04:50 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 24 Feb 2015 12:51:08 +0000 (12:51 +0000)
R=marja@chromium.org
BUG=

Review URL: https://codereview.chromium.org/950303002

Cr-Commit-Position: refs/heads/master@{#26820}

src/messages.js
src/preparser.h
test/mjsunit/strong/arrays.js [new file with mode: 0644]

index 7d98cea1922bf39505b3b556525da944ba4c419b..9ec122370eff0cf5eb5619cca3865a9d6f91b909 100644 (file)
@@ -161,6 +161,7 @@ var kMessages = {
   strict_cannot_assign:          ["Cannot assign to read only '", "%0", "' in strict mode"],
   strict_poison_pill:            ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
   strict_caller:                 ["Illegal access to a strict mode caller function."],
+  strong_ellision:               ["Please don't use arrays with holes in strong mode, use maps instead"],
   strong_arguments:              ["Please don't use 'arguments' in strong mode, use '...args' instead"],
   strong_equal:                  ["Please don't use '==' or '!=' in strong mode, use '===' or '!==' instead"],
   strong_delete:                 ["Please don't use 'delete' in strong mode, use maps or sets instead"],
index 8171f9433a4627c9b8fe5f1c5ac6a72d73a9ae4a..41b3a31f0e1169068eaf2968fe55b67fc3904ee4 100644 (file)
@@ -2013,6 +2013,11 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
   while (peek() != Token::RBRACK) {
     ExpressionT elem = this->EmptyExpression();
     if (peek() == Token::COMMA) {
+      if (is_strong(language_mode())) {
+        ReportMessageAt(scanner()->peek_location(), "strong_ellision");
+        *ok = false;
+        return this->EmptyExpression();
+      }
       elem = this->GetLiteralTheHole(peek_position(), factory());
     } else {
       elem = this->ParseAssignmentExpression(true, CHECK_OK);
diff --git a/test/mjsunit/strong/arrays.js b/test/mjsunit/strong/arrays.js
new file mode 100644 (file)
index 0000000..b9e4fad
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --strong-mode
+
+(function NoEllisions() {
+  assertThrows("'use strong'; [,]", SyntaxError);
+  assertThrows("'use strong'; [,3]", SyntaxError);
+  assertThrows("'use strong'; [3,,4]", SyntaxError);
+  assertTrue(eval("'use strong'; [3,] !== [3,4,]"));
+})();