Fix bug in Runtime_CompileOptimized resulting from stack overflow.
R=jarin@chromium.org BUG=chromium:446389 LOG=Y Review URL: https://codereview.chromium.org/844503002 Cr-Commit-Position: refs/heads/master@{#25974}
This commit is contained in:
parent
fdf6777072
commit
d77d3ba9a3
@ -69,9 +69,20 @@ RUNTIME_FUNCTION(Runtime_CompileOptimized) {
|
|||||||
concurrent ? Compiler::CONCURRENT : Compiler::NOT_CONCURRENT;
|
concurrent ? Compiler::CONCURRENT : Compiler::NOT_CONCURRENT;
|
||||||
Handle<Code> code;
|
Handle<Code> code;
|
||||||
if (Compiler::GetOptimizedCode(function, unoptimized, mode).ToHandle(&code)) {
|
if (Compiler::GetOptimizedCode(function, unoptimized, mode).ToHandle(&code)) {
|
||||||
|
// Optimization succeeded, return optimized code.
|
||||||
function->ReplaceCode(*code);
|
function->ReplaceCode(*code);
|
||||||
} else {
|
} else {
|
||||||
function->ReplaceCode(function->shared()->code());
|
// 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
DCHECK(function->code()->kind() == Code::FUNCTION ||
|
DCHECK(function->code()->kind() == Code::FUNCTION ||
|
||||||
|
12
test/mjsunit/regress/regress-446389.js
Normal file
12
test/mjsunit/regress/regress-446389.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Copyright 2014 the V8 project authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
// Flags: --allow-natives-syntax
|
||||||
|
|
||||||
|
function runNearStackLimit(f) { function t() { try { t(); } catch(e) { f(); } }; try { t(); } catch(e) {} }
|
||||||
|
%OptimizeFunctionOnNextCall(__f_3);
|
||||||
|
function __f_3() {
|
||||||
|
var __v_5 = a[0];
|
||||||
|
}
|
||||||
|
runNearStackLimit(function() { __f_3(); });
|
Loading…
Reference in New Issue
Block a user