Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1565)

Unified Diff: test/mjsunit/compiler/inline-exception.js

Issue 2216353002: [turbofan] Also inline into try blocks. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@p5-base
Patch Set: Don't inspect control outputs if the operator is NoThrow Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/mjsunit/compiler/inline-exception.js
diff --git a/test/mjsunit/compiler/inline-exception.js b/test/mjsunit/compiler/inline-exception.js
new file mode 100644
index 0000000000000000000000000000000000000000..3d1269594689984cabe20ac70aaa278c01d84015
--- /dev/null
+++ b/test/mjsunit/compiler/inline-exception.js
@@ -0,0 +1,20173 @@
+// Copyright 2016 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Flags: --allow-natives-syntax --turbo
+
+// This test file was generated by tools/gen-inlining-tests.py .
+
+function assertOptResultEquals(expected, f) {
+ // f();
+ // %DebugPrint(f);
+ eval("'dont optimize this function itself please, but do optimize f'");
+ %OptimizeFunctionOnNextCall(f);
+ assertEquals(expected, f());
+}
+
+function assertOptThrowsWith(expected, f) {
+ // f();
+ // %DebugPrint(f);
+ eval("'dont optimize this function itself please, but do optimize f'");
+ %OptimizeFunctionOnNextCall(f);
+ try {
+ var result = f();
+ fail("assertOptThrowsWith", "exception: " + expected, "result: " + result);
+ } catch (ex) {
+ assertEquals(expected, ex);
+ }
+}
+
+var counter = 0;
+
+function increaseAndReturn15() {
+ counter++;
+ return 15;
+}
+
+function increaseAndThrow42() {
+ counter++;
+ throw 42;
+}
+
+function returnOrThrow(doReturn) {
+ if (doReturn) {
+ return increaseAndReturn15();
+ } else {
+ return increaseAndThrow42();
+ }
+}
+
+// When passed either {increaseAndReturn15} or {increaseAndThrow42}, it acts
+// as the other one.
+function invertFunctionCall(f) {
+ var result;
+ try {
+ result = f();
+ } catch (ex) {
+ return ex - 27;
+ }
+ throw result + 27;
+}
+
+// Variant flags: [tryThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchThrows, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryThrows, tryResultToLocal, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchThrows, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndThrow42();
+ return increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryResultToLocal, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndThrow42();
+ local += increaseAndReturn15();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns, doCatch,
+// catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return increaseAndReturn15();
+ return increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(8, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(8, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchThrows, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(65, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(8, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(67, f);
+assertEquals(8, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(63, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(63, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchWithLocal, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(20, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(20, f);
+assertEquals(4, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(20, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(20, f);
+assertEquals(6, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [tryReturns, tryThrows, tryFirstReturns,
+// tryResultToLocal, doCatch, catchReturns, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += increaseAndReturn15();
+ local += increaseAndThrow42();
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(false);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn1, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += returnOrThrow(true);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchWithLocal,
+// catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(42, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(8, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(10, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(50, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(52, f);
+assertEquals(7, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(48, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(44, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(5, f);
+assertEquals(5, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryThrows, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndReturn15);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally,
+// finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally,
+// finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally,
+// finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, doFinally,
+// finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch,
+// catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(2, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(15, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, doCatch, catchReturns,
+// catchWithLocal, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ return invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(6, f);
+assertEquals(3, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchThrows, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ local += ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchWithLocal, catchThrows, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ throw 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyThrows, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, doFinally, finallyReturns, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + ex;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(23, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(undefined, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ local += 2;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(25, f);
+assertEquals(6, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyThrows,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ throw 25;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptThrowsWith(25, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Variant flags: [alternativeFn2, tryReturns, tryResultToLocal,
+// doCatch, catchReturns, catchWithLocal, doFinally, finallyReturns,
+// endReturnLocal]
+
+counter = 0;
+var f = function() {
+ var local = 3;
+ try {
+ counter++;
+ local += invertFunctionCall(increaseAndThrow42);
+ counter++;
+ } catch (ex) {
+ counter++;
+ return 2 + local;
+ counter++;
+ } finally {
+ counter++;
+ return 3 + local;
+ counter++;
+ }
+ counter++;
+ return 5 + local;
+}
+assertOptResultEquals(21, f);
+assertEquals(4, counter);
+
+// Total: 864 tests.

Powered by Google App Engine
This is Rietveld 408576698