Index: src/runtime/runtime-compiler.cc |
diff --git a/src/runtime/runtime-compiler.cc b/src/runtime/runtime-compiler.cc |
index 263c4f9e7758f66cabaa126fa47e73b740dc6fbd..6e7932c140e9d0f4d03e382a6150c7256a6a970e 100644 |
--- a/src/runtime/runtime-compiler.cc |
+++ b/src/runtime/runtime-compiler.cc |
@@ -21,6 +21,7 @@ RUNTIME_FUNCTION(Runtime_CompileLazy) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 1); |
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
+ |
#ifdef DEBUG |
if (FLAG_trace_lazy && !function->shared()->is_compiled()) { |
PrintF("[unoptimized: "); |
@@ -28,63 +29,28 @@ RUNTIME_FUNCTION(Runtime_CompileLazy) { |
PrintF("]\n"); |
} |
#endif |
- StackLimitCheck check(isolate); |
- if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); |
- |
- // Compile the target function. |
- DCHECK(function->shared()->allows_lazy_compilation()); |
- |
- Handle<Code> code; |
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, code, |
- Compiler::GetLazyCode(function)); |
- DCHECK(code->IsJavaScriptCode()); |
- |
- function->ReplaceCode(*code); |
- return *code; |
-} |
- |
-namespace { |
- |
-Object* CompileOptimized(Isolate* isolate, Handle<JSFunction> function, |
- Compiler::ConcurrencyMode mode) { |
StackLimitCheck check(isolate); |
if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); |
- |
- Handle<Code> code; |
- if (Compiler::GetOptimizedCode(function, mode).ToHandle(&code)) { |
- // Optimization succeeded, return optimized code. |
- function->ReplaceCode(*code); |
- } else { |
- // Optimization failed, get unoptimized code. |
- if (isolate->has_pending_exception()) { // Possible stack overflow. |
- return isolate->heap()->exception(); |
- } |
- code = Handle<Code>(function->shared()->code(), isolate); |
- if (code->kind() != Code::FUNCTION && |
- code->kind() != Code::OPTIMIZED_FUNCTION) { |
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, code, Compiler::GetUnoptimizedCode(function)); |
- } |
- function->ReplaceCode(*code); |
+ if (!Compiler::Compile(function, KEEP_EXCEPTION)) { |
+ return isolate->heap()->exception(); |
} |
- |
- DCHECK(function->code()->kind() == Code::FUNCTION || |
- function->code()->kind() == Code::OPTIMIZED_FUNCTION || |
- (function->code()->is_interpreter_entry_trampoline() && |
- function->shared()->HasBytecodeArray()) || |
- function->IsInOptimizationQueue()); |
+ DCHECK(function->is_compiled()); |
return function->code(); |
} |
-} // namespace |
- |
RUNTIME_FUNCTION(Runtime_CompileOptimized_Concurrent) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 1); |
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
- return CompileOptimized(isolate, function, Compiler::CONCURRENT); |
+ StackLimitCheck check(isolate); |
+ if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); |
+ if (!Compiler::CompileOptimized(function, Compiler::CONCURRENT)) { |
+ return isolate->heap()->exception(); |
+ } |
+ DCHECK(function->is_compiled()); |
+ return function->code(); |
} |
@@ -92,7 +58,13 @@ RUNTIME_FUNCTION(Runtime_CompileOptimized_NotConcurrent) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 1); |
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
- return CompileOptimized(isolate, function, Compiler::NOT_CONCURRENT); |
+ StackLimitCheck check(isolate); |
+ if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); |
+ if (!Compiler::CompileOptimized(function, Compiler::NOT_CONCURRENT)) { |
+ return isolate->heap()->exception(); |
+ } |
+ DCHECK(function->is_compiled()); |
+ return function->code(); |
} |