Reviewers: marja,

Description:
[strong] Deprecate arguments

[email protected]
BUG=

Please review this at https://codereview.chromium.org/932333004/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+53, -15 lines):
  M src/messages.js
  M src/parser.h
  M src/parser.cc
  M src/preparser.h
  A test/mjsunit/strong/arguments.js


Index: src/messages.js
diff --git a/src/messages.js b/src/messages.js
index 19d61041d1942c400b9fce07e56ca39a2130d38a..d5888b8e8e3285700b0ec13dfb03da365f1d36c4 100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -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_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"], strong_var: ["Please don't use 'var' in strong mode, use 'let' or 'const' instead"],
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index bb8cb52b75068f0aee6941880fd7d1ecfe58bd29..30e4c4581d05de72fb8408e6d022f24df340981e 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -382,9 +382,18 @@ class TargetScope BASE_EMBEDDED {
// ----------------------------------------------------------------------------
 // Implementation of Parser

+bool ParserTraits::IsEval(const AstRawString* identifier) const {
+  return identifier == parser_->ast_value_factory()->eval_string();
+}
+
+
+bool ParserTraits::IsArguments(const AstRawString* identifier) const {
+  return identifier == parser_->ast_value_factory()->arguments_string();
+}
+
+
bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const {
-  return identifier == parser_->ast_value_factory()->eval_string() ||
-         identifier == parser_->ast_value_factory()->arguments_string();
+  return IsEval(identifier) || IsArguments(identifier);
 }


Index: src/parser.h
diff --git a/src/parser.h b/src/parser.h
index ff36fe90e0b0cd1c9a5c44f6086b7dc6ba069e33..8f829e2c770a3ca57acac779475a33e4831e0c71 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -383,6 +383,8 @@ class ParserTraits {
   explicit ParserTraits(Parser* parser) : parser_(parser) {}

   // Helper functions for recursive descent.
+  bool IsEval(const AstRawString* identifier) const;
+  bool IsArguments(const AstRawString* identifier) const;
   bool IsEvalOrArguments(const AstRawString* identifier) const;
V8_INLINE bool IsFutureStrictReserved(const AstRawString* identifier) const;

Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 1cd5dadf0d13557e9e978c5a0bee07f95680c89c..422773e1cb6a67d4fa6f1b08fb3066de835c61ab 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -708,17 +708,13 @@ class PreParserIdentifier {
     return PreParserIdentifier(kConstructorIdentifier);
   }
   bool IsEval() const { return type_ == kEvalIdentifier; }
-  bool IsArguments(const AstValueFactory* = NULL) const {
-    return type_ == kArgumentsIdentifier;
-  }
+  bool IsArguments() const { return type_ == kArgumentsIdentifier; }
+  bool IsEvalOrArguments() const { return IsEval() || IsArguments(); }
   bool IsLet() const { return type_ == kLetIdentifier; }
   bool IsStatic() const { return type_ == kStaticIdentifier; }
   bool IsYield() const { return type_ == kYieldIdentifier; }
   bool IsPrototype() const { return type_ == kPrototypeIdentifier; }
   bool IsConstructor() const { return type_ == kConstructorIdentifier; }
-  bool IsEvalOrArguments() const {
-    return type_ == kEvalIdentifier || type_ == kArgumentsIdentifier;
-  }
bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; }
   bool IsFutureStrictReserved() const {
     return type_ == kFutureStrictReservedIdentifier ||
@@ -1219,6 +1215,14 @@ class PreParserTraits {
explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}

   // Helper functions for recursive descent.
+  static bool IsEval(PreParserIdentifier identifier) {
+    return identifier.IsEval();
+  }
+
+  static bool IsArguments(PreParserIdentifier identifier) {
+    return identifier.IsArguments();
+  }
+
   static bool IsEvalOrArguments(PreParserIdentifier identifier) {
     return identifier.IsEvalOrArguments();
   }
@@ -1714,12 +1718,18 @@ typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier(
   Token::Value next = Next();
   if (next == Token::IDENTIFIER) {
     IdentifierT name = this->GetSymbol(scanner());
-    if (allow_eval_or_arguments == kDontAllowEvalOrArguments &&
-        is_strict(language_mode()) && this->IsEvalOrArguments(name)) {
-      ReportMessage("strict_eval_arguments");
-      *ok = false;
+    if (allow_eval_or_arguments == kDontAllowEvalOrArguments) {
+      if (is_strict(language_mode()) && this->IsEvalOrArguments(name)) {
+        ReportMessage("strict_eval_arguments");
+        *ok = false;
+      }
+    } else {
+      if (is_strong(language_mode()) && this->IsArguments(name)) {
+        ReportMessage("strong_arguments");
+        *ok = false;
+      }
     }
- if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage();
+    if (this->IsArguments(name)) scope_->RecordArgumentsUsage();
     return name;
   } else if (is_sloppy(language_mode()) &&
              (next == Token::FUTURE_STRICT_RESERVED_WORD ||
@@ -1752,7 +1762,7 @@ typename ParserBase<Traits>::IdentifierT ParserBase<
   }

   IdentifierT name = this->GetSymbol(scanner());
- if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage();
+  if (this->IsArguments(name)) scope_->RecordArgumentsUsage();
   return name;
 }

@@ -1770,7 +1780,7 @@ ParserBase<Traits>::ParseIdentifierName(bool* ok) {
   }

   IdentifierT name = this->GetSymbol(scanner());
- if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage();
+  if (this->IsArguments(name)) scope_->RecordArgumentsUsage();
   return name;
 }

Index: test/mjsunit/strong/arguments.js
diff --git a/test/mjsunit/strong/arguments.js b/test/mjsunit/strong/arguments.js
new file mode 100644
index 0000000000000000000000000000000000000000..b40b661ccf2243d565a42b3aa8567ddab3486536
--- /dev/null
+++ b/test/mjsunit/strong/arguments.js
@@ -0,0 +1,16 @@
+// 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 NoArguments() {
+  assertThrows("'use strong'; arguments", SyntaxError);
+  assertThrows("'use strong'; function f() { arguments }", SyntaxError);
+ assertThrows("'use strong'; let f = function() { arguments }", SyntaxError);
+  assertThrows("'use strong'; let f = () => arguments", SyntaxError);
+  // The following are strict mode errors already.
+  assertThrows("'use strong'; let arguments", SyntaxError);
+  assertThrows("'use strong'; function f(arguments) {}", SyntaxError);
+  assertThrows("'use strong'; let f = (arguments) => {}", SyntaxError);
+})();


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to