Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index bdd9348ec41807662484b107c1bde98d9e8e56f1..e746ed4f5d582d4c50c4651941f21b469a8cd88c 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -437,6 +437,59 @@ bool ParserTraits::IsEvalOrArguments(Handle<String> identifier) const { |
} |
+bool ParserTraits::IsThisProperty(Expression* expression) { |
+ ASSERT(expression != NULL); |
+ Property* property = expression->AsProperty(); |
+ return property != NULL && |
+ property->obj()->AsVariableProxy() != NULL && |
+ property->obj()->AsVariableProxy()->is_this(); |
+} |
+ |
+ |
+void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, |
+ Expression* right) { |
+ ASSERT(left != NULL); |
+ if (left->AsProperty() != NULL && |
+ right->AsFunctionLiteral() != NULL) { |
+ right->AsFunctionLiteral()->set_pretenure(); |
+ } |
+} |
+ |
+ |
+Expression* ParserTraits::ValidateAssignmentLeftHandSide( |
+ Expression* expression) const { |
+ ASSERT(expression != NULL); |
+ if (!expression->IsValidLeftHandSide()) { |
+ Handle<String> message = |
+ parser_->isolate()->factory()->invalid_lhs_in_assignment_string(); |
+ expression = parser_->NewThrowReferenceError(message); |
+ } |
+ return expression; |
+} |
+ |
+ |
+Expression* ParserTraits::MarkExpressionAsLValue(Expression* expression) { |
+ VariableProxy* proxy = expression != NULL |
+ ? expression->AsVariableProxy() |
+ : NULL; |
+ if (proxy != NULL) proxy->MarkAsLValue(); |
+ return expression; |
+} |
+ |
+ |
+void ParserTraits::CheckStrictModeLValue(Expression* expression, |
+ bool* ok) { |
+ VariableProxy* lhs = expression != NULL |
+ ? expression->AsVariableProxy() |
+ : NULL; |
+ if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { |
+ parser_->ReportMessage("strict_eval_arguments", |
+ Vector<const char*>::empty()); |
+ *ok = false; |
+ } |
+} |
+ |
+ |
void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
const char* message, |
Vector<const char*> args) { |
@@ -566,11 +619,6 @@ Literal* ParserTraits::GetLiteralTheHole( |
} |
-Expression* ParserTraits::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
- return parser_->ParseAssignmentExpression(accept_IN, ok); |
-} |
- |
- |
Expression* ParserTraits::ParseV8Intrinsic(bool* ok) { |
return parser_->ParseV8Intrinsic(ok); |
} |
@@ -590,6 +638,16 @@ FunctionLiteral* ParserTraits::ParseFunctionLiteral( |
} |
+Expression* ParserTraits::ParseYieldExpression(bool* ok) { |
+ return parser_->ParseYieldExpression(ok); |
+} |
+ |
+ |
+Expression* ParserTraits::ParseConditionalExpression(bool accept_IN, bool* ok) { |
+ return parser_->ParseConditionalExpression(accept_IN, ok); |
+} |
+ |
+ |
Parser::Parser(CompilationInfo* info) |
: ParserBase<ParserTraits>(&scanner_, |
info->isolate()->stack_guard()->real_climit(), |
@@ -2877,85 +2935,6 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
} |
-// Precedence = 2 |
-Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
- // AssignmentExpression :: |
- // ConditionalExpression |
- // YieldExpression |
- // LeftHandSideExpression AssignmentOperator AssignmentExpression |
- |
- if (peek() == Token::YIELD && is_generator()) { |
- return ParseYieldExpression(ok); |
- } |
- |
- if (fni_ != NULL) fni_->Enter(); |
- Expression* expression = ParseConditionalExpression(accept_IN, CHECK_OK); |
- |
- if (!Token::IsAssignmentOp(peek())) { |
- if (fni_ != NULL) fni_->Leave(); |
- // Parsed conditional expression only (no assignment). |
- return expression; |
- } |
- |
- // Signal a reference error if the expression is an invalid left-hand |
- // side expression. We could report this as a syntax error here but |
- // for compatibility with JSC we choose to report the error at |
- // runtime. |
- // TODO(ES5): Should change parsing for spec conformance. |
- if (expression == NULL || !expression->IsValidLeftHandSide()) { |
- Handle<String> message = |
- isolate()->factory()->invalid_lhs_in_assignment_string(); |
- expression = NewThrowReferenceError(message); |
- } |
- |
- if (strict_mode() == STRICT) { |
- // Assignment to eval or arguments is disallowed in strict mode. |
- CheckStrictModeLValue(expression, CHECK_OK); |
- } |
- MarkAsLValue(expression); |
- |
- Token::Value op = Next(); // Get assignment operator. |
- int pos = position(); |
- Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
- |
- // TODO(1231235): We try to estimate the set of properties set by |
- // constructors. We define a new property whenever there is an |
- // assignment to a property of 'this'. We should probably only add |
- // properties if we haven't seen them before. Otherwise we'll |
- // probably overestimate the number of properties. |
- Property* property = expression ? expression->AsProperty() : NULL; |
- if (op == Token::ASSIGN && |
- property != NULL && |
- property->obj()->AsVariableProxy() != NULL && |
- property->obj()->AsVariableProxy()->is_this()) { |
- function_state_->AddProperty(); |
- } |
- |
- // If we assign a function literal to a property we pretenure the |
- // literal so it can be added as a constant function property. |
- if (property != NULL && right->AsFunctionLiteral() != NULL) { |
- right->AsFunctionLiteral()->set_pretenure(); |
- } |
- |
- if (fni_ != NULL) { |
- // Check if the right hand side is a call to avoid inferring a |
- // name if we're dealing with "a = function(){...}();"-like |
- // expression. |
- if ((op == Token::INIT_VAR |
- || op == Token::INIT_CONST_LEGACY |
- || op == Token::ASSIGN) |
- && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { |
- fni_->Infer(); |
- } else { |
- fni_->RemoveLastFunction(); |
- } |
- fni_->Leave(); |
- } |
- |
- return factory()->NewAssignment(op, expression, right, pos); |
-} |
- |
- |
Expression* Parser::ParseYieldExpression(bool* ok) { |
// YieldExpression :: |
// 'yield' '*'? AssignmentExpression |
@@ -3184,7 +3163,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
// Prefix expression operand in strict mode may not be eval or arguments. |
CheckStrictModeLValue(expression, CHECK_OK); |
} |
- MarkAsLValue(expression); |
+ MarkExpressionAsLValue(expression); |
return factory()->NewCountOperation(op, |
true /* prefix */, |
@@ -3218,7 +3197,7 @@ Expression* Parser::ParsePostfixExpression(bool* ok) { |
// Postfix expression operand in strict mode may not be eval or arguments. |
CheckStrictModeLValue(expression, CHECK_OK); |
} |
- MarkAsLValue(expression); |
+ MarkExpressionAsLValue(expression); |
Token::Value next = Next(); |
expression = |
@@ -3974,31 +3953,6 @@ Literal* Parser::GetLiteralUndefined(int position) { |
} |
-void Parser::MarkAsLValue(Expression* expression) { |
- VariableProxy* proxy = expression != NULL |
- ? expression->AsVariableProxy() |
- : NULL; |
- |
- if (proxy != NULL) proxy->MarkAsLValue(); |
-} |
- |
- |
-// Checks LHS expression for assignment and prefix/postfix increment/decrement |
-// in strict mode. |
-void Parser::CheckStrictModeLValue(Expression* expression, |
- bool* ok) { |
- ASSERT(strict_mode() == STRICT); |
- VariableProxy* lhs = expression != NULL |
- ? expression->AsVariableProxy() |
- : NULL; |
- |
- if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { |
- ReportMessage("strict_eval_arguments", Vector<const char*>::empty()); |
- *ok = false; |
- } |
-} |
- |
- |
void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { |
Declaration* decl = scope->CheckConflictingVarDeclarations(); |
if (decl != NULL) { |