Chromium Code Reviews| Index: src/preparser.h |
| diff --git a/src/preparser.h b/src/preparser.h |
| index 87addfbb9e8e89ec27a0ec19187c7862e6774e38..d5b7f94da61c6338a370c6643e137b9bdb221c7f 100644 |
| --- a/src/preparser.h |
| +++ b/src/preparser.h |
| @@ -610,7 +610,9 @@ class PreParserIdentifier { |
| return PreParserIdentifier(kYieldIdentifier); |
| } |
| bool IsEval() const { return type_ == kEvalIdentifier; } |
| - bool IsArguments() const { return type_ == kArgumentsIdentifier; } |
| + bool IsArguments(const AstValueFactory*) const { |
|
rossberg
2014/09/10 06:33:56
Why is this change necessary when the argument isn
|
| + return type_ == kArgumentsIdentifier; |
| + } |
| bool IsEvalOrArguments() const { return type_ >= kEvalIdentifier; } |
| bool IsYield() const { return type_ == kYieldIdentifier; } |
| bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } |
| @@ -826,7 +828,7 @@ class PreParserExpression { |
| const PreParserIdentifier ident = AsIdentifier(); |
| // A valid identifier can be an arrow function parameter list |
| // except for eval, arguments, yield, and reserved keywords. |
| - if (ident.IsEval() || ident.IsArguments() || ident.IsYield() || |
| + if (ident.IsEval() || ident.IsArguments(nullptr) || ident.IsYield() || |
|
rossberg
2014/09/10 06:33:56
Unfortunately, we can't use C++11 yet...
|
| ident.IsFutureStrictReserved()) |
| return 0; |
| return kBinaryOperationArrowParamList; |
| @@ -934,6 +936,8 @@ class PreParserScope { |
| bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } |
| void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} |
| + void RecordArgumentsUsage() {} |
| + void RecordThisUsage() {} |
| // Allow scope->Foo() to work. |
| PreParserScope* operator->() { return this; } |
| @@ -1599,6 +1603,8 @@ typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
| ReportMessage("strict_eval_arguments"); |
| *ok = false; |
| } |
| + if (name->IsArguments(this->ast_value_factory())) |
| + scope_->RecordArgumentsUsage(); |
| return name; |
| } else if (strict_mode() == SLOPPY && |
| (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| @@ -1629,7 +1635,11 @@ typename ParserBase<Traits>::IdentifierT ParserBase< |
| *ok = false; |
| return Traits::EmptyIdentifier(); |
| } |
| - return this->GetSymbol(scanner()); |
| + |
| + IdentifierT name = this->GetSymbol(scanner()); |
| + if (name->IsArguments(this->ast_value_factory())) |
| + scope_->RecordArgumentsUsage(); |
| + return name; |
| } |
| @@ -1644,7 +1654,11 @@ ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
| *ok = false; |
| return Traits::EmptyIdentifier(); |
| } |
| - return this->GetSymbol(scanner()); |
| + |
| + IdentifierT name = this->GetSymbol(scanner()); |
| + if (name->IsArguments(this->ast_value_factory())) |
| + scope_->RecordArgumentsUsage(); |
| + return name; |
| } |
| @@ -1721,6 +1735,7 @@ ParserBase<Traits>::ParsePrimaryExpression(bool* ok) { |
| switch (token) { |
| case Token::THIS: { |
| Consume(Token::THIS); |
| + scope_->RecordThisUsage(); |
| result = this->ThisExpression(scope_, factory()); |
| break; |
| } |