v8/test/mjsunit/compiler/try-finally-deopt.js

262 lines
4.6 KiB
JavaScript
Raw Normal View History

// Copyright 2016 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 DeoptimizeFinallyFallThrough() {
var global = 0;
function f() {
var a = 1;
try {
global = 1;
} finally {
global = 42;
%DeoptimizeNow();
}
return global + a;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(43, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyReturn() {
var global = 0;
function f() {
try {
return 10;
} finally {
global = 42;
%DeoptimizeNow();
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(10, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyReturnDoublyNested() {
var global = 0;
function f() {
try {
try {
return 10;
} finally {
global += 21;
%DeoptimizeNow();
}
} finally {
global += 21;
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
global = 0;
assertEquals(10, f());
assertEquals(42, global);
})();
(function DeoptimizeOuterFinallyReturnDoublyNested() {
var global = 0;
function f() {
try {
try {
return 10;
} finally {
global += 21;
}
} finally {
global += 21;
%DeoptimizeNow();
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
global = 0;
assertEquals(10, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyThrow() {
var global = 0;
function f() {
try {
global = 21;
throw 1;
global = 2;
} finally {
global += 21;
%DeoptimizeNow();
}
global = 3;
return 1;
}
%PrepareFunctionForOptimization(f);
try { f(); } catch(e) {}
try { f(); } catch(e) {}
%OptimizeFunctionOnNextCall(f);
assertThrowsEquals(f, 1);
assertEquals(42, global);
})();
(function DeoptimizeFinallyThrowNested() {
var global = 0;
function f() {
try {
try {
global = 10;
throw 1;
global = 2;
} finally {
global += 11;
%DeoptimizeNow();
}
global = 4;
} finally {
global += 21;
}
global = 3;
return 1;
}
%PrepareFunctionForOptimization(f);
try { f(); } catch(e) {}
try { f(); } catch(e) {}
%OptimizeFunctionOnNextCall(f);
assertThrowsEquals(f, 1);
assertEquals(42, global);
})();
(function DeoptimizeFinallyContinue() {
var global = 0;
function f() {
global = 0;
for (var i = 0; i < 2; i++) {
try {
if (i == 0) continue;
global += 10;
} finally {
global += 6;
%DeoptimizeNow();
}
global += 20;
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(1, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyContinueNestedTry() {
var global = 0;
function f() {
global = 0;
for (var i = 0; i < 2; i++) {
try {
try {
if (i == 0) continue;
global += 5;
} finally {
global += 4;
%DeoptimizeNow();
}
global += 5;
} finally {
global += 2;
}
global += 20;
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(1, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyBreak() {
var global = 0;
function f() {
global = 0;
for (var i = 0; i < 2; i++) {
try {
global += 20;
if (i == 0) break;
global += 5;
} finally {
global += 22;
%DeoptimizeNow();
}
global += 5;
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(1, f());
assertEquals(42, global);
})();
(function DeoptimizeFinallyBreakNested() {
var global = 0;
function f() {
global = 0;
for (var i = 0; i < 2; i++) {
try {
try {
global += 20;
if (i == 0) break;
global += 5;
} finally {
global += 12;
%DeoptimizeNow();
}
global += 8;
} finally {
global += 10;
}
global += 5;
}
return 1;
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(1, f());
assertEquals(42, global);
})();