| 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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 | 291 |
| 292 // Determine whether to use the full compiler for all code. If the flag | 292 // Determine whether to use the full compiler for all code. If the flag |
| 293 // --always-full-compiler is specified this is the case. For the virtual frame | 293 // --always-full-compiler is specified this is the case. For the virtual frame |
| 294 // based compiler the full compiler is also used if a debugger is connected, as | 294 // based compiler the full compiler is also used if a debugger is connected, as |
| 295 // the code from the full compiler supports mode precise break points. For the | 295 // the code from the full compiler supports mode precise break points. For the |
| 296 // crankshaft adaptive compiler debugging the optimized code is not possible at | 296 // crankshaft adaptive compiler debugging the optimized code is not possible at |
| 297 // all. However crankshaft support recompilation of functions, so in this case | 297 // all. However crankshaft support recompilation of functions, so in this case |
| 298 // the full compiler need not be be used if a debugger is attached, but only if | 298 // the full compiler need not be be used if a debugger is attached, but only if |
| 299 // break points has actually been set. | 299 // break points has actually been set. |
| 300 static bool IsDebuggerActive(Isolate* isolate) { | 300 static bool IsDebuggerActive(Isolate* isolate) { |
| 301 #ifdef ENABLE_DEBUGGER_SUPPORT | |
| 302 return isolate->use_crankshaft() ? | 301 return isolate->use_crankshaft() ? |
| 303 isolate->debug()->has_break_points() : | 302 isolate->debug()->has_break_points() : |
| 304 isolate->debugger()->IsDebuggerActive(); | 303 isolate->debugger()->IsDebuggerActive(); |
| 305 #else | |
| 306 return false; | |
| 307 #endif | |
| 308 } | 304 } |
| 309 | 305 |
| 310 | 306 |
| 311 OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { | 307 OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { |
| 312 ASSERT(isolate()->use_crankshaft()); | 308 ASSERT(isolate()->use_crankshaft()); |
| 313 ASSERT(info()->IsOptimizing()); | 309 ASSERT(info()->IsOptimizing()); |
| 314 ASSERT(!info()->IsCompilingForDebugging()); | 310 ASSERT(!info()->IsCompilingForDebugging()); |
| 315 | 311 |
| 316 // We should never arrive here if there is no code object on the | 312 // We should never arrive here if there is no code object on the |
| 317 // shared function object. | 313 // shared function object. |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 if (!maybe_new_code.ToHandle(&new_code)) { | 735 if (!maybe_new_code.ToHandle(&new_code)) { |
| 740 isolate->clear_pending_exception(); | 736 isolate->clear_pending_exception(); |
| 741 } else { | 737 } else { |
| 742 ASSERT_EQ(old_code->is_compiled_optimizable(), | 738 ASSERT_EQ(old_code->is_compiled_optimizable(), |
| 743 new_code->is_compiled_optimizable()); | 739 new_code->is_compiled_optimizable()); |
| 744 } | 740 } |
| 745 return maybe_new_code; | 741 return maybe_new_code; |
| 746 } | 742 } |
| 747 | 743 |
| 748 | 744 |
| 749 #ifdef ENABLE_DEBUGGER_SUPPORT | |
| 750 void Compiler::CompileForLiveEdit(Handle<Script> script) { | 745 void Compiler::CompileForLiveEdit(Handle<Script> script) { |
| 751 // TODO(635): support extensions. | 746 // TODO(635): support extensions. |
| 752 CompilationInfoWithZone info(script); | 747 CompilationInfoWithZone info(script); |
| 753 PostponeInterruptsScope postpone(info.isolate()); | 748 PostponeInterruptsScope postpone(info.isolate()); |
| 754 VMState<COMPILER> state(info.isolate()); | 749 VMState<COMPILER> state(info.isolate()); |
| 755 | 750 |
| 756 info.MarkAsGlobal(); | 751 info.MarkAsGlobal(); |
| 757 if (!Parser::Parse(&info)) return; | 752 if (!Parser::Parse(&info)) return; |
| 758 info.SetStrictMode(info.function()->strict_mode()); | 753 info.SetStrictMode(info.function()->strict_mode()); |
| 759 | 754 |
| 760 LiveEditFunctionTracker tracker(info.isolate(), info.function()); | 755 LiveEditFunctionTracker tracker(info.isolate(), info.function()); |
| 761 if (!CompileUnoptimizedCode(&info)) return; | 756 if (!CompileUnoptimizedCode(&info)) return; |
| 762 if (!info.shared_info().is_null()) { | 757 if (!info.shared_info().is_null()) { |
| 763 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info.scope(), | 758 Handle<ScopeInfo> scope_info = ScopeInfo::Create(info.scope(), |
| 764 info.zone()); | 759 info.zone()); |
| 765 info.shared_info()->set_scope_info(*scope_info); | 760 info.shared_info()->set_scope_info(*scope_info); |
| 766 } | 761 } |
| 767 tracker.RecordRootFunctionInfo(info.code()); | 762 tracker.RecordRootFunctionInfo(info.code()); |
| 768 } | 763 } |
| 769 #endif | |
| 770 | 764 |
| 771 | 765 |
| 772 static bool DebuggerWantsEagerCompilation(CompilationInfo* info, | 766 static bool DebuggerWantsEagerCompilation(CompilationInfo* info, |
| 773 bool allow_lazy_without_ctx = false) { | 767 bool allow_lazy_without_ctx = false) { |
| 774 return LiveEditFunctionTracker::IsActive(info->isolate()) || | 768 return LiveEditFunctionTracker::IsActive(info->isolate()) || |
| 775 (info->isolate()->DebuggerHasBreakPoints() && !allow_lazy_without_ctx); | 769 (info->isolate()->DebuggerHasBreakPoints() && !allow_lazy_without_ctx); |
| 776 } | 770 } |
| 777 | 771 |
| 778 | 772 |
| 779 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { | 773 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { |
| 780 Isolate* isolate = info->isolate(); | 774 Isolate* isolate = info->isolate(); |
| 781 PostponeInterruptsScope postpone(isolate); | 775 PostponeInterruptsScope postpone(isolate); |
| 782 ASSERT(!isolate->native_context().is_null()); | 776 ASSERT(!isolate->native_context().is_null()); |
| 783 Handle<Script> script = info->script(); | 777 Handle<Script> script = info->script(); |
| 784 | 778 |
| 785 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? | 779 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? |
| 786 FixedArray* array = isolate->native_context()->embedder_data(); | 780 FixedArray* array = isolate->native_context()->embedder_data(); |
| 787 script->set_context_data(array->get(0)); | 781 script->set_context_data(array->get(0)); |
| 788 | 782 |
| 789 #ifdef ENABLE_DEBUGGER_SUPPORT | |
| 790 isolate->debugger()->OnBeforeCompile(script); | 783 isolate->debugger()->OnBeforeCompile(script); |
| 791 #endif | |
| 792 | 784 |
| 793 ASSERT(info->is_eval() || info->is_global()); | 785 ASSERT(info->is_eval() || info->is_global()); |
| 794 | 786 |
| 795 bool parse_allow_lazy = | 787 bool parse_allow_lazy = |
| 796 (info->cached_data_mode() == CONSUME_CACHED_DATA || | 788 (info->cached_data_mode() == CONSUME_CACHED_DATA || |
| 797 String::cast(script->source())->length() > FLAG_min_preparse_length) && | 789 String::cast(script->source())->length() > FLAG_min_preparse_length) && |
| 798 !DebuggerWantsEagerCompilation(info); | 790 !DebuggerWantsEagerCompilation(info); |
| 799 | 791 |
| 800 if (!parse_allow_lazy && info->cached_data_mode() != NO_CACHED_DATA) { | 792 if (!parse_allow_lazy && info->cached_data_mode() != NO_CACHED_DATA) { |
| 801 // We are going to parse eagerly, but we either 1) have cached data produced | 793 // We are going to parse eagerly, but we either 1) have cached data produced |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 // property space by setting the expected number of properties for | 849 // property space by setting the expected number of properties for |
| 858 // the instances of the function. | 850 // the instances of the function. |
| 859 SetExpectedNofPropertiesFromEstimate(result, | 851 SetExpectedNofPropertiesFromEstimate(result, |
| 860 lit->expected_property_count()); | 852 lit->expected_property_count()); |
| 861 | 853 |
| 862 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); | 854 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); |
| 863 | 855 |
| 864 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); | 856 live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); |
| 865 } | 857 } |
| 866 | 858 |
| 867 #ifdef ENABLE_DEBUGGER_SUPPORT | |
| 868 isolate->debugger()->OnAfterCompile(script, Debugger::NO_AFTER_COMPILE_FLAGS); | 859 isolate->debugger()->OnAfterCompile(script, Debugger::NO_AFTER_COMPILE_FLAGS); |
| 869 #endif | |
| 870 | 860 |
| 871 return result; | 861 return result; |
| 872 } | 862 } |
| 873 | 863 |
| 874 | 864 |
| 875 MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( | 865 MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( |
| 876 Handle<String> source, | 866 Handle<String> source, |
| 877 Handle<Context> context, | 867 Handle<Context> context, |
| 878 StrictMode strict_mode, | 868 StrictMode strict_mode, |
| 879 ParseRestriction restriction, | 869 ParseRestriction restriction, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 891 | 881 |
| 892 if (!maybe_shared_info.ToHandle(&shared_info)) { | 882 if (!maybe_shared_info.ToHandle(&shared_info)) { |
| 893 Handle<Script> script = isolate->factory()->NewScript(source); | 883 Handle<Script> script = isolate->factory()->NewScript(source); |
| 894 CompilationInfoWithZone info(script); | 884 CompilationInfoWithZone info(script); |
| 895 info.MarkAsEval(); | 885 info.MarkAsEval(); |
| 896 if (context->IsNativeContext()) info.MarkAsGlobal(); | 886 if (context->IsNativeContext()) info.MarkAsGlobal(); |
| 897 info.SetStrictMode(strict_mode); | 887 info.SetStrictMode(strict_mode); |
| 898 info.SetParseRestriction(restriction); | 888 info.SetParseRestriction(restriction); |
| 899 info.SetContext(context); | 889 info.SetContext(context); |
| 900 | 890 |
| 901 #if ENABLE_DEBUGGER_SUPPORT | |
| 902 Debug::RecordEvalCaller(script); | 891 Debug::RecordEvalCaller(script); |
| 903 #endif // ENABLE_DEBUGGER_SUPPORT | |
| 904 | 892 |
| 905 shared_info = CompileToplevel(&info); | 893 shared_info = CompileToplevel(&info); |
| 906 | 894 |
| 907 if (shared_info.is_null()) { | 895 if (shared_info.is_null()) { |
| 908 return MaybeHandle<JSFunction>(); | 896 return MaybeHandle<JSFunction>(); |
| 909 } else { | 897 } else { |
| 910 // Explicitly disable optimization for eval code. We're not yet prepared | 898 // Explicitly disable optimization for eval code. We're not yet prepared |
| 911 // to handle eval-code in the optimizing compiler. | 899 // to handle eval-code in the optimizing compiler. |
| 912 shared_info->DisableOptimization(kEval); | 900 shared_info->DisableOptimization(kEval); |
| 913 | 901 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 AllowHandleDereference allow_deref; | 1302 AllowHandleDereference allow_deref; |
| 1315 bool tracing_on = info()->IsStub() | 1303 bool tracing_on = info()->IsStub() |
| 1316 ? FLAG_trace_hydrogen_stubs | 1304 ? FLAG_trace_hydrogen_stubs |
| 1317 : (FLAG_trace_hydrogen && | 1305 : (FLAG_trace_hydrogen && |
| 1318 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); | 1306 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); |
| 1319 return (tracing_on && | 1307 return (tracing_on && |
| 1320 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); | 1308 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); |
| 1321 } | 1309 } |
| 1322 | 1310 |
| 1323 } } // namespace v8::internal | 1311 } } // namespace v8::internal |
| OLD | NEW |