| Index: src/parser.cc
|
| ===================================================================
|
| --- src/parser.cc (revision 2993)
|
| +++ src/parser.cc (working copy)
|
| @@ -2660,25 +2660,13 @@
|
| } else {
|
| Expression* expression = ParseExpression(false, CHECK_OK);
|
| if (peek() == Token::IN) {
|
| - // Report syntax error if the expression is an invalid
|
| - // left-hand side 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.
|
| if (expression == NULL || !expression->IsValidLeftHandSide()) {
|
| - if (expression != NULL && expression->AsCall() != NULL) {
|
| - // According to ECMA-262 host function calls are permitted to
|
| - // return references. This cannot happen in our system so we
|
| - // will always get an error. We could report this as a syntax
|
| - // error here but for compatibility with KJS and SpiderMonkey we
|
| - // choose to report the error at runtime.
|
| - Handle<String> type = Factory::invalid_lhs_in_for_in_symbol();
|
| - expression = NewThrowReferenceError(type);
|
| - } else {
|
| - // Invalid left hand side expressions that are not function
|
| - // calls are reported as syntax errors at compile time.
|
| - ReportMessage("invalid_lhs_in_for_in",
|
| - Vector<const char*>::empty());
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| + Handle<String> type = Factory::invalid_lhs_in_for_in_symbol();
|
| + expression = NewThrowReferenceError(type);
|
| }
|
| ForInStatement* loop = NEW(ForInStatement(labels));
|
| Target target(this, loop);
|
| @@ -2755,30 +2743,15 @@
|
| 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.
|
| if (expression == NULL || !expression->IsValidLeftHandSide()) {
|
| - if (expression != NULL && expression->AsCall() != NULL) {
|
| - // According to ECMA-262 host function calls are permitted to
|
| - // return references. This cannot happen in our system so we
|
| - // will always get an error. We could report this as a syntax
|
| - // error here but for compatibility with KJS and SpiderMonkey we
|
| - // choose to report the error at runtime.
|
| - Handle<String> type = Factory::invalid_lhs_in_assignment_symbol();
|
| - expression = NewThrowReferenceError(type);
|
| - } else {
|
| - // Invalid left hand side expressions that are not function
|
| - // calls are reported as syntax errors at compile time.
|
| - //
|
| - // NOTE: KJS sometimes delay the error reporting to runtime. If
|
| - // we want to be completely compatible we should do the same.
|
| - // For example: "(x++) = 42" gives a reference error at runtime
|
| - // with KJS whereas we report a syntax error at compile time.
|
| - ReportMessage("invalid_lhs_in_assignment", Vector<const char*>::empty());
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| + Handle<String> type = Factory::invalid_lhs_in_assignment_symbol();
|
| + expression = NewThrowReferenceError(type);
|
| }
|
|
|
| -
|
| Token::Value op = Next(); // Get assignment operator.
|
| int pos = scanner().location().beg_pos;
|
| Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| @@ -2951,45 +2924,37 @@
|
| Token::Value op = peek();
|
| if (Token::IsUnaryOp(op)) {
|
| op = Next();
|
| - Expression* x = ParseUnaryExpression(CHECK_OK);
|
| + Expression* expression = ParseUnaryExpression(CHECK_OK);
|
|
|
| // Compute some expressions involving only number literals.
|
| - if (x && x->AsLiteral() && x->AsLiteral()->handle()->IsNumber()) {
|
| - double x_val = x->AsLiteral()->handle()->Number();
|
| + if (expression != NULL && expression->AsLiteral() &&
|
| + expression->AsLiteral()->handle()->IsNumber()) {
|
| + double value = expression->AsLiteral()->handle()->Number();
|
| switch (op) {
|
| case Token::ADD:
|
| - return x;
|
| + return expression;
|
| case Token::SUB:
|
| - return NewNumberLiteral(-x_val);
|
| + return NewNumberLiteral(-value);
|
| case Token::BIT_NOT:
|
| - return NewNumberLiteral(~DoubleToInt32(x_val));
|
| + return NewNumberLiteral(~DoubleToInt32(value));
|
| default: break;
|
| }
|
| }
|
|
|
| - return NEW(UnaryOperation(op, x));
|
| + return NEW(UnaryOperation(op, expression));
|
|
|
| } else if (Token::IsCountOp(op)) {
|
| op = Next();
|
| - Expression* x = ParseUnaryExpression(CHECK_OK);
|
| - if (x == NULL || !x->IsValidLeftHandSide()) {
|
| - if (x != NULL && x->AsCall() != NULL) {
|
| - // According to ECMA-262 host function calls are permitted to
|
| - // return references. This cannot happen in our system so we
|
| - // will always get an error. We could report this as a syntax
|
| - // error here but for compatibility with KJS and SpiderMonkey we
|
| - // choose to report the error at runtime.
|
| - Handle<String> type = Factory::invalid_lhs_in_prefix_op_symbol();
|
| - x = NewThrowReferenceError(type);
|
| - } else {
|
| - // Invalid left hand side expressions that are not function
|
| - // calls are reported as syntax errors at compile time.
|
| - ReportMessage("invalid_lhs_in_prefix_op", Vector<const char*>::empty());
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| + 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> type = Factory::invalid_lhs_in_prefix_op_symbol();
|
| + expression = NewThrowReferenceError(type);
|
| }
|
| - return NEW(CountOperation(true /* prefix */, op, x));
|
| + return NEW(CountOperation(true /* prefix */, op, expression));
|
|
|
| } else {
|
| return ParsePostfixExpression(ok);
|
| @@ -3001,30 +2966,20 @@
|
| // PostfixExpression ::
|
| // LeftHandSideExpression ('++' | '--')?
|
|
|
| - Expression* result = ParseLeftHandSideExpression(CHECK_OK);
|
| + Expression* expression = ParseLeftHandSideExpression(CHECK_OK);
|
| if (!scanner_.has_line_terminator_before_next() && Token::IsCountOp(peek())) {
|
| - if (result == NULL || !result->IsValidLeftHandSide()) {
|
| - if (result != NULL && result->AsCall() != NULL) {
|
| - // According to ECMA-262 host function calls are permitted to
|
| - // return references. This cannot happen in our system so we
|
| - // will always get an error. We could report this as a syntax
|
| - // error here but for compatibility with KJS and SpiderMonkey we
|
| - // choose to report the error at runtime.
|
| - Handle<String> type = Factory::invalid_lhs_in_postfix_op_symbol();
|
| - result = NewThrowReferenceError(type);
|
| - } else {
|
| - // Invalid left hand side expressions that are not function
|
| - // calls are reported as syntax errors at compile time.
|
| - ReportMessage("invalid_lhs_in_postfix_op",
|
| - Vector<const char*>::empty());
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| + // 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> type = Factory::invalid_lhs_in_postfix_op_symbol();
|
| + expression = NewThrowReferenceError(type);
|
| }
|
| Token::Value next = Next();
|
| - result = NEW(CountOperation(false /* postfix */, next, result));
|
| + expression = NEW(CountOperation(false /* postfix */, next, expression));
|
| }
|
| - return result;
|
| + return expression;
|
| }
|
|
|
|
|
|
|