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 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 Parser parser(info); | 658 Parser parser(info); |
659 if ((info->pre_parse_data() != NULL || | 659 if ((info->pre_parse_data() != NULL || |
660 String::cast(script->source())->length() > FLAG_min_preparse_length) && | 660 String::cast(script->source())->length() > FLAG_min_preparse_length) && |
661 !DebuggerWantsEagerCompilation(info)) | 661 !DebuggerWantsEagerCompilation(info)) |
662 parser.set_allow_lazy(true); | 662 parser.set_allow_lazy(true); |
663 if (!parser.Parse()) { | 663 if (!parser.Parse()) { |
664 return Handle<SharedFunctionInfo>::null(); | 664 return Handle<SharedFunctionInfo>::null(); |
665 } | 665 } |
666 } | 666 } |
667 | 667 |
668 // Measure how long it takes to do the compilation; only take the | |
669 // rest of the function into account to avoid overlap with the | |
670 // parsing statistics. | |
671 HistogramTimer* rate = info->is_eval() | |
672 ? info->isolate()->counters()->compile_eval() | |
673 : info->isolate()->counters()->compile(); | |
674 HistogramTimerScope timer(rate); | |
675 | |
676 // Compile the code. | |
677 FunctionLiteral* lit = info->function(); | 668 FunctionLiteral* lit = info->function(); |
678 LiveEditFunctionTracker live_edit_tracker(isolate, lit); | 669 LiveEditFunctionTracker live_edit_tracker(isolate, lit); |
679 if (!MakeCode(info)) { | 670 Handle<SharedFunctionInfo> result; |
680 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | 671 { |
681 return Handle<SharedFunctionInfo>::null(); | 672 // Measure how long it takes to do the compilation; only take the |
| 673 // rest of the function into account to avoid overlap with the |
| 674 // parsing statistics. |
| 675 HistogramTimer* rate = info->is_eval() |
| 676 ? info->isolate()->counters()->compile_eval() |
| 677 : info->isolate()->counters()->compile(); |
| 678 HistogramTimerScope timer(rate); |
| 679 |
| 680 // Compile the code. |
| 681 if (!MakeCode(info)) { |
| 682 if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
| 683 return Handle<SharedFunctionInfo>::null(); |
| 684 } |
| 685 |
| 686 // Allocate function. |
| 687 ASSERT(!info->code().is_null()); |
| 688 result = |
| 689 isolate->factory()->NewSharedFunctionInfo( |
| 690 lit->name(), |
| 691 lit->materialized_literal_count(), |
| 692 lit->is_generator(), |
| 693 info->code(), |
| 694 ScopeInfo::Create(info->scope(), info->zone())); |
| 695 |
| 696 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); |
| 697 Compiler::SetFunctionInfo(result, lit, true, script); |
| 698 |
| 699 if (script->name()->IsString()) { |
| 700 PROFILE(isolate, CodeCreateEvent( |
| 701 info->is_eval() |
| 702 ? Logger::EVAL_TAG |
| 703 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), |
| 704 *info->code(), |
| 705 *result, |
| 706 info, |
| 707 String::cast(script->name()))); |
| 708 GDBJIT(AddCode(Handle<String>(String::cast(script->name())), |
| 709 script, |
| 710 info->code(), |
| 711 info)); |
| 712 } else { |
| 713 PROFILE(isolate, CodeCreateEvent( |
| 714 info->is_eval() |
| 715 ? Logger::EVAL_TAG |
| 716 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), |
| 717 *info->code(), |
| 718 *result, |
| 719 info, |
| 720 isolate->heap()->empty_string())); |
| 721 GDBJIT(AddCode(Handle<String>(), script, info->code(), info)); |
| 722 } |
| 723 |
| 724 // Hint to the runtime system used when allocating space for initial |
| 725 // property space by setting the expected number of properties for |
| 726 // the instances of the function. |
| 727 SetExpectedNofPropertiesFromEstimate(result, |
| 728 lit->expected_property_count()); |
| 729 |
| 730 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); |
682 } | 731 } |
683 | 732 |
684 // Allocate function. | |
685 ASSERT(!info->code().is_null()); | |
686 Handle<SharedFunctionInfo> result = | |
687 isolate->factory()->NewSharedFunctionInfo( | |
688 lit->name(), | |
689 lit->materialized_literal_count(), | |
690 lit->is_generator(), | |
691 info->code(), | |
692 ScopeInfo::Create(info->scope(), info->zone())); | |
693 | |
694 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); | |
695 Compiler::SetFunctionInfo(result, lit, true, script); | |
696 | |
697 if (script->name()->IsString()) { | |
698 PROFILE(isolate, CodeCreateEvent( | |
699 info->is_eval() | |
700 ? Logger::EVAL_TAG | |
701 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), | |
702 *info->code(), | |
703 *result, | |
704 info, | |
705 String::cast(script->name()))); | |
706 GDBJIT(AddCode(Handle<String>(String::cast(script->name())), | |
707 script, | |
708 info->code(), | |
709 info)); | |
710 } else { | |
711 PROFILE(isolate, CodeCreateEvent( | |
712 info->is_eval() | |
713 ? Logger::EVAL_TAG | |
714 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), | |
715 *info->code(), | |
716 *result, | |
717 info, | |
718 isolate->heap()->empty_string())); | |
719 GDBJIT(AddCode(Handle<String>(), script, info->code(), info)); | |
720 } | |
721 | |
722 // Hint to the runtime system used when allocating space for initial | |
723 // property space by setting the expected number of properties for | |
724 // the instances of the function. | |
725 SetExpectedNofPropertiesFromEstimate(result, lit->expected_property_count()); | |
726 | |
727 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); | |
728 | |
729 #ifdef ENABLE_DEBUGGER_SUPPORT | 733 #ifdef ENABLE_DEBUGGER_SUPPORT |
730 // Notify debugger | 734 // Notify debugger |
731 isolate->debugger()->OnAfterCompile( | 735 isolate->debugger()->OnAfterCompile( |
732 script, Debugger::NO_AFTER_COMPILE_FLAGS); | 736 script, Debugger::NO_AFTER_COMPILE_FLAGS); |
733 #endif | 737 #endif |
734 | 738 |
735 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); | 739 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); |
736 | 740 |
737 return result; | 741 return result; |
738 } | 742 } |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1346 AllowHandleDereference allow_deref; | 1350 AllowHandleDereference allow_deref; |
1347 bool tracing_on = info()->IsStub() | 1351 bool tracing_on = info()->IsStub() |
1348 ? FLAG_trace_hydrogen_stubs | 1352 ? FLAG_trace_hydrogen_stubs |
1349 : (FLAG_trace_hydrogen && | 1353 : (FLAG_trace_hydrogen && |
1350 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); | 1354 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); |
1351 return (tracing_on && | 1355 return (tracing_on && |
1352 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); | 1356 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); |
1353 } | 1357 } |
1354 | 1358 |
1355 } } // namespace v8::internal | 1359 } } // namespace v8::internal |
OLD | NEW |