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 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 | 608 |
609 | 609 |
610 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, | 610 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, |
611 Handle<String> source, | 611 Handle<String> source, |
612 ZoneScope* zone_scope) { | 612 ZoneScope* zone_scope) { |
613 ASSERT(top_scope_ == NULL); | 613 ASSERT(top_scope_ == NULL); |
614 ASSERT(target_stack_ == NULL); | 614 ASSERT(target_stack_ == NULL); |
615 if (pre_data_ != NULL) pre_data_->Initialize(); | 615 if (pre_data_ != NULL) pre_data_->Initialize(); |
616 | 616 |
617 // Compute the parsing mode. | 617 // Compute the parsing mode. |
618 mode_ = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY; | 618 Mode mode = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY; |
619 if (allow_natives_syntax_ || extension_ != NULL) mode_ = PARSE_EAGERLY; | 619 if (allow_natives_syntax_ || extension_ != NULL) mode = PARSE_EAGERLY; |
| 620 ParsingModeScope parsing_mode(this, mode); |
620 | 621 |
621 Handle<String> no_name = isolate()->factory()->empty_symbol(); | 622 Handle<String> no_name = isolate()->factory()->empty_symbol(); |
622 | 623 |
623 FunctionLiteral* result = NULL; | 624 FunctionLiteral* result = NULL; |
624 { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 625 { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); |
625 info->SetGlobalScope(scope); | 626 info->SetGlobalScope(scope); |
626 if (info->is_eval()) { | 627 if (info->is_eval()) { |
627 Handle<SharedFunctionInfo> shared = info->shared_info(); | 628 Handle<SharedFunctionInfo> shared = info->shared_info(); |
628 if (!info->is_global() && (shared.is_null() || shared->is_function())) { | 629 if (!info->is_global() && (shared.is_null() || shared->is_function())) { |
629 scope = Scope::DeserializeScopeChain(*info->calling_context(), scope, | 630 scope = Scope::DeserializeScopeChain(*info->calling_context(), scope, |
(...skipping 25 matching lines...) Expand all Loading... |
655 top_scope_, | 656 top_scope_, |
656 body, | 657 body, |
657 function_state.materialized_literal_count(), | 658 function_state.materialized_literal_count(), |
658 function_state.expected_property_count(), | 659 function_state.expected_property_count(), |
659 function_state.handler_count(), | 660 function_state.handler_count(), |
660 function_state.only_simple_this_property_assignments(), | 661 function_state.only_simple_this_property_assignments(), |
661 function_state.this_property_assignments(), | 662 function_state.this_property_assignments(), |
662 0, | 663 0, |
663 FunctionLiteral::kNoDuplicateParameters, | 664 FunctionLiteral::kNoDuplicateParameters, |
664 FunctionLiteral::ANONYMOUS_EXPRESSION, | 665 FunctionLiteral::ANONYMOUS_EXPRESSION, |
665 FunctionLiteral::kGlobalOrEval); | 666 FunctionLiteral::kGlobalOrEval, |
| 667 FunctionLiteral::kNotParenthesized); |
666 result->set_ast_properties(factory()->visitor()->ast_properties()); | 668 result->set_ast_properties(factory()->visitor()->ast_properties()); |
667 } else if (stack_overflow_) { | 669 } else if (stack_overflow_) { |
668 isolate()->StackOverflow(); | 670 isolate()->StackOverflow(); |
669 } | 671 } |
670 } | 672 } |
671 | 673 |
672 // Make sure the target stack is empty. | 674 // Make sure the target stack is empty. |
673 ASSERT(target_stack_ == NULL); | 675 ASSERT(target_stack_ == NULL); |
674 | 676 |
675 // If there was a syntax error we have to get rid of the AST | 677 // If there was a syntax error we have to get rid of the AST |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 ZoneScope* zone_scope) { | 718 ZoneScope* zone_scope) { |
717 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 719 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
718 scanner_.Initialize(source); | 720 scanner_.Initialize(source); |
719 ASSERT(top_scope_ == NULL); | 721 ASSERT(top_scope_ == NULL); |
720 ASSERT(target_stack_ == NULL); | 722 ASSERT(target_stack_ == NULL); |
721 | 723 |
722 Handle<String> name(String::cast(shared_info->name())); | 724 Handle<String> name(String::cast(shared_info->name())); |
723 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); | 725 fni_ = new(zone()) FuncNameInferrer(isolate(), zone()); |
724 fni_->PushEnclosingName(name); | 726 fni_->PushEnclosingName(name); |
725 | 727 |
726 mode_ = PARSE_EAGERLY; | 728 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
727 | 729 |
728 // Place holder for the result. | 730 // Place holder for the result. |
729 FunctionLiteral* result = NULL; | 731 FunctionLiteral* result = NULL; |
730 | 732 |
731 { | 733 { |
732 // Parse the function literal. | 734 // Parse the function literal. |
733 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 735 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); |
734 info()->SetGlobalScope(scope); | 736 info()->SetGlobalScope(scope); |
735 if (!info()->closure().is_null()) { | 737 if (!info()->closure().is_null()) { |
736 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | 738 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, |
(...skipping 3743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4480 ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE) | 4482 ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE) |
4481 : NewScope(top_scope_, FUNCTION_SCOPE); | 4483 : NewScope(top_scope_, FUNCTION_SCOPE); |
4482 ZoneList<Statement*>* body = NULL; | 4484 ZoneList<Statement*>* body = NULL; |
4483 int materialized_literal_count = -1; | 4485 int materialized_literal_count = -1; |
4484 int expected_property_count = -1; | 4486 int expected_property_count = -1; |
4485 int handler_count = 0; | 4487 int handler_count = 0; |
4486 bool only_simple_this_property_assignments; | 4488 bool only_simple_this_property_assignments; |
4487 Handle<FixedArray> this_property_assignments; | 4489 Handle<FixedArray> this_property_assignments; |
4488 FunctionLiteral::ParameterFlag duplicate_parameters = | 4490 FunctionLiteral::ParameterFlag duplicate_parameters = |
4489 FunctionLiteral::kNoDuplicateParameters; | 4491 FunctionLiteral::kNoDuplicateParameters; |
| 4492 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ |
| 4493 ? FunctionLiteral::kIsParenthesized |
| 4494 : FunctionLiteral::kNotParenthesized; |
4490 AstProperties ast_properties; | 4495 AstProperties ast_properties; |
4491 // Parse function body. | 4496 // Parse function body. |
4492 { FunctionState function_state(this, scope, isolate()); | 4497 { FunctionState function_state(this, scope, isolate()); |
4493 top_scope_->SetScopeName(function_name); | 4498 top_scope_->SetScopeName(function_name); |
4494 | 4499 |
4495 // FormalParameterList :: | 4500 // FormalParameterList :: |
4496 // '(' (Identifier)*[','] ')' | 4501 // '(' (Identifier)*[','] ')' |
4497 Expect(Token::LPAREN, CHECK_OK); | 4502 Expect(Token::LPAREN, CHECK_OK); |
4498 scope->set_start_position(scanner().location().beg_pos); | 4503 scope->set_start_position(scanner().location().beg_pos); |
4499 Scanner::Location name_loc = Scanner::Location::invalid(); | 4504 Scanner::Location name_loc = Scanner::Location::invalid(); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4628 scope->end_position() - function_block_pos); | 4633 scope->end_position() - function_block_pos); |
4629 materialized_literal_count = logger.literals(); | 4634 materialized_literal_count = logger.literals(); |
4630 expected_property_count = logger.properties(); | 4635 expected_property_count = logger.properties(); |
4631 top_scope_->SetLanguageMode(logger.language_mode()); | 4636 top_scope_->SetLanguageMode(logger.language_mode()); |
4632 only_simple_this_property_assignments = false; | 4637 only_simple_this_property_assignments = false; |
4633 this_property_assignments = isolate()->factory()->empty_fixed_array(); | 4638 this_property_assignments = isolate()->factory()->empty_fixed_array(); |
4634 } | 4639 } |
4635 } | 4640 } |
4636 | 4641 |
4637 if (!is_lazily_compiled) { | 4642 if (!is_lazily_compiled) { |
| 4643 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
4638 body = new(zone()) ZoneList<Statement*>(8, zone()); | 4644 body = new(zone()) ZoneList<Statement*>(8, zone()); |
4639 if (fvar != NULL) { | 4645 if (fvar != NULL) { |
4640 VariableProxy* fproxy = top_scope_->NewUnresolved( | 4646 VariableProxy* fproxy = top_scope_->NewUnresolved( |
4641 factory(), function_name, Interface::NewConst()); | 4647 factory(), function_name, Interface::NewConst()); |
4642 fproxy->BindTo(fvar); | 4648 fproxy->BindTo(fvar); |
4643 body->Add(factory()->NewExpressionStatement( | 4649 body->Add(factory()->NewExpressionStatement( |
4644 factory()->NewAssignment(fvar_init_op, | 4650 factory()->NewAssignment(fvar_init_op, |
4645 fproxy, | 4651 fproxy, |
4646 factory()->NewThisFunction(), | 4652 factory()->NewThisFunction(), |
4647 RelocInfo::kNoPosition)), | 4653 RelocInfo::kNoPosition)), |
4648 zone()); | 4654 zone()); |
4649 } | 4655 } |
4650 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); | 4656 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); |
4651 | 4657 |
4652 materialized_literal_count = function_state.materialized_literal_count(); | 4658 materialized_literal_count = function_state.materialized_literal_count(); |
4653 expected_property_count = function_state.expected_property_count(); | 4659 expected_property_count = function_state.expected_property_count(); |
4654 handler_count = function_state.handler_count(); | 4660 handler_count = function_state.handler_count(); |
4655 only_simple_this_property_assignments = | 4661 only_simple_this_property_assignments = |
4656 function_state.only_simple_this_property_assignments(); | 4662 function_state.only_simple_this_property_assignments(); |
4657 this_property_assignments = function_state.this_property_assignments(); | 4663 this_property_assignments = function_state.this_property_assignments(); |
4658 | 4664 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4718 scope, | 4724 scope, |
4719 body, | 4725 body, |
4720 materialized_literal_count, | 4726 materialized_literal_count, |
4721 expected_property_count, | 4727 expected_property_count, |
4722 handler_count, | 4728 handler_count, |
4723 only_simple_this_property_assignments, | 4729 only_simple_this_property_assignments, |
4724 this_property_assignments, | 4730 this_property_assignments, |
4725 num_parameters, | 4731 num_parameters, |
4726 duplicate_parameters, | 4732 duplicate_parameters, |
4727 type, | 4733 type, |
4728 FunctionLiteral::kIsFunction); | 4734 FunctionLiteral::kIsFunction, |
| 4735 parenthesized); |
4729 function_literal->set_function_token_position(function_token_position); | 4736 function_literal->set_function_token_position(function_token_position); |
4730 function_literal->set_ast_properties(&ast_properties); | 4737 function_literal->set_ast_properties(&ast_properties); |
4731 | 4738 |
4732 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); | 4739 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
4733 return function_literal; | 4740 return function_literal; |
4734 } | 4741 } |
4735 | 4742 |
4736 | 4743 |
4737 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( | 4744 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( |
4738 SingletonLogger* logger) { | 4745 SingletonLogger* logger) { |
(...skipping 1337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6076 ASSERT(info->isolate()->has_pending_exception()); | 6083 ASSERT(info->isolate()->has_pending_exception()); |
6077 } else { | 6084 } else { |
6078 result = parser.ParseProgram(); | 6085 result = parser.ParseProgram(); |
6079 } | 6086 } |
6080 } | 6087 } |
6081 info->SetFunction(result); | 6088 info->SetFunction(result); |
6082 return (result != NULL); | 6089 return (result != NULL); |
6083 } | 6090 } |
6084 | 6091 |
6085 } } // namespace v8::internal | 6092 } } // namespace v8::internal |
OLD | NEW |