| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 | 685 |
| 686 // Make sure the target stack is empty. | 686 // Make sure the target stack is empty. |
| 687 ASSERT(target_stack_ == NULL); | 687 ASSERT(target_stack_ == NULL); |
| 688 | 688 |
| 689 // If there was a syntax error we have to get rid of the AST | 689 // If there was a syntax error we have to get rid of the AST |
| 690 // and it is not safe to do so before the scope has been deleted. | 690 // and it is not safe to do so before the scope has been deleted. |
| 691 if (result == NULL) zone_scope->DeleteOnExit(); | 691 if (result == NULL) zone_scope->DeleteOnExit(); |
| 692 return result; | 692 return result; |
| 693 } | 693 } |
| 694 | 694 |
| 695 FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info) { | 695 FunctionLiteral* Parser::ParseLazy(CompilationInfo* info) { |
| 696 CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); | 696 CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
| 697 HistogramTimerScope timer(&Counters::parse_lazy); | 697 HistogramTimerScope timer(&Counters::parse_lazy); |
| 698 Handle<String> source(String::cast(script_->source())); | 698 Handle<String> source(String::cast(script_->source())); |
| 699 Counters::total_parse_size.Increment(source->length()); | 699 Counters::total_parse_size.Increment(source->length()); |
| 700 | 700 |
| 701 Handle<SharedFunctionInfo> shared_info = info->shared_info(); |
| 701 // Initialize parser state. | 702 // Initialize parser state. |
| 702 source->TryFlatten(); | 703 source->TryFlatten(); |
| 703 if (source->IsExternalTwoByteString()) { | 704 if (source->IsExternalTwoByteString()) { |
| 704 ExternalTwoByteStringUC16CharacterStream stream( | 705 ExternalTwoByteStringUC16CharacterStream stream( |
| 705 Handle<ExternalTwoByteString>::cast(source), | 706 Handle<ExternalTwoByteString>::cast(source), |
| 706 info->start_position(), | 707 shared_info->start_position(), |
| 707 info->end_position()); | 708 shared_info->end_position()); |
| 708 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); | 709 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); |
| 709 return result; | 710 return result; |
| 710 } else { | 711 } else { |
| 711 GenericStringUC16CharacterStream stream(source, | 712 GenericStringUC16CharacterStream stream(source, |
| 712 info->start_position(), | 713 shared_info->start_position(), |
| 713 info->end_position()); | 714 shared_info->end_position()); |
| 714 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); | 715 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); |
| 715 return result; | 716 return result; |
| 716 } | 717 } |
| 717 } | 718 } |
| 718 | 719 |
| 719 | 720 |
| 720 FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, | 721 FunctionLiteral* Parser::ParseLazy(CompilationInfo* info, |
| 721 UC16CharacterStream* source, | 722 UC16CharacterStream* source, |
| 722 ZoneScope* zone_scope) { | 723 ZoneScope* zone_scope) { |
| 724 Handle<SharedFunctionInfo> shared_info = info->shared_info(); |
| 723 scanner_.Initialize(source); | 725 scanner_.Initialize(source); |
| 724 ASSERT(target_stack_ == NULL); | 726 ASSERT(target_stack_ == NULL); |
| 725 | 727 |
| 726 Handle<String> name(String::cast(info->name())); | 728 Handle<String> name(String::cast(shared_info->name())); |
| 727 fni_ = new FuncNameInferrer(); | 729 fni_ = new FuncNameInferrer(); |
| 728 fni_->PushEnclosingName(name); | 730 fni_->PushEnclosingName(name); |
| 729 | 731 |
| 730 mode_ = PARSE_EAGERLY; | 732 mode_ = PARSE_EAGERLY; |
| 731 | 733 |
| 732 // Place holder for the result. | 734 // Place holder for the result. |
| 733 FunctionLiteral* result = NULL; | 735 FunctionLiteral* result = NULL; |
| 734 | 736 |
| 735 { | 737 { |
| 736 // Parse the function literal. | 738 // Parse the function literal. |
| 737 Handle<String> no_name = Factory::empty_symbol(); | 739 Handle<String> no_name = Factory::empty_symbol(); |
| 738 Scope* scope = | 740 Scope* scope = NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with()); |
| 739 NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with()); | 741 if (!info->closure().is_null()) { |
| 742 scope = Scope::DeserializeScopeChain(info, scope); |
| 743 } |
| 740 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, | 744 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, |
| 741 scope); | 745 scope); |
| 742 TemporaryScope temp_scope(&this->temp_scope_); | 746 TemporaryScope temp_scope(&this->temp_scope_); |
| 743 | 747 |
| 744 if (info->strict_mode()) { | 748 if (shared_info->strict_mode()) { |
| 745 top_scope_->EnableStrictMode(); | 749 top_scope_->EnableStrictMode(); |
| 746 } | 750 } |
| 747 | 751 |
| 748 FunctionLiteralType type = | 752 FunctionLiteralType type = |
| 749 info->is_expression() ? EXPRESSION : DECLARATION; | 753 shared_info->is_expression() ? EXPRESSION : DECLARATION; |
| 750 bool ok = true; | 754 bool ok = true; |
| 751 result = ParseFunctionLiteral(name, | 755 result = ParseFunctionLiteral(name, |
| 752 false, // Strict mode name already checked. | 756 false, // Strict mode name already checked. |
| 753 RelocInfo::kNoPosition, type, &ok); | 757 RelocInfo::kNoPosition, type, &ok); |
| 754 // Make sure the results agree. | 758 // Make sure the results agree. |
| 755 ASSERT(ok == (result != NULL)); | 759 ASSERT(ok == (result != NULL)); |
| 756 } | 760 } |
| 757 | 761 |
| 758 // Make sure the target stack is empty. | 762 // Make sure the target stack is empty. |
| 759 ASSERT(target_stack_ == NULL); | 763 ASSERT(target_stack_ == NULL); |
| 760 | 764 |
| 761 // If there was a stack overflow we have to get rid of AST and it is | 765 // If there was a stack overflow we have to get rid of AST and it is |
| 762 // not safe to do before scope has been deleted. | 766 // not safe to do before scope has been deleted. |
| 763 if (result == NULL) { | 767 if (result == NULL) { |
| 764 zone_scope->DeleteOnExit(); | 768 zone_scope->DeleteOnExit(); |
| 765 if (stack_overflow_) Top::StackOverflow(); | 769 if (stack_overflow_) Top::StackOverflow(); |
| 766 } else { | 770 } else { |
| 767 Handle<String> inferred_name(info->inferred_name()); | 771 Handle<String> inferred_name(shared_info->inferred_name()); |
| 768 result->set_inferred_name(inferred_name); | 772 result->set_inferred_name(inferred_name); |
| 769 } | 773 } |
| 770 return result; | 774 return result; |
| 771 } | 775 } |
| 772 | 776 |
| 773 | 777 |
| 774 Handle<String> Parser::GetSymbol(bool* ok) { | 778 Handle<String> Parser::GetSymbol(bool* ok) { |
| 775 int symbol_id = -1; | 779 int symbol_id = -1; |
| 776 if (pre_data() != NULL) { | 780 if (pre_data() != NULL) { |
| 777 symbol_id = pre_data()->GetSymbolIdentifier(); | 781 symbol_id = pre_data()->GetSymbolIdentifier(); |
| (...skipping 4341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5119 return !parser.failed(); | 5123 return !parser.failed(); |
| 5120 } | 5124 } |
| 5121 | 5125 |
| 5122 | 5126 |
| 5123 bool ParserApi::Parse(CompilationInfo* info) { | 5127 bool ParserApi::Parse(CompilationInfo* info) { |
| 5124 ASSERT(info->function() == NULL); | 5128 ASSERT(info->function() == NULL); |
| 5125 FunctionLiteral* result = NULL; | 5129 FunctionLiteral* result = NULL; |
| 5126 Handle<Script> script = info->script(); | 5130 Handle<Script> script = info->script(); |
| 5127 if (info->is_lazy()) { | 5131 if (info->is_lazy()) { |
| 5128 Parser parser(script, true, NULL, NULL); | 5132 Parser parser(script, true, NULL, NULL); |
| 5129 result = parser.ParseLazy(info->shared_info()); | 5133 result = parser.ParseLazy(info); |
| 5130 } else { | 5134 } else { |
| 5131 bool allow_natives_syntax = | 5135 bool allow_natives_syntax = |
| 5132 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); | 5136 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); |
| 5133 ScriptDataImpl* pre_data = info->pre_parse_data(); | 5137 ScriptDataImpl* pre_data = info->pre_parse_data(); |
| 5134 Parser parser(script, allow_natives_syntax, info->extension(), pre_data); | 5138 Parser parser(script, allow_natives_syntax, info->extension(), pre_data); |
| 5135 if (pre_data != NULL && pre_data->has_error()) { | 5139 if (pre_data != NULL && pre_data->has_error()) { |
| 5136 Scanner::Location loc = pre_data->MessageLocation(); | 5140 Scanner::Location loc = pre_data->MessageLocation(); |
| 5137 const char* message = pre_data->BuildMessage(); | 5141 const char* message = pre_data->BuildMessage(); |
| 5138 Vector<const char*> args = pre_data->BuildArgs(); | 5142 Vector<const char*> args = pre_data->BuildArgs(); |
| 5139 parser.ReportMessageAt(loc, message, args); | 5143 parser.ReportMessageAt(loc, message, args); |
| 5140 DeleteArray(message); | 5144 DeleteArray(message); |
| 5141 for (int i = 0; i < args.length(); i++) { | 5145 for (int i = 0; i < args.length(); i++) { |
| 5142 DeleteArray(args[i]); | 5146 DeleteArray(args[i]); |
| 5143 } | 5147 } |
| 5144 DeleteArray(args.start()); | 5148 DeleteArray(args.start()); |
| 5145 ASSERT(Top::has_pending_exception()); | 5149 ASSERT(Top::has_pending_exception()); |
| 5146 } else { | 5150 } else { |
| 5147 Handle<String> source = Handle<String>(String::cast(script->source())); | 5151 Handle<String> source = Handle<String>(String::cast(script->source())); |
| 5148 result = parser.ParseProgram(source, | 5152 result = parser.ParseProgram(source, |
| 5149 info->is_global(), | 5153 info->is_global(), |
| 5150 info->StrictMode()); | 5154 info->StrictMode()); |
| 5151 } | 5155 } |
| 5152 } | 5156 } |
| 5153 | 5157 |
| 5154 info->SetFunction(result); | 5158 info->SetFunction(result); |
| 5155 return (result != NULL); | 5159 return (result != NULL); |
| 5156 } | 5160 } |
| 5157 | 5161 |
| 5158 } } // namespace v8::internal | 5162 } } // namespace v8::internal |
| OLD | NEW |