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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 code_size += function->shared()->SourceSize(); | 177 code_size += function->shared()->SourceSize(); |
178 PrintF("Compiled: %d functions with %d byte source size in %fms.\n", | 178 PrintF("Compiled: %d functions with %d byte source size in %fms.\n", |
179 compiled_functions, | 179 compiled_functions, |
180 code_size, | 180 code_size, |
181 compilation_time); | 181 compilation_time); |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 | 185 |
186 static bool MakeCrankshaftCode(CompilationInfo* info) { | 186 static bool MakeCrankshaftCode(CompilationInfo* info) { |
187 // Test if we can optimize this function when asked to. We can only | 187 ASSERT(V8::UseCrankshaft()); |
188 // do this after the scopes are computed. | 188 ASSERT(info->IsOptimizing()); |
189 if (!V8::UseCrankshaft()) { | 189 ASSERT(!info->IsCompilingForDebugging()); |
190 info->DisableOptimization(); | |
191 } | |
192 | |
193 // In case we are not optimizing simply return the code from | |
194 // the full code generator. | |
195 if (!info->IsOptimizing()) { | |
196 return FullCodeGenerator::MakeCode(info); | |
197 } | |
198 | 190 |
199 // We should never arrive here if there is not code object on the | 191 // We should never arrive here if there is not code object on the |
200 // shared function object. | 192 // shared function object. |
201 Handle<Code> code(info->shared_info()->code()); | 193 Handle<Code> code(info->shared_info()->code()); |
202 ASSERT(code->kind() == Code::FUNCTION); | 194 ASSERT(code->kind() == Code::FUNCTION); |
203 | 195 |
204 // We should never arrive here if optimization has been disabled on the | 196 // We should never arrive here if optimization has been disabled on the |
205 // shared function info. | 197 // shared function info. |
206 ASSERT(!info->shared_info()->optimization_disabled()); | 198 ASSERT(!info->shared_info()->optimization_disabled()); |
207 | 199 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 // function that bailed out. | 315 // function that bailed out. |
324 info->shared_info()->DisableOptimization(); | 316 info->shared_info()->DisableOptimization(); |
325 } | 317 } |
326 // True indicates the compilation pipeline is still going, not necessarily | 318 // True indicates the compilation pipeline is still going, not necessarily |
327 // that we optimized the code. | 319 // that we optimized the code. |
328 return true; | 320 return true; |
329 } | 321 } |
330 | 322 |
331 | 323 |
332 static bool GenerateCode(CompilationInfo* info) { | 324 static bool GenerateCode(CompilationInfo* info) { |
333 return info->IsCompilingForDebugging() || !V8::UseCrankshaft() ? | 325 bool is_optimizing = V8::UseCrankshaft() && |
334 FullCodeGenerator::MakeCode(info) : | 326 !info->IsCompilingForDebugging() && |
335 MakeCrankshaftCode(info); | 327 info->IsOptimizing(); |
| 328 if (is_optimizing) { |
| 329 return MakeCrankshaftCode(info); |
| 330 } else { |
| 331 if (info->IsOptimizing()) { |
| 332 // Have the CompilationInfo decide if the compilation should be |
| 333 // BASE or NONOPT. |
| 334 info->DisableOptimization(); |
| 335 } |
| 336 return FullCodeGenerator::MakeCode(info); |
| 337 } |
336 } | 338 } |
337 | 339 |
338 | 340 |
339 static bool MakeCode(CompilationInfo* info) { | 341 static bool MakeCode(CompilationInfo* info) { |
340 // Precondition: code has been parsed. Postcondition: the code field in | 342 // Precondition: code has been parsed. Postcondition: the code field in |
341 // the compilation info is set if compilation succeeded. | 343 // the compilation info is set if compilation succeeded. |
342 ASSERT(info->function() != NULL); | 344 ASSERT(info->function() != NULL); |
343 return Rewriter::Rewrite(info) && Scope::Analyze(info) && GenerateCode(info); | 345 return Rewriter::Rewrite(info) && Scope::Analyze(info) && GenerateCode(info); |
344 } | 346 } |
345 | 347 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 bool allow_lazy = literal->AllowsLazyCompilation() && | 757 bool allow_lazy = literal->AllowsLazyCompilation() && |
756 !LiveEditFunctionTracker::IsActive(info.isolate()) && | 758 !LiveEditFunctionTracker::IsActive(info.isolate()) && |
757 (!info.isolate()->DebuggerHasBreakPoints() || allow_lazy_without_ctx); | 759 (!info.isolate()->DebuggerHasBreakPoints() || allow_lazy_without_ctx); |
758 | 760 |
759 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); | 761 Handle<ScopeInfo> scope_info(ScopeInfo::Empty()); |
760 | 762 |
761 // Generate code | 763 // Generate code |
762 if (FLAG_lazy && allow_lazy) { | 764 if (FLAG_lazy && allow_lazy) { |
763 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); | 765 Handle<Code> code = info.isolate()->builtins()->LazyCompile(); |
764 info.SetCode(code); | 766 info.SetCode(code); |
765 } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) || | 767 } else if (GenerateCode(&info)) { |
766 (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) { | |
767 ASSERT(!info.code().is_null()); | 768 ASSERT(!info.code().is_null()); |
768 scope_info = ScopeInfo::Create(info.scope(), info.zone()); | 769 scope_info = ScopeInfo::Create(info.scope(), info.zone()); |
769 } else { | 770 } else { |
770 return Handle<SharedFunctionInfo>::null(); | 771 return Handle<SharedFunctionInfo>::null(); |
771 } | 772 } |
772 | 773 |
773 // Create a shared function info object. | 774 // Create a shared function info object. |
774 Handle<SharedFunctionInfo> result = | 775 Handle<SharedFunctionInfo> result = |
775 FACTORY->NewSharedFunctionInfo(literal->name(), | 776 FACTORY->NewSharedFunctionInfo(literal->name(), |
776 literal->materialized_literal_count(), | 777 literal->materialized_literal_count(), |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 } | 858 } |
858 } | 859 } |
859 | 860 |
860 GDBJIT(AddCode(Handle<String>(shared->DebugName()), | 861 GDBJIT(AddCode(Handle<String>(shared->DebugName()), |
861 Handle<Script>(info->script()), | 862 Handle<Script>(info->script()), |
862 Handle<Code>(info->code()), | 863 Handle<Code>(info->code()), |
863 info)); | 864 info)); |
864 } | 865 } |
865 | 866 |
866 } } // namespace v8::internal | 867 } } // namespace v8::internal |
OLD | NEW |