v8/test/mjsunit/compiler/try-finally-deopt.js
jarin 1b33ffa49a Tests for deopt from finally block.
Review URL: https://codereview.chromium.org/1669303002

Cr-Commit-Position: refs/heads/master@{#33942}
2016-02-12 12:17:36 +00:00

250 lines
4.2 KiB
JavaScript

// 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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
f();
f();
%OptimizeFunctionOnNextCall(f);
assertEquals(1, f());
assertEquals(42, global);
})();