Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 6978da462df57a3a0d02278f2d2de1c8519f3dc2..86e8f2f18f1b67231f4c101917bd765c0f793fe5 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -637,13 +637,14 @@ static bool CompileUnoptimizedCode(CompilationInfo* info) { |
} |
-static Handle<Code> GetUnoptimizedCodeCommon(CompilationInfo* info) { |
+MUST_USE_RESULT static MaybeHandle<Code> GetUnoptimizedCodeCommon( |
+ CompilationInfo* info) { |
VMState<COMPILER> state(info->isolate()); |
PostponeInterruptsScope postpone(info->isolate()); |
- if (!Parser::Parse(info)) return Handle<Code>::null(); |
+ if (!Parser::Parse(info)) return MaybeHandle<Code>(); |
info->SetStrictMode(info->function()->strict_mode()); |
- if (!CompileUnoptimizedCode(info)) return Handle<Code>::null(); |
+ if (!CompileUnoptimizedCode(info)) return MaybeHandle<Code>(); |
Compiler::RecordFunctionCompilation( |
Logger::LAZY_COMPILE_TAG, info, info->shared_info()); |
UpdateSharedFunctionInfo(info); |
@@ -652,7 +653,7 @@ static Handle<Code> GetUnoptimizedCodeCommon(CompilationInfo* info) { |
} |
-Handle<Code> Compiler::GetUnoptimizedCode(Handle<JSFunction> function) { |
+MaybeHandle<Code> Compiler::GetUnoptimizedCode(Handle<JSFunction> function) { |
ASSERT(!function->GetIsolate()->has_pending_exception()); |
ASSERT(!function->is_compiled()); |
if (function->shared()->is_compiled()) { |
@@ -660,39 +661,43 @@ Handle<Code> Compiler::GetUnoptimizedCode(Handle<JSFunction> function) { |
} |
CompilationInfoWithZone info(function); |
- Handle<Code> result = GetUnoptimizedCodeCommon(&info); |
- ASSERT_EQ(result.is_null(), info.isolate()->has_pending_exception()); |
+ Handle<Code> result; |
+ ASSIGN_RETURN_ON_EXCEPTION(info.isolate(), result, |
+ GetUnoptimizedCodeCommon(&info), |
+ Code); |
if (FLAG_always_opt && |
- !result.is_null() && |
info.isolate()->use_crankshaft() && |
!info.shared_info()->optimization_disabled() && |
!info.isolate()->DebuggerHasBreakPoints()) { |
- Handle<Code> opt_code = Compiler::GetOptimizedCode( |
- function, result, Compiler::NOT_CONCURRENT); |
- if (!opt_code.is_null()) result = opt_code; |
+ Handle<Code> opt_code; |
+ if (Compiler::GetOptimizedCode( |
+ function, result, |
+ Compiler::NOT_CONCURRENT).ToHandle(&opt_code)) { |
+ result = opt_code; |
+ } |
} |
return result; |
} |
-Handle<Code> Compiler::GetUnoptimizedCode(Handle<SharedFunctionInfo> shared) { |
+MaybeHandle<Code> Compiler::GetUnoptimizedCode( |
+ Handle<SharedFunctionInfo> shared) { |
ASSERT(!shared->GetIsolate()->has_pending_exception()); |
ASSERT(!shared->is_compiled()); |
CompilationInfoWithZone info(shared); |
- Handle<Code> result = GetUnoptimizedCodeCommon(&info); |
- ASSERT_EQ(result.is_null(), info.isolate()->has_pending_exception()); |
- return result; |
+ return GetUnoptimizedCodeCommon(&info); |
} |
bool Compiler::EnsureCompiled(Handle<JSFunction> function, |
ClearExceptionFlag flag) { |
if (function->is_compiled()) return true; |
- Handle<Code> code = Compiler::GetUnoptimizedCode(function); |
- if (code.is_null()) { |
+ MaybeHandle<Code> maybe_code = Compiler::GetUnoptimizedCode(function); |
+ Handle<Code> code; |
+ if (!maybe_code.ToHandle(&code)) { |
if (flag == CLEAR_EXCEPTION) { |
function->GetIsolate()->clear_pending_exception(); |
} |
@@ -713,7 +718,7 @@ bool Compiler::EnsureCompiled(Handle<JSFunction> function, |
// full code without debug break slots to full code with debug break slots |
// depends on the generated code is otherwise exactly the same. |
// If compilation fails, just keep the existing code. |
-Handle<Code> Compiler::GetCodeForDebugging(Handle<JSFunction> function) { |
+MaybeHandle<Code> Compiler::GetCodeForDebugging(Handle<JSFunction> function) { |
CompilationInfoWithZone info(function); |
Isolate* isolate = info.isolate(); |
VMState<COMPILER> state(isolate); |
@@ -729,14 +734,15 @@ Handle<Code> Compiler::GetCodeForDebugging(Handle<JSFunction> function) { |
} else { |
info.MarkNonOptimizable(); |
} |
- Handle<Code> new_code = GetUnoptimizedCodeCommon(&info); |
- if (new_code.is_null()) { |
+ MaybeHandle<Code> maybe_new_code = GetUnoptimizedCodeCommon(&info); |
+ Handle<Code> new_code; |
+ if (!maybe_new_code.ToHandle(&new_code)) { |
isolate->clear_pending_exception(); |
} else { |
ASSERT_EQ(old_code->is_compiled_optimizable(), |
new_code->is_compiled_optimizable()); |
} |
- return new_code; |
+ return maybe_new_code; |
} |
@@ -1048,8 +1054,9 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, |
} |
-static Handle<Code> GetCodeFromOptimizedCodeMap(Handle<JSFunction> function, |
- BailoutId osr_ast_id) { |
+MUST_USE_RESULT static MaybeHandle<Code> GetCodeFromOptimizedCodeMap( |
+ Handle<JSFunction> function, |
+ BailoutId osr_ast_id) { |
if (FLAG_cache_optimized_code) { |
Handle<SharedFunctionInfo> shared(function->shared()); |
DisallowHeapAllocation no_gc; |
@@ -1069,7 +1076,7 @@ static Handle<Code> GetCodeFromOptimizedCodeMap(Handle<JSFunction> function, |
return Handle<Code>(shared->GetCodeFromOptimizedCodeMap(index)); |
} |
} |
- return Handle<Code>::null(); |
+ return MaybeHandle<Code>(); |
} |
@@ -1156,12 +1163,15 @@ static bool GetOptimizedCodeLater(CompilationInfo* info) { |
} |
-Handle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, |
- Handle<Code> current_code, |
- ConcurrencyMode mode, |
- BailoutId osr_ast_id) { |
- Handle<Code> cached_code = GetCodeFromOptimizedCodeMap(function, osr_ast_id); |
- if (!cached_code.is_null()) return cached_code; |
+MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, |
+ Handle<Code> current_code, |
+ ConcurrencyMode mode, |
+ BailoutId osr_ast_id) { |
+ Handle<Code> cached_code; |
+ if (GetCodeFromOptimizedCodeMap( |
+ function, osr_ast_id).ToHandle(&cached_code)) { |
+ return cached_code; |
+ } |
SmartPointer<CompilationInfo> info(new CompilationInfoWithZone(function)); |
Isolate* isolate = info->isolate(); |
@@ -1194,7 +1204,7 @@ Handle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, |
} |
if (isolate->has_pending_exception()) isolate->clear_pending_exception(); |
- return Handle<Code>::null(); |
+ return MaybeHandle<Code>(); |
} |