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