| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 Handle<String> no_name = isolate()->factory()->empty_string(); | 675 Handle<String> no_name = isolate()->factory()->empty_string(); |
| 676 | 676 |
| 677 FunctionLiteral* result = NULL; | 677 FunctionLiteral* result = NULL; |
| 678 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE); | 678 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE); |
| 679 info->SetGlobalScope(scope); | 679 info->SetGlobalScope(scope); |
| 680 if (!info->context().is_null()) { | 680 if (!info->context().is_null()) { |
| 681 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone()); | 681 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone()); |
| 682 } | 682 } |
| 683 original_scope_ = scope; | 683 original_scope_ = scope; |
| 684 if (info->is_eval()) { | 684 if (info->is_eval()) { |
| 685 if (!scope->is_global_scope() || info->language_mode() != CLASSIC_MODE) { | 685 if (!scope->is_global_scope() || info->language_mode() != SLOPPY_MODE) { |
| 686 scope = NewScope(scope, EVAL_SCOPE); | 686 scope = NewScope(scope, EVAL_SCOPE); |
| 687 } | 687 } |
| 688 } else if (info->is_global()) { | 688 } else if (info->is_global()) { |
| 689 scope = NewScope(scope, GLOBAL_SCOPE); | 689 scope = NewScope(scope, GLOBAL_SCOPE); |
| 690 } | 690 } |
| 691 scope->set_start_position(0); | 691 scope->set_start_position(0); |
| 692 scope->set_end_position(source->length()); | 692 scope->set_end_position(source->length()); |
| 693 | 693 |
| 694 // Compute the parsing mode. | 694 // Compute the parsing mode. |
| 695 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; | 695 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; |
| 696 if (allow_natives_syntax() || | 696 if (allow_natives_syntax() || |
| 697 extension_ != NULL || | 697 extension_ != NULL || |
| 698 scope->is_eval_scope()) { | 698 scope->is_eval_scope()) { |
| 699 mode = PARSE_EAGERLY; | 699 mode = PARSE_EAGERLY; |
| 700 } | 700 } |
| 701 ParsingModeScope parsing_mode(this, mode); | 701 ParsingModeScope parsing_mode(this, mode); |
| 702 | 702 |
| 703 // Enters 'scope'. | 703 // Enters 'scope'. |
| 704 FunctionState function_state(&function_state_, &scope_, scope, zone()); | 704 FunctionState function_state(&function_state_, &scope_, scope, zone()); |
| 705 | 705 |
| 706 scope_->SetLanguageMode(info->language_mode()); | 706 scope_->SetLanguageMode(info->language_mode()); |
| 707 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 707 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
| 708 bool ok = true; | 708 bool ok = true; |
| 709 int beg_pos = scanner()->location().beg_pos; | 709 int beg_pos = scanner()->location().beg_pos; |
| 710 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); | 710 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); |
| 711 if (ok && !scope_->is_classic_mode()) { | 711 if (ok && !scope_->is_sloppy_mode()) { |
| 712 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 712 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
| 713 } | 713 } |
| 714 | 714 |
| 715 if (ok && is_extended_mode()) { | 715 if (ok && is_extended_mode()) { |
| 716 CheckConflictingVarDeclarations(scope_, &ok); | 716 CheckConflictingVarDeclarations(scope_, &ok); |
| 717 } | 717 } |
| 718 | 718 |
| 719 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { | 719 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { |
| 720 if (body->length() != 1 || | 720 if (body->length() != 1 || |
| 721 !body->at(0)->IsExpressionStatement() || | 721 !body->at(0)->IsExpressionStatement() || |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 { | 810 { |
| 811 // Parse the function literal. | 811 // Parse the function literal. |
| 812 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); | 812 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); |
| 813 info()->SetGlobalScope(scope); | 813 info()->SetGlobalScope(scope); |
| 814 if (!info()->closure().is_null()) { | 814 if (!info()->closure().is_null()) { |
| 815 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | 815 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, |
| 816 zone()); | 816 zone()); |
| 817 } | 817 } |
| 818 original_scope_ = scope; | 818 original_scope_ = scope; |
| 819 FunctionState function_state(&function_state_, &scope_, scope, zone()); | 819 FunctionState function_state(&function_state_, &scope_, scope, zone()); |
| 820 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); | 820 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_sloppy_mode()); |
| 821 ASSERT(scope->language_mode() != EXTENDED_MODE || | 821 ASSERT(scope->language_mode() != EXTENDED_MODE || |
| 822 info()->is_extended_mode()); | 822 info()->is_extended_mode()); |
| 823 ASSERT(info()->language_mode() == shared_info->language_mode()); | 823 ASSERT(info()->language_mode() == shared_info->language_mode()); |
| 824 scope->SetLanguageMode(shared_info->language_mode()); | 824 scope->SetLanguageMode(shared_info->language_mode()); |
| 825 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 825 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
| 826 ? (shared_info->is_anonymous() | 826 ? (shared_info->is_anonymous() |
| 827 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 827 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
| 828 : FunctionLiteral::NAMED_EXPRESSION) | 828 : FunctionLiteral::NAMED_EXPRESSION) |
| 829 : FunctionLiteral::DECLARATION; | 829 : FunctionLiteral::DECLARATION; |
| 830 bool ok = true; | 830 bool ok = true; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 // A shot at a directive. | 890 // A shot at a directive. |
| 891 ExpressionStatement* e_stat; | 891 ExpressionStatement* e_stat; |
| 892 Literal* literal; | 892 Literal* literal; |
| 893 // Still processing directive prologue? | 893 // Still processing directive prologue? |
| 894 if ((e_stat = stat->AsExpressionStatement()) != NULL && | 894 if ((e_stat = stat->AsExpressionStatement()) != NULL && |
| 895 (literal = e_stat->expression()->AsLiteral()) != NULL && | 895 (literal = e_stat->expression()->AsLiteral()) != NULL && |
| 896 literal->value()->IsString()) { | 896 literal->value()->IsString()) { |
| 897 Handle<String> directive = Handle<String>::cast(literal->value()); | 897 Handle<String> directive = Handle<String>::cast(literal->value()); |
| 898 | 898 |
| 899 // Check "use strict" directive (ES5 14.1). | 899 // Check "use strict" directive (ES5 14.1). |
| 900 if (scope_->is_classic_mode() && | 900 if (scope_->is_sloppy_mode() && |
| 901 directive->Equals(isolate()->heap()->use_strict_string()) && | 901 directive->Equals(isolate()->heap()->use_strict_string()) && |
| 902 token_loc.end_pos - token_loc.beg_pos == | 902 token_loc.end_pos - token_loc.beg_pos == |
| 903 isolate()->heap()->use_strict_string()->length() + 2) { | 903 isolate()->heap()->use_strict_string()->length() + 2) { |
| 904 // TODO(mstarzinger): Global strict eval calls, need their own scope | 904 // TODO(mstarzinger): Global strict eval calls, need their own scope |
| 905 // as specified in ES5 10.4.2(3). The correct fix would be to always | 905 // as specified in ES5 10.4.2(3). The correct fix would be to always |
| 906 // add this scope in DoParseProgram(), but that requires adaptations | 906 // add this scope in DoParseProgram(), but that requires adaptations |
| 907 // all over the code base, so we go with a quick-fix for now. | 907 // all over the code base, so we go with a quick-fix for now. |
| 908 // In the same manner, we have to patch the parsing mode. | 908 // In the same manner, we have to patch the parsing mode. |
| 909 if (is_eval && !scope_->is_eval_scope()) { | 909 if (is_eval && !scope_->is_eval_scope()) { |
| 910 ASSERT(scope_->is_global_scope()); | 910 ASSERT(scope_->is_global_scope()); |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1436 // (Ecma 262 5th Edition, clause 14): | 1436 // (Ecma 262 5th Edition, clause 14): |
| 1437 // SourceElement: | 1437 // SourceElement: |
| 1438 // Statement | 1438 // Statement |
| 1439 // FunctionDeclaration | 1439 // FunctionDeclaration |
| 1440 // Common language extension is to allow function declaration in place | 1440 // Common language extension is to allow function declaration in place |
| 1441 // of any statement. This language extension is disabled in strict mode. | 1441 // of any statement. This language extension is disabled in strict mode. |
| 1442 // | 1442 // |
| 1443 // In Harmony mode, this case also handles the extension: | 1443 // In Harmony mode, this case also handles the extension: |
| 1444 // Statement: | 1444 // Statement: |
| 1445 // GeneratorDeclaration | 1445 // GeneratorDeclaration |
| 1446 if (!scope_->is_classic_mode()) { | 1446 if (!scope_->is_sloppy_mode()) { |
| 1447 ReportMessageAt(scanner()->peek_location(), "strict_function"); | 1447 ReportMessageAt(scanner()->peek_location(), "strict_function"); |
| 1448 *ok = false; | 1448 *ok = false; |
| 1449 return NULL; | 1449 return NULL; |
| 1450 } | 1450 } |
| 1451 return ParseFunctionDeclaration(NULL, ok); | 1451 return ParseFunctionDeclaration(NULL, ok); |
| 1452 } | 1452 } |
| 1453 | 1453 |
| 1454 case Token::DEBUGGER: | 1454 case Token::DEBUGGER: |
| 1455 return ParseDebuggerStatement(ok); | 1455 return ParseDebuggerStatement(ok); |
| 1456 | 1456 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1560 declaration_scope->AddDeclaration(declaration); | 1560 declaration_scope->AddDeclaration(declaration); |
| 1561 | 1561 |
| 1562 if (mode == CONST && declaration_scope->is_global_scope()) { | 1562 if (mode == CONST && declaration_scope->is_global_scope()) { |
| 1563 // For global const variables we bind the proxy to a variable. | 1563 // For global const variables we bind the proxy to a variable. |
| 1564 ASSERT(resolve); // should be set by all callers | 1564 ASSERT(resolve); // should be set by all callers |
| 1565 Variable::Kind kind = Variable::NORMAL; | 1565 Variable::Kind kind = Variable::NORMAL; |
| 1566 var = new(zone()) Variable( | 1566 var = new(zone()) Variable( |
| 1567 declaration_scope, name, mode, true, kind, | 1567 declaration_scope, name, mode, true, kind, |
| 1568 kNeedsInitialization, proxy->interface()); | 1568 kNeedsInitialization, proxy->interface()); |
| 1569 } else if (declaration_scope->is_eval_scope() && | 1569 } else if (declaration_scope->is_eval_scope() && |
| 1570 declaration_scope->is_classic_mode()) { | 1570 declaration_scope->is_sloppy_mode()) { |
| 1571 // For variable declarations in a non-strict eval scope the proxy is bound | 1571 // For variable declarations in a sloppy eval scope the proxy is bound |
| 1572 // to a lookup variable to force a dynamic declaration using the | 1572 // to a lookup variable to force a dynamic declaration using the |
| 1573 // DeclareContextSlot runtime function. | 1573 // DeclareContextSlot runtime function. |
| 1574 Variable::Kind kind = Variable::NORMAL; | 1574 Variable::Kind kind = Variable::NORMAL; |
| 1575 var = new(zone()) Variable( | 1575 var = new(zone()) Variable( |
| 1576 declaration_scope, name, mode, true, kind, | 1576 declaration_scope, name, mode, true, kind, |
| 1577 declaration->initialization(), proxy->interface()); | 1577 declaration->initialization(), proxy->interface()); |
| 1578 var->AllocateTo(Variable::LOOKUP, -1); | 1578 var->AllocateTo(Variable::LOOKUP, -1); |
| 1579 resolve = true; | 1579 resolve = true; |
| 1580 } | 1580 } |
| 1581 | 1581 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 if (peek() == Token::VAR) { | 1819 if (peek() == Token::VAR) { |
| 1820 Consume(Token::VAR); | 1820 Consume(Token::VAR); |
| 1821 } else if (peek() == Token::CONST) { | 1821 } else if (peek() == Token::CONST) { |
| 1822 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: | 1822 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: |
| 1823 // | 1823 // |
| 1824 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' | 1824 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' |
| 1825 // | 1825 // |
| 1826 // * It is a Syntax Error if the code that matches this production is not | 1826 // * It is a Syntax Error if the code that matches this production is not |
| 1827 // contained in extended code. | 1827 // contained in extended code. |
| 1828 // | 1828 // |
| 1829 // However disallowing const in classic mode will break compatibility with | 1829 // However disallowing const in sloppy mode will break compatibility with |
| 1830 // existing pages. Therefore we keep allowing const with the old | 1830 // existing pages. Therefore we keep allowing const with the old |
| 1831 // non-harmony semantics in classic mode. | 1831 // non-harmony semantics in sloppy mode. |
| 1832 Consume(Token::CONST); | 1832 Consume(Token::CONST); |
| 1833 switch (scope_->language_mode()) { | 1833 switch (scope_->language_mode()) { |
| 1834 case CLASSIC_MODE: | 1834 case SLOPPY_MODE: |
| 1835 mode = CONST; | 1835 mode = CONST; |
| 1836 init_op = Token::INIT_CONST; | 1836 init_op = Token::INIT_CONST; |
| 1837 break; | 1837 break; |
| 1838 case STRICT_MODE: | 1838 case STRICT_MODE: |
| 1839 ReportMessage("strict_const", Vector<const char*>::empty()); | 1839 ReportMessage("strict_const", Vector<const char*>::empty()); |
| 1840 *ok = false; | 1840 *ok = false; |
| 1841 return NULL; | 1841 return NULL; |
| 1842 case EXTENDED_MODE: | 1842 case EXTENDED_MODE: |
| 1843 if (var_context == kStatement) { | 1843 if (var_context == kStatement) { |
| 1844 // In extended mode 'const' declarations are only allowed in source | 1844 // In extended mode 'const' declarations are only allowed in source |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2326 } | 2326 } |
| 2327 | 2327 |
| 2328 | 2328 |
| 2329 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { | 2329 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { |
| 2330 // WithStatement :: | 2330 // WithStatement :: |
| 2331 // 'with' '(' Expression ')' Statement | 2331 // 'with' '(' Expression ')' Statement |
| 2332 | 2332 |
| 2333 Expect(Token::WITH, CHECK_OK); | 2333 Expect(Token::WITH, CHECK_OK); |
| 2334 int pos = position(); | 2334 int pos = position(); |
| 2335 | 2335 |
| 2336 if (!scope_->is_classic_mode()) { | 2336 if (!scope_->is_sloppy_mode()) { |
| 2337 ReportMessage("strict_mode_with", Vector<const char*>::empty()); | 2337 ReportMessage("strict_mode_with", Vector<const char*>::empty()); |
| 2338 *ok = false; | 2338 *ok = false; |
| 2339 return NULL; | 2339 return NULL; |
| 2340 } | 2340 } |
| 2341 | 2341 |
| 2342 Expect(Token::LPAREN, CHECK_OK); | 2342 Expect(Token::LPAREN, CHECK_OK); |
| 2343 Expression* expr = ParseExpression(true, CHECK_OK); | 2343 Expression* expr = ParseExpression(true, CHECK_OK); |
| 2344 Expect(Token::RPAREN, CHECK_OK); | 2344 Expect(Token::RPAREN, CHECK_OK); |
| 2345 | 2345 |
| 2346 scope_->DeclarationScope()->RecordWithStatement(); | 2346 scope_->DeclarationScope()->RecordWithStatement(); |
| (...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2900 // side expression. We could report this as a syntax error here but | 2900 // side expression. We could report this as a syntax error here but |
| 2901 // for compatibility with JSC we choose to report the error at | 2901 // for compatibility with JSC we choose to report the error at |
| 2902 // runtime. | 2902 // runtime. |
| 2903 // TODO(ES5): Should change parsing for spec conformance. | 2903 // TODO(ES5): Should change parsing for spec conformance. |
| 2904 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2904 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2905 Handle<String> message = | 2905 Handle<String> message = |
| 2906 isolate()->factory()->invalid_lhs_in_assignment_string(); | 2906 isolate()->factory()->invalid_lhs_in_assignment_string(); |
| 2907 expression = NewThrowReferenceError(message); | 2907 expression = NewThrowReferenceError(message); |
| 2908 } | 2908 } |
| 2909 | 2909 |
| 2910 if (!scope_->is_classic_mode()) { | 2910 if (!scope_->is_sloppy_mode()) { |
| 2911 // Assignment to eval or arguments is disallowed in strict mode. | 2911 // Assignment to eval or arguments is disallowed in strict mode. |
| 2912 CheckStrictModeLValue(expression, CHECK_OK); | 2912 CheckStrictModeLValue(expression, CHECK_OK); |
| 2913 } | 2913 } |
| 2914 MarkAsLValue(expression); | 2914 MarkAsLValue(expression); |
| 2915 | 2915 |
| 2916 Token::Value op = Next(); // Get assignment operator. | 2916 Token::Value op = Next(); // Get assignment operator. |
| 2917 int pos = position(); | 2917 int pos = position(); |
| 2918 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2918 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
| 2919 | 2919 |
| 2920 // TODO(1231235): We try to estimate the set of properties set by | 2920 // TODO(1231235): We try to estimate the set of properties set by |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3124 return factory()->NewNumberLiteral(-value, pos); | 3124 return factory()->NewNumberLiteral(-value, pos); |
| 3125 case Token::BIT_NOT: | 3125 case Token::BIT_NOT: |
| 3126 return factory()->NewNumberLiteral(~DoubleToInt32(value), pos); | 3126 return factory()->NewNumberLiteral(~DoubleToInt32(value), pos); |
| 3127 default: | 3127 default: |
| 3128 break; | 3128 break; |
| 3129 } | 3129 } |
| 3130 } | 3130 } |
| 3131 } | 3131 } |
| 3132 | 3132 |
| 3133 // "delete identifier" is a syntax error in strict mode. | 3133 // "delete identifier" is a syntax error in strict mode. |
| 3134 if (op == Token::DELETE && !scope_->is_classic_mode()) { | 3134 if (op == Token::DELETE && !scope_->is_sloppy_mode()) { |
| 3135 VariableProxy* operand = expression->AsVariableProxy(); | 3135 VariableProxy* operand = expression->AsVariableProxy(); |
| 3136 if (operand != NULL && !operand->is_this()) { | 3136 if (operand != NULL && !operand->is_this()) { |
| 3137 ReportMessage("strict_delete", Vector<const char*>::empty()); | 3137 ReportMessage("strict_delete", Vector<const char*>::empty()); |
| 3138 *ok = false; | 3138 *ok = false; |
| 3139 return NULL; | 3139 return NULL; |
| 3140 } | 3140 } |
| 3141 } | 3141 } |
| 3142 | 3142 |
| 3143 // Desugar '+foo' into 'foo*1', this enables the collection of type feedback | 3143 // Desugar '+foo' into 'foo*1', this enables the collection of type feedback |
| 3144 // without any special stub and the multiplication is removed later in | 3144 // without any special stub and the multiplication is removed later in |
| (...skipping 27 matching lines...) Expand all Loading... |
| 3172 // Signal a reference error if the expression is an invalid | 3172 // Signal a reference error if the expression is an invalid |
| 3173 // left-hand side expression. We could report this as a syntax | 3173 // left-hand side expression. We could report this as a syntax |
| 3174 // error here but for compatibility with JSC we choose to report the | 3174 // error here but for compatibility with JSC we choose to report the |
| 3175 // error at runtime. | 3175 // error at runtime. |
| 3176 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 3176 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 3177 Handle<String> message = | 3177 Handle<String> message = |
| 3178 isolate()->factory()->invalid_lhs_in_prefix_op_string(); | 3178 isolate()->factory()->invalid_lhs_in_prefix_op_string(); |
| 3179 expression = NewThrowReferenceError(message); | 3179 expression = NewThrowReferenceError(message); |
| 3180 } | 3180 } |
| 3181 | 3181 |
| 3182 if (!scope_->is_classic_mode()) { | 3182 if (!scope_->is_sloppy_mode()) { |
| 3183 // Prefix expression operand in strict mode may not be eval or arguments. | 3183 // Prefix expression operand in strict mode may not be eval or arguments. |
| 3184 CheckStrictModeLValue(expression, CHECK_OK); | 3184 CheckStrictModeLValue(expression, CHECK_OK); |
| 3185 } | 3185 } |
| 3186 MarkAsLValue(expression); | 3186 MarkAsLValue(expression); |
| 3187 | 3187 |
| 3188 return factory()->NewCountOperation(op, | 3188 return factory()->NewCountOperation(op, |
| 3189 true /* prefix */, | 3189 true /* prefix */, |
| 3190 expression, | 3190 expression, |
| 3191 position()); | 3191 position()); |
| 3192 | 3192 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3206 // Signal a reference error if the expression is an invalid | 3206 // Signal a reference error if the expression is an invalid |
| 3207 // left-hand side expression. We could report this as a syntax | 3207 // left-hand side expression. We could report this as a syntax |
| 3208 // error here but for compatibility with JSC we choose to report the | 3208 // error here but for compatibility with JSC we choose to report the |
| 3209 // error at runtime. | 3209 // error at runtime. |
| 3210 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 3210 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 3211 Handle<String> message = | 3211 Handle<String> message = |
| 3212 isolate()->factory()->invalid_lhs_in_postfix_op_string(); | 3212 isolate()->factory()->invalid_lhs_in_postfix_op_string(); |
| 3213 expression = NewThrowReferenceError(message); | 3213 expression = NewThrowReferenceError(message); |
| 3214 } | 3214 } |
| 3215 | 3215 |
| 3216 if (!scope_->is_classic_mode()) { | 3216 if (!scope_->is_sloppy_mode()) { |
| 3217 // Postfix expression operand in strict mode may not be eval or arguments. | 3217 // Postfix expression operand in strict mode may not be eval or arguments. |
| 3218 CheckStrictModeLValue(expression, CHECK_OK); | 3218 CheckStrictModeLValue(expression, CHECK_OK); |
| 3219 } | 3219 } |
| 3220 MarkAsLValue(expression); | 3220 MarkAsLValue(expression); |
| 3221 | 3221 |
| 3222 Token::Value next = Next(); | 3222 Token::Value next = Next(); |
| 3223 expression = | 3223 expression = |
| 3224 factory()->NewCountOperation(next, | 3224 factory()->NewCountOperation(next, |
| 3225 false /* postfix */, | 3225 false /* postfix */, |
| 3226 expression, | 3226 expression, |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4095 materialized_literal_count = function_state.materialized_literal_count(); | 4095 materialized_literal_count = function_state.materialized_literal_count(); |
| 4096 expected_property_count = function_state.expected_property_count(); | 4096 expected_property_count = function_state.expected_property_count(); |
| 4097 handler_count = function_state.handler_count(); | 4097 handler_count = function_state.handler_count(); |
| 4098 | 4098 |
| 4099 Expect(Token::RBRACE, CHECK_OK); | 4099 Expect(Token::RBRACE, CHECK_OK); |
| 4100 scope->set_end_position(scanner()->location().end_pos); | 4100 scope->set_end_position(scanner()->location().end_pos); |
| 4101 } | 4101 } |
| 4102 | 4102 |
| 4103 // Validate strict mode. We can do this only after parsing the function, | 4103 // Validate strict mode. We can do this only after parsing the function, |
| 4104 // since the function can declare itself strict. | 4104 // since the function can declare itself strict. |
| 4105 if (!scope_->is_classic_mode()) { | 4105 if (!scope_->is_sloppy_mode()) { |
| 4106 if (IsEvalOrArguments(function_name)) { | 4106 if (IsEvalOrArguments(function_name)) { |
| 4107 ReportMessageAt(function_name_location, "strict_eval_arguments"); | 4107 ReportMessageAt(function_name_location, "strict_eval_arguments"); |
| 4108 *ok = false; | 4108 *ok = false; |
| 4109 return NULL; | 4109 return NULL; |
| 4110 } | 4110 } |
| 4111 if (name_is_strict_reserved) { | 4111 if (name_is_strict_reserved) { |
| 4112 ReportMessageAt(function_name_location, "unexpected_strict_reserved"); | 4112 ReportMessageAt(function_name_location, "unexpected_strict_reserved"); |
| 4113 *ok = false; | 4113 *ok = false; |
| 4114 return NULL; | 4114 return NULL; |
| 4115 } | 4115 } |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4258 : NULL; | 4258 : NULL; |
| 4259 | 4259 |
| 4260 if (proxy != NULL) proxy->MarkAsLValue(); | 4260 if (proxy != NULL) proxy->MarkAsLValue(); |
| 4261 } | 4261 } |
| 4262 | 4262 |
| 4263 | 4263 |
| 4264 // Checks LHS expression for assignment and prefix/postfix increment/decrement | 4264 // Checks LHS expression for assignment and prefix/postfix increment/decrement |
| 4265 // in strict mode. | 4265 // in strict mode. |
| 4266 void Parser::CheckStrictModeLValue(Expression* expression, | 4266 void Parser::CheckStrictModeLValue(Expression* expression, |
| 4267 bool* ok) { | 4267 bool* ok) { |
| 4268 ASSERT(!scope_->is_classic_mode()); | 4268 ASSERT(!scope_->is_sloppy_mode()); |
| 4269 VariableProxy* lhs = expression != NULL | 4269 VariableProxy* lhs = expression != NULL |
| 4270 ? expression->AsVariableProxy() | 4270 ? expression->AsVariableProxy() |
| 4271 : NULL; | 4271 : NULL; |
| 4272 | 4272 |
| 4273 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { | 4273 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { |
| 4274 ReportMessage("strict_eval_arguments", Vector<const char*>::empty()); | 4274 ReportMessage("strict_eval_arguments", Vector<const char*>::empty()); |
| 4275 *ok = false; | 4275 *ok = false; |
| 4276 } | 4276 } |
| 4277 } | 4277 } |
| 4278 | 4278 |
| (...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5353 ASSERT(info()->isolate()->has_pending_exception()); | 5353 ASSERT(info()->isolate()->has_pending_exception()); |
| 5354 } else { | 5354 } else { |
| 5355 result = ParseProgram(); | 5355 result = ParseProgram(); |
| 5356 } | 5356 } |
| 5357 } | 5357 } |
| 5358 info()->SetFunction(result); | 5358 info()->SetFunction(result); |
| 5359 return (result != NULL); | 5359 return (result != NULL); |
| 5360 } | 5360 } |
| 5361 | 5361 |
| 5362 } } // namespace v8::internal | 5362 } } // namespace v8::internal |
| OLD | NEW |