| 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 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 } | 478 } |
| 479 | 479 |
| 480 ~BlockState() { parser_->top_scope_ = outer_scope_; } | 480 ~BlockState() { parser_->top_scope_ = outer_scope_; } |
| 481 | 481 |
| 482 private: | 482 private: |
| 483 Parser* parser_; | 483 Parser* parser_; |
| 484 Scope* outer_scope_; | 484 Scope* outer_scope_; |
| 485 }; | 485 }; |
| 486 | 486 |
| 487 | 487 |
| 488 Parser::FunctionState::FunctionState(Parser* parser, | 488 Parser::FunctionState::FunctionState(Parser* parser, Scope* scope) |
| 489 Scope* scope, | |
| 490 Isolate* isolate) | |
| 491 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), | 489 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), |
| 492 next_handler_index_(0), | 490 next_handler_index_(0), |
| 493 expected_property_count_(0), | 491 expected_property_count_(0), |
| 494 generator_object_variable_(NULL), | 492 generator_object_variable_(NULL), |
| 495 parser_(parser), | 493 parser_(parser), |
| 496 outer_function_state_(parser->current_function_state_), | 494 outer_function_state_(parser->current_function_state_), |
| 497 outer_scope_(parser->top_scope_), | 495 outer_scope_(parser->top_scope_), |
| 498 saved_ast_node_id_(isolate->ast_node_id()), | 496 saved_ast_node_id_(parser->zone()->isolate()->ast_node_id()), |
| 499 factory_(isolate, parser->zone()) { | 497 factory_(parser->zone()) { |
| 500 parser->top_scope_ = scope; | 498 parser->top_scope_ = scope; |
| 501 parser->current_function_state_ = this; | 499 parser->current_function_state_ = this; |
| 502 isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt()); | 500 parser->zone()->isolate()->set_ast_node_id(BailoutId::FirstUsable().ToInt()); |
| 503 } | 501 } |
| 504 | 502 |
| 505 | 503 |
| 506 Parser::FunctionState::~FunctionState() { | 504 Parser::FunctionState::~FunctionState() { |
| 507 parser_->top_scope_ = outer_scope_; | 505 parser_->top_scope_ = outer_scope_; |
| 508 parser_->current_function_state_ = outer_function_state_; | 506 parser_->current_function_state_ = outer_function_state_; |
| 509 if (outer_function_state_ != NULL) { | 507 if (outer_function_state_ != NULL) { |
| 510 parser_->isolate()->set_ast_node_id(saved_ast_node_id_); | 508 parser_->isolate()->set_ast_node_id(saved_ast_node_id_); |
| 511 } | 509 } |
| 512 } | 510 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 // Compute the parsing mode. | 636 // Compute the parsing mode. |
| 639 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; | 637 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; |
| 640 if (allow_natives_syntax() || | 638 if (allow_natives_syntax() || |
| 641 extension_ != NULL || | 639 extension_ != NULL || |
| 642 scope->is_eval_scope()) { | 640 scope->is_eval_scope()) { |
| 643 mode = PARSE_EAGERLY; | 641 mode = PARSE_EAGERLY; |
| 644 } | 642 } |
| 645 ParsingModeScope parsing_mode(this, mode); | 643 ParsingModeScope parsing_mode(this, mode); |
| 646 | 644 |
| 647 // Enters 'scope'. | 645 // Enters 'scope'. |
| 648 FunctionState function_state(this, scope, isolate()); | 646 FunctionState function_state(this, scope); |
| 649 | 647 |
| 650 top_scope_->SetLanguageMode(info->language_mode()); | 648 top_scope_->SetLanguageMode(info->language_mode()); |
| 651 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 649 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
| 652 bool ok = true; | 650 bool ok = true; |
| 653 int beg_pos = scanner().location().beg_pos; | 651 int beg_pos = scanner().location().beg_pos; |
| 654 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); | 652 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); |
| 655 if (ok && !top_scope_->is_classic_mode()) { | 653 if (ok && !top_scope_->is_classic_mode()) { |
| 656 CheckOctalLiteral(beg_pos, scanner().location().end_pos, &ok); | 654 CheckOctalLiteral(beg_pos, scanner().location().end_pos, &ok); |
| 657 } | 655 } |
| 658 | 656 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 | 750 |
| 753 { | 751 { |
| 754 // Parse the function literal. | 752 // Parse the function literal. |
| 755 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 753 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); |
| 756 info()->SetGlobalScope(scope); | 754 info()->SetGlobalScope(scope); |
| 757 if (!info()->closure().is_null()) { | 755 if (!info()->closure().is_null()) { |
| 758 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | 756 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, |
| 759 zone()); | 757 zone()); |
| 760 } | 758 } |
| 761 original_scope_ = scope; | 759 original_scope_ = scope; |
| 762 FunctionState function_state(this, scope, isolate()); | 760 FunctionState function_state(this, scope); |
| 763 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); | 761 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); |
| 764 ASSERT(scope->language_mode() != EXTENDED_MODE || | 762 ASSERT(scope->language_mode() != EXTENDED_MODE || |
| 765 info()->is_extended_mode()); | 763 info()->is_extended_mode()); |
| 766 ASSERT(info()->language_mode() == shared_info->language_mode()); | 764 ASSERT(info()->language_mode() == shared_info->language_mode()); |
| 767 scope->SetLanguageMode(shared_info->language_mode()); | 765 scope->SetLanguageMode(shared_info->language_mode()); |
| 768 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 766 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
| 769 ? (shared_info->is_anonymous() | 767 ? (shared_info->is_anonymous() |
| 770 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 768 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
| 771 : FunctionLiteral::NAMED_EXPRESSION) | 769 : FunctionLiteral::NAMED_EXPRESSION) |
| 772 : FunctionLiteral::DECLARATION; | 770 : FunctionLiteral::DECLARATION; |
| (...skipping 3055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3828 } | 3826 } |
| 3829 } | 3827 } |
| 3830 | 3828 |
| 3831 // Validate the property | 3829 // Validate the property |
| 3832 checker.CheckProperty(next, kValueProperty, CHECK_OK); | 3830 checker.CheckProperty(next, kValueProperty, CHECK_OK); |
| 3833 | 3831 |
| 3834 Expect(Token::COLON, CHECK_OK); | 3832 Expect(Token::COLON, CHECK_OK); |
| 3835 Expression* value = ParseAssignmentExpression(true, CHECK_OK); | 3833 Expression* value = ParseAssignmentExpression(true, CHECK_OK); |
| 3836 | 3834 |
| 3837 ObjectLiteral::Property* property = | 3835 ObjectLiteral::Property* property = |
| 3838 new(zone()) ObjectLiteral::Property(key, value, isolate()); | 3836 factory()->NewObjectLiteralProperty(key, value); |
| 3839 | 3837 |
| 3840 // Mark top-level object literals that contain function literals and | 3838 // Mark top-level object literals that contain function literals and |
| 3841 // pretenure the literal so it can be added as a constant function | 3839 // pretenure the literal so it can be added as a constant function |
| 3842 // property. | 3840 // property. |
| 3843 if (top_scope_->DeclarationScope()->is_global_scope() && | 3841 if (top_scope_->DeclarationScope()->is_global_scope() && |
| 3844 value->AsFunctionLiteral() != NULL) { | 3842 value->AsFunctionLiteral() != NULL) { |
| 3845 has_function = true; | 3843 has_function = true; |
| 3846 value->AsFunctionLiteral()->set_pretenure(); | 3844 value->AsFunctionLiteral()->set_pretenure(); |
| 3847 } | 3845 } |
| 3848 | 3846 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4077 FunctionLiteral::kNoDuplicateParameters; | 4075 FunctionLiteral::kNoDuplicateParameters; |
| 4078 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ | 4076 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ |
| 4079 ? FunctionLiteral::kIsParenthesized | 4077 ? FunctionLiteral::kIsParenthesized |
| 4080 : FunctionLiteral::kNotParenthesized; | 4078 : FunctionLiteral::kNotParenthesized; |
| 4081 FunctionLiteral::IsGeneratorFlag generator = is_generator | 4079 FunctionLiteral::IsGeneratorFlag generator = is_generator |
| 4082 ? FunctionLiteral::kIsGenerator | 4080 ? FunctionLiteral::kIsGenerator |
| 4083 : FunctionLiteral::kNotGenerator; | 4081 : FunctionLiteral::kNotGenerator; |
| 4084 AstProperties ast_properties; | 4082 AstProperties ast_properties; |
| 4085 BailoutReason dont_optimize_reason = kNoReason; | 4083 BailoutReason dont_optimize_reason = kNoReason; |
| 4086 // Parse function body. | 4084 // Parse function body. |
| 4087 { FunctionState function_state(this, scope, isolate()); | 4085 { FunctionState function_state(this, scope); |
| 4088 top_scope_->SetScopeName(function_name); | 4086 top_scope_->SetScopeName(function_name); |
| 4089 | 4087 |
| 4090 if (is_generator) { | 4088 if (is_generator) { |
| 4091 // For generators, allocating variables in contexts is currently a win | 4089 // For generators, allocating variables in contexts is currently a win |
| 4092 // because it minimizes the work needed to suspend and resume an | 4090 // because it minimizes the work needed to suspend and resume an |
| 4093 // activation. | 4091 // activation. |
| 4094 top_scope_->ForceContextAllocation(); | 4092 top_scope_->ForceContextAllocation(); |
| 4095 | 4093 |
| 4096 // Calling a generator returns a generator object. That object is stored | 4094 // Calling a generator returns a generator object. That object is stored |
| 4097 // in a temporary variable, a definition that is used by "yield" | 4095 // in a temporary variable, a definition that is used by "yield" |
| (...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5686 ASSERT(info()->isolate()->has_pending_exception()); | 5684 ASSERT(info()->isolate()->has_pending_exception()); |
| 5687 } else { | 5685 } else { |
| 5688 result = ParseProgram(); | 5686 result = ParseProgram(); |
| 5689 } | 5687 } |
| 5690 } | 5688 } |
| 5691 info()->SetFunction(result); | 5689 info()->SetFunction(result); |
| 5692 return (result != NULL); | 5690 return (result != NULL); |
| 5693 } | 5691 } |
| 5694 | 5692 |
| 5695 } } // namespace v8::internal | 5693 } } // namespace v8::internal |
| OLD | NEW |