| 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;
|
| }
|
|
|
|
|