OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 8439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8450 } | 8450 } |
8451 | 8451 |
8452 | 8452 |
8453 RUNTIME_FUNCTION(Runtime_CompileOptimized) { | 8453 RUNTIME_FUNCTION(Runtime_CompileOptimized) { |
8454 HandleScope scope(isolate); | 8454 HandleScope scope(isolate); |
8455 DCHECK(args.length() == 2); | 8455 DCHECK(args.length() == 2); |
8456 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8456 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8457 CONVERT_BOOLEAN_ARG_CHECKED(concurrent, 1); | 8457 CONVERT_BOOLEAN_ARG_CHECKED(concurrent, 1); |
8458 | 8458 |
8459 Handle<Code> unoptimized(function->shared()->code()); | 8459 Handle<Code> unoptimized(function->shared()->code()); |
8460 if (!function->shared()->is_compiled()) { | 8460 if (!isolate->use_crankshaft() || |
8461 // If the function is not compiled, do not optimize. | 8461 function->shared()->optimization_disabled() || |
8462 // This can happen if the debugger is activated and | 8462 isolate->DebuggerHasBreakPoints()) { |
8463 // the function is returned to the not compiled state. | |
8464 // TODO(yangguo): reconsider this. | |
8465 function->ReplaceCode(function->shared()->code()); | |
8466 } else if (!isolate->use_crankshaft() || | |
8467 function->shared()->optimization_disabled() || | |
8468 isolate->DebuggerHasBreakPoints()) { | |
8469 // If the function is not optimizable or debugger is active continue | 8463 // If the function is not optimizable or debugger is active continue |
8470 // using the code from the full compiler. | 8464 // using the code from the full compiler. |
8471 if (FLAG_trace_opt) { | 8465 if (FLAG_trace_opt) { |
8472 PrintF("[failed to optimize "); | 8466 PrintF("[failed to optimize "); |
8473 function->PrintName(); | 8467 function->PrintName(); |
8474 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n", | 8468 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n", |
8475 function->shared()->optimization_disabled() ? "F" : "T", | 8469 function->shared()->optimization_disabled() ? "F" : "T", |
8476 isolate->DebuggerHasBreakPoints() ? "T" : "F"); | 8470 isolate->DebuggerHasBreakPoints() ? "T" : "F"); |
8477 } | 8471 } |
8478 function->ReplaceCode(*unoptimized); | 8472 function->ReplaceCode(*unoptimized); |
| 8473 return function->code(); |
| 8474 } |
| 8475 |
| 8476 Compiler::ConcurrencyMode mode = |
| 8477 concurrent ? Compiler::CONCURRENT : Compiler::NOT_CONCURRENT; |
| 8478 Handle<Code> code; |
| 8479 if (Compiler::GetOptimizedCode(function, unoptimized, mode).ToHandle(&code)) { |
| 8480 function->ReplaceCode(*code); |
8479 } else { | 8481 } else { |
8480 Compiler::ConcurrencyMode mode = concurrent ? Compiler::CONCURRENT | 8482 function->ReplaceCode(*unoptimized); |
8481 : Compiler::NOT_CONCURRENT; | |
8482 Handle<Code> code; | |
8483 if (Compiler::GetOptimizedCode( | |
8484 function, unoptimized, mode).ToHandle(&code)) { | |
8485 function->ReplaceCode(*code); | |
8486 } else { | |
8487 function->ReplaceCode(*unoptimized); | |
8488 } | |
8489 } | 8483 } |
8490 | 8484 |
8491 DCHECK(function->code()->kind() == Code::FUNCTION || | 8485 DCHECK(function->code()->kind() == Code::FUNCTION || |
8492 function->code()->kind() == Code::OPTIMIZED_FUNCTION || | 8486 function->code()->kind() == Code::OPTIMIZED_FUNCTION || |
8493 function->IsInOptimizationQueue()); | 8487 function->IsInOptimizationQueue()); |
8494 return function->code(); | 8488 return function->code(); |
8495 } | 8489 } |
8496 | 8490 |
8497 | 8491 |
8498 class ActivationsFinder : public ThreadVisitor { | 8492 class ActivationsFinder : public ThreadVisitor { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8634 return isolate->heap()->ToBoolean( | 8628 return isolate->heap()->ToBoolean( |
8635 isolate->concurrent_recompilation_enabled()); | 8629 isolate->concurrent_recompilation_enabled()); |
8636 } | 8630 } |
8637 | 8631 |
8638 | 8632 |
8639 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { | 8633 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { |
8640 HandleScope scope(isolate); | 8634 HandleScope scope(isolate); |
8641 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); | 8635 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); |
8642 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8636 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8643 | 8637 |
8644 if (!function->IsOptimizable() && | 8638 if (function->IsOptimized()) return isolate->heap()->undefined_value(); |
8645 !function->IsMarkedForConcurrentOptimization() && | |
8646 !function->IsInOptimizationQueue()) { | |
8647 return isolate->heap()->undefined_value(); | |
8648 } | |
8649 | 8639 |
8650 function->MarkForOptimization(); | 8640 function->MarkForOptimization(); |
8651 | 8641 |
8652 Code* unoptimized = function->shared()->code(); | 8642 Code* unoptimized = function->shared()->code(); |
8653 if (args.length() == 2 && | 8643 if (args.length() == 2 && |
8654 unoptimized->kind() == Code::FUNCTION) { | 8644 unoptimized->kind() == Code::FUNCTION) { |
8655 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); | 8645 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); |
8656 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr")) && FLAG_use_osr) { | 8646 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr")) && FLAG_use_osr) { |
8657 // Start patching from the currently patched loop nesting level. | 8647 // Start patching from the currently patched loop nesting level. |
8658 DCHECK(BackEdgeTable::Verify(isolate, unoptimized)); | 8648 DCHECK(BackEdgeTable::Verify(isolate, unoptimized)); |
(...skipping 6998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15657 } | 15647 } |
15658 return NULL; | 15648 return NULL; |
15659 } | 15649 } |
15660 | 15650 |
15661 | 15651 |
15662 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15652 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
15663 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15653 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
15664 } | 15654 } |
15665 | 15655 |
15666 } } // namespace v8::internal | 15656 } } // namespace v8::internal |
OLD | NEW |