| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 3627bafb96eee79d5f785654004ec5b73a229379..7033fe42d92a9978e15145efe5e84b497e93b81c 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -456,18 +456,6 @@ void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left,
|
| }
|
|
|
|
|
| -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()
|
| @@ -492,7 +480,8 @@ void ParserTraits::CheckStrictModeLValue(Expression* expression,
|
|
|
| void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| const char* message,
|
| - Vector<const char*> args) {
|
| + Vector<const char*> args,
|
| + bool is_reference_error) {
|
| if (parser_->stack_overflow()) {
|
| // Suppress the error message (syntax error or such) in the presence of a
|
| // stack overflow. The isolate allows only one pending exception at at time
|
| @@ -509,21 +498,25 @@ void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| elements->set(i, *arg_string);
|
| }
|
| Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
|
| - Handle<Object> result = factory->NewSyntaxError(message, array);
|
| + Handle<Object> result = is_reference_error
|
| + ? factory->NewReferenceError(message, array)
|
| + : factory->NewSyntaxError(message, array);
|
| parser_->isolate()->Throw(*result, &location);
|
| }
|
|
|
|
|
| void ParserTraits::ReportMessage(const char* message,
|
| - Vector<Handle<String> > args) {
|
| + Vector<Handle<String> > args,
|
| + bool is_reference_error) {
|
| Scanner::Location source_location = parser_->scanner()->location();
|
| - ReportMessageAt(source_location, message, args);
|
| + ReportMessageAt(source_location, message, args, is_reference_error);
|
| }
|
|
|
|
|
| void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| const char* message,
|
| - Vector<Handle<String> > args) {
|
| + Vector<Handle<String> > args,
|
| + bool is_reference_error) {
|
| if (parser_->stack_overflow()) {
|
| // Suppress the error message (syntax error or such) in the presence of a
|
| // stack overflow. The isolate allows only one pending exception at at time
|
| @@ -539,7 +532,9 @@ void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| elements->set(i, *args[i]);
|
| }
|
| Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
|
| - Handle<Object> result = factory->NewSyntaxError(message, array);
|
| + Handle<Object> result = is_reference_error
|
| + ? factory->NewReferenceError(message, array)
|
| + : factory->NewSyntaxError(message, array);
|
| parser_->isolate()->Throw(*result, &location);
|
| }
|
|
|
| @@ -2844,19 +2839,16 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| init = variable_statement;
|
| }
|
| } else {
|
| + Scanner::Location lhs_location = scanner()->peek_location();
|
| Expression* expression = ParseExpression(false, CHECK_OK);
|
| ForEachStatement::VisitMode mode;
|
| bool accept_OF = expression->AsVariableProxy();
|
|
|
| if (CheckInOrOf(accept_OF, &mode)) {
|
| - // 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.
|
| if (expression == NULL || !expression->IsValidLeftHandSide()) {
|
| - Handle<String> message =
|
| - isolate()->factory()->invalid_lhs_in_for_in_string();
|
| - expression = NewThrowReferenceError(message);
|
| + ReportMessageAt(lhs_location, "invalid_lhs_in_for", true);
|
| + *ok = false;
|
| + return NULL;
|
| }
|
| ForEachStatement* loop =
|
| factory()->NewForEachStatement(mode, labels, pos);
|
| @@ -3125,15 +3117,12 @@ Expression* Parser::ParseUnaryExpression(bool* ok) {
|
|
|
| } else if (Token::IsCountOp(op)) {
|
| op = Next();
|
| + Scanner::Location lhs_location = scanner()->peek_location();
|
| Expression* expression = ParseUnaryExpression(CHECK_OK);
|
| - // 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.
|
| if (expression == NULL || !expression->IsValidLeftHandSide()) {
|
| - Handle<String> message =
|
| - isolate()->factory()->invalid_lhs_in_prefix_op_string();
|
| - expression = NewThrowReferenceError(message);
|
| + ReportMessageAt(lhs_location, "invalid_lhs_in_prefix_op", true);
|
| + *ok = false;
|
| + return NULL;
|
| }
|
|
|
| if (strict_mode() == STRICT) {
|
| @@ -3157,17 +3146,14 @@ Expression* Parser::ParsePostfixExpression(bool* ok) {
|
| // PostfixExpression ::
|
| // LeftHandSideExpression ('++' | '--')?
|
|
|
| + Scanner::Location lhs_location = scanner()->peek_location();
|
| Expression* expression = ParseLeftHandSideExpression(CHECK_OK);
|
| if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| Token::IsCountOp(peek())) {
|
| - // 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.
|
| if (expression == NULL || !expression->IsValidLeftHandSide()) {
|
| - Handle<String> message =
|
| - isolate()->factory()->invalid_lhs_in_postfix_op_string();
|
| - expression = NewThrowReferenceError(message);
|
| + ReportMessageAt(lhs_location, "invalid_lhs_in_postfix_op", true);
|
| + *ok = false;
|
| + return NULL;
|
| }
|
|
|
| if (strict_mode() == STRICT) {
|
|
|