// Shard 2.

// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax --no-always-opt

// This test file was generated by tools/gen-inlining-tests.py .

// Global variables
var deopt = undefined; // either true or false
var counter = 0;

function resetState() {
  counter = 0;
}

function warmUp(f) {
  try {
    f();
  } catch (ex) {
    // ok
  }
  try {
    f();
  } catch (ex) {
    // ok
  }
}

function resetOptAndAssertResultEquals(expected, f) {
  %PrepareFunctionForOptimization(f);
  warmUp(f);
  resetState();
  // %DebugPrint(f);
  eval("'dont optimize this function itself please, but do optimize f'");
  %OptimizeFunctionOnNextCall(f);
  assertEquals(expected, f());
}

function resetOptAndAssertThrowsWith(expected, f) {
  %PrepareFunctionForOptimization(f);
  warmUp(f);
  resetState();
  // %DebugPrint(f);
  eval("'dont optimize this function itself please, but do optimize f'");
  %OptimizeFunctionOnNextCall(f);
  try {
    var result = f();
    fail("resetOptAndAssertThrowsWith",
        "exception: " + expected,
        "result: " + result);
  } catch (ex) {
    assertEquals(expected, ex);
  }
}

function increaseAndReturn15() {
  if (deopt) %DeoptimizeFunction(f);
  counter++;
  return 15;
}

function increaseAndThrow42() {
  if (deopt) %DeoptimizeFunction(f);
  counter++;
  throw 42;
}

function increaseAndReturn15_noopt_inner() {
  if (deopt) %DeoptimizeFunction(f);
  counter++;
  return 15;
}

%NeverOptimizeFunction(increaseAndReturn15_noopt_inner);

function increaseAndThrow42_noopt_inner() {
  if (deopt) %DeoptimizeFunction(f);
  counter++;
  throw 42;
}

%NeverOptimizeFunction(increaseAndThrow42_noopt_inner);

// Alternative 1

function returnOrThrow(doReturn) {
  if (doReturn) {
    return increaseAndReturn15();
  } else {
    return increaseAndThrow42();
  }
}

// Alternative 2

function increaseAndReturn15_calls_noopt() {
  return increaseAndReturn15_noopt_inner();
}

function increaseAndThrow42_calls_noopt() {
  return increaseAndThrow42_noopt_inner();
}

// Alternative 3.
// 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;
}

// Alternative 4: constructor
function increaseAndStore15Constructor() {
  if (deopt) %DeoptimizeFunction(f);
  ++counter;
  this.x = 15;
}

function increaseAndThrow42Constructor() {
  if (deopt) %DeoptimizeFunction(f);
  ++counter;
  this.x = 42;
  throw this.x;
}

// Alternative 5: property
var magic = {};
Object.defineProperty(magic, 'prop', {
  get: function () {
    if (deopt) %DeoptimizeFunction(f);
    return 15 + 0 * ++counter;
  },

  set: function(x) {
    // argument should be 37
    if (deopt) %DeoptimizeFunction(f);
    counter -= 36 - x; // increments counter
    throw 42;
  }
})

// Generate type feedback.

assertEquals(15, increaseAndReturn15_calls_noopt());
assertThrowsEquals(function() { return increaseAndThrow42_noopt_inner() }, 42);

assertEquals(15, (new increaseAndStore15Constructor()).x);
assertThrowsEquals(function() {
        return (new increaseAndThrow42Constructor()).x;
    },
    42);

function runThisShard() {

  // Variant flags: [alternativeFn3, tryReturns, doCatch,
  //   catchReturns, deopt]

  f = function f___3___r__cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn3, tryReturns, doCatch,
  //   catchReturns, catchWithLocal]

  f = function f___3___r__crl______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn3, tryReturns, doCatch,
  //   catchReturns, catchWithLocal, deopt]

  f = function f___3___r__crl_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn3, tryReturns, doCatch,
  //   catchReturns, catchWithLocal, endReturnLocal]

  f = function f___3___r__crl____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn3, tryReturns, doCatch,
  //   catchReturns, catchWithLocal, endReturnLocal, deopt]

  f = function f___3___r__crl____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch]

  f = function f___3___r_lc________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, deopt]

  f = function f___3___r_lc_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, endReturnLocal]

  f = function f___3___r_lc______l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, endReturnLocal, deopt]

  f = function f___3___r_lc______ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchThrows]

  f = function f___3___r_lc__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchThrows, deopt]

  f = function f___3___r_lc__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchThrows, endReturnLocal]

  f = function f___3___r_lc__t___l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchThrows, endReturnLocal, deopt]

  f = function f___3___r_lc__t___ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal]

  f = function f___3___r_lc_l______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, deopt]

  f = function f___3___r_lc_l_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, endReturnLocal]

  f = function f___3___r_lc_l____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, endReturnLocal, deopt]

  f = function f___3___r_lc_l____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows]

  f = function f___3___r_lc_lt_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, deopt]

  f = function f___3___r_lc_lt____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, endReturnLocal]

  f = function f___3___r_lc_lt___l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, endReturnLocal, deopt]

  f = function f___3___r_lc_lt___ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns]

  f = function f___3___r_lcr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, deopt]

  f = function f___3___r_lcr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, endReturnLocal]

  f = function f___3___r_lcr_____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, endReturnLocal, deopt]

  f = function f___3___r_lcr_____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal]

  f = function f___3___r_lcrl______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, deopt]

  f = function f___3___r_lcrl_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, endReturnLocal]

  f = function f___3___r_lcrl____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryReturns, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, endReturnLocal, deopt]

  f = function f___3___r_lcrl____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndThrow42);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(912, f);
  assertEquals(4, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch]

  f = function f___3__t___c________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, deopt]

  f = function f___3__t___c_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchThrows]

  f = function f___3__t___c__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchThrows,
  //   deopt]

  f = function f___3__t___c__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal]

  f = function f___3__t___c_l______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, deopt]

  f = function f___3__t___c_l_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, endReturnLocal]

  f = function f___3__t___c_l____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(935, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, endReturnLocal, deopt]

  f = function f___3__t___c_l____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(935, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, catchThrows]

  f = function f___3__t___c_lt_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, catchThrows, deopt]

  f = function f___3__t___c_lt____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, catchThrows, endReturnLocal]

  f = function f___3__t___c_lt___l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch,
  //   catchWithLocal, catchThrows, endReturnLocal, deopt]

  f = function f___3__t___c_lt___ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns]

  f = function f___3__t___cr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns,
  //   deopt]

  f = function f___3__t___cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns,
  //   catchWithLocal]

  f = function f___3__t___crl______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns,
  //   catchWithLocal, deopt]

  f = function f___3__t___crl_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns,
  //   catchWithLocal, endReturnLocal]

  f = function f___3__t___crl____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns,
  //   catchWithLocal, endReturnLocal, deopt]

  f = function f___3__t___crl____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch]

  f = function f___3__t__lc________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, deopt]

  f = function f___3__t__lc_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, endReturnLocal]

  f = function f___3__t__lc______l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(893, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, endReturnLocal, deopt]

  f = function f___3__t__lc______ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(893, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchThrows]

  f = function f___3__t__lc__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchThrows, deopt]

  f = function f___3__t__lc__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchThrows, endReturnLocal]

  f = function f___3__t__lc__t___l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchThrows, endReturnLocal, deopt]

  f = function f___3__t__lc__t___ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal]

  f = function f___3__t__lc_l______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, deopt]

  f = function f___3__t__lc_l_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, endReturnLocal]

  f = function f___3__t__lc_l____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(935, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, endReturnLocal, deopt]

  f = function f___3__t__lc_l____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      local += ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(935, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows]

  f = function f___3__t__lc_lt_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, deopt]

  f = function f___3__t__lc_lt____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, endReturnLocal]

  f = function f___3__t__lc_lt___l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchWithLocal, catchThrows, endReturnLocal, deopt]

  f = function f___3__t__lc_lt___ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns]

  f = function f___3__t__lcr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, deopt]

  f = function f___3__t__lcr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, endReturnLocal]

  f = function f___3__t__lcr_____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, endReturnLocal, deopt]

  f = function f___3__t__lcr_____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal]

  f = function f___3__t__lcrl______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, deopt]

  f = function f___3__t__lcrl_____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, endReturnLocal]

  f = function f___3__t__lcrl____l_ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal,
  //   doCatch, catchReturns, catchWithLocal, endReturnLocal, deopt]

  f = function f___3__t__lcrl____ld () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      local += 4 + invertFunctionCall(increaseAndReturn15);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + local;
      counter++;
    }
    counter++;
    return 5 + local;
  }
  resetOptAndAssertResultEquals(890, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch]

  f = function f__4____r__c________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch, deopt]

  f = function f__4____r__c_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch, catchThrows]

  f = function f__4____r__c__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch, catchThrows,
  //   deopt]

  f = function f__4____r__c__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch,
  //   catchReturns]

  f = function f__4____r__cr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryReturns, doCatch,
  //   catchReturns, deopt]

  f = function f__4____r__cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndStore15Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch]

  f = function f__4___t___c________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch, deopt]

  f = function f__4___t___c_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch, catchThrows]

  f = function f__4___t___c__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch, catchThrows,
  //   deopt]

  f = function f__4___t___c__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch, catchReturns]

  f = function f__4___t___cr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn4, tryThrows, doCatch, catchReturns,
  //   deopt]

  f = function f__4___t___cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (new increaseAndThrow42Constructor()).x;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch]

  f = function f_5_____r__c________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch, deopt]

  f = function f_5_____r__c_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch, catchThrows]

  f = function f_5_____r__c__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch, catchThrows,
  //   deopt]

  f = function f_5_____r__c__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch,
  //   catchReturns]

  f = function f_5_____r__cr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryReturns, doCatch,
  //   catchReturns, deopt]

  f = function f_5_____r__cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + magic.prop /* returns 15 */;
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(19, f);
  assertEquals(2, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch]

  f = function f_5____t___c________ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch, deopt]

  f = function f_5____t___c_______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(undefined, f);
  assertEquals(5, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch, catchThrows]

  f = function f_5____t___c__t_____ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch, catchThrows,
  //   deopt]

  f = function f_5____t___c__t____d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      throw 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertThrowsWith(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch, catchReturns]

  f = function f_5____t___cr_______ () {
    var local = 888;
    deopt = false;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

  // Variant flags: [alternativeFn5, tryThrows, doCatch, catchReturns,
  //   deopt]

  f = function f_5____t___cr______d () {
    var local = 888;
    deopt = true;
    try {
      counter++;
      return 4 + (magic.prop = 37 /* throws 42 */);
      counter++;
    } catch (ex) {
      counter++;
      return 2 + ex;
      counter++;
    }
    counter++;
  }
  resetOptAndAssertResultEquals(44, f);
  assertEquals(3, counter);

}
%NeverOptimizeFunction(runThisShard);

// 95 tests in this shard.
// 192 tests up to here.

runThisShard();
