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