// 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) {
  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) {
  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();
