diff --git a/test/mjsunit/compiler/inline-exception-1.js b/test/mjsunit/compiler/inline-exception-1.js index b67107b6cb..ac259afad7 100644 --- a/test/mjsunit/compiler/inline-exception-1.js +++ b/test/mjsunit/compiler/inline-exception-1.js @@ -66,6 +66,24 @@ function increaseAndThrow42() { 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(); @@ -74,6 +92,17 @@ function returnOrThrow(doReturn) { } } +// 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) { @@ -86,6 +115,7 @@ function invertFunctionCall(f) { throw result + 27; } +// Alternative 4: constructor function increaseAndStore15Constructor() { if (deopt) %DeoptimizeFunction(f); ++counter; @@ -99,6 +129,7 @@ function increaseAndThrow42Constructor() { throw this.x; } +// Alternative 5: property var magic = {}; Object.defineProperty(magic, 'prop', { get: function () { @@ -116,6 +147,9 @@ Object.defineProperty(magic, 'prop', { // 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; @@ -126,12 +160,12 @@ function runThisShard() { // Variant flags: [tryReturns, doFinally] - f = function f______r______f____ () { - var local = 3; + f = function f_______r______f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -140,17 +174,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryReturns, doFinally, finallyThrows] - f = function f______r______f_t__ () { - var local = 3; + f = function f_______r______f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -164,12 +198,12 @@ function runThisShard() { // Variant flags: [tryReturns, doFinally, finallyReturns] - f = function f______r______fr___ () { - var local = 3; + f = function f_______r______fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -178,17 +212,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryReturns, doCatch] - f = function f______r__c________ () { - var local = 3; + f = function f_______r__c________ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -196,17 +230,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, deopt] - f = function f______r__c_______d () { - var local = 3; + f = function f_______r__c_______d () { + var local = 888; deopt = true; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -214,17 +248,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, doFinally] - f = function f______r__c___f____ () { - var local = 3; + f = function f_______r__c___f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -236,17 +270,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryReturns, doCatch, doFinally, finallyThrows] - f = function f______r__c___f_t__ () { - var local = 3; + f = function f_______r__c___f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -263,12 +297,12 @@ function runThisShard() { // Variant flags: [tryReturns, doCatch, doFinally, finallyReturns] - f = function f______r__c___fr___ () { - var local = 3; + f = function f_______r__c___fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -280,17 +314,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryReturns, doCatch, catchThrows] - f = function f______r__c__t_____ () { - var local = 3; + f = function f_______r__c__t_____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -299,17 +333,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, catchThrows, deopt] - f = function f______r__c__t____d () { - var local = 3; + f = function f_______r__c__t____d () { + var local = 888; deopt = true; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -318,17 +352,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, catchThrows, doFinally] - f = function f______r__c__tf____ () { - var local = 3; + f = function f_______r__c__tf____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -341,18 +375,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryReturns, doCatch, catchThrows, doFinally, // finallyThrows] - f = function f______r__c__tf_t__ () { - var local = 3; + f = function f_______r__c__tf_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -371,12 +405,12 @@ function runThisShard() { // Variant flags: [tryReturns, doCatch, catchThrows, doFinally, // finallyReturns] - f = function f______r__c__tfr___ () { - var local = 3; + f = function f_______r__c__tfr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -389,17 +423,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryReturns, doCatch, catchReturns] - f = function f______r__cr_______ () { - var local = 3; + f = function f_______r__cr_______ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -408,17 +442,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, catchReturns, deopt] - f = function f______r__cr______d () { - var local = 3; + f = function f_______r__cr______d () { + var local = 888; deopt = true; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -427,17 +461,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryReturns, doCatch, catchReturns, doFinally] - f = function f______r__cr__f____ () { - var local = 3; + f = function f_______r__cr__f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -450,18 +484,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryReturns, doCatch, catchReturns, doFinally, // finallyThrows] - f = function f______r__cr__f_t__ () { - var local = 3; + f = function f_______r__cr__f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -480,12 +514,12 @@ function runThisShard() { // Variant flags: [tryReturns, doCatch, catchReturns, doFinally, // finallyReturns] - f = function f______r__cr__fr___ () { - var local = 3; + f = function f_______r__cr__fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -498,17 +532,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, doFinally] - f = function f_____t_______f____ () { - var local = 3; + f = function f______t_______f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -522,12 +556,12 @@ function runThisShard() { // Variant flags: [tryThrows, doFinally, finallyThrows] - f = function f_____t_______f_t__ () { - var local = 3; + f = function f______t_______f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -541,12 +575,12 @@ function runThisShard() { // Variant flags: [tryThrows, doFinally, finallyReturns] - f = function f_____t_______fr___ () { - var local = 3; + f = function f______t_______fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -555,17 +589,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, doCatch] - f = function f_____t___c________ () { - var local = 3; + f = function f______t___c________ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -578,12 +612,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, deopt] - f = function f_____t___c_______d () { - var local = 3; + f = function f______t___c_______d () { + var local = 888; deopt = true; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -596,12 +630,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, doFinally] - f = function f_____t___c___f____ () { - var local = 3; + f = function f______t___c___f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -618,12 +652,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, doFinally, finallyThrows] - f = function f_____t___c___f_t__ () { - var local = 3; + f = function f______t___c___f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -640,12 +674,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, doFinally, finallyReturns] - f = function f_____t___c___fr___ () { - var local = 3; + f = function f______t___c___fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -657,17 +691,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(5, counter); // Variant flags: [tryThrows, doCatch, catchThrows] - f = function f_____t___c__t_____ () { - var local = 3; + f = function f______t___c__t_____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -681,12 +715,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchThrows, deopt] - f = function f_____t___c__t____d () { - var local = 3; + f = function f______t___c__t____d () { + var local = 888; deopt = true; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -700,12 +734,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchThrows, doFinally] - f = function f_____t___c__tf____ () { - var local = 3; + f = function f______t___c__tf____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -724,12 +758,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchThrows, doFinally, // finallyThrows] - f = function f_____t___c__tf_t__ () { - var local = 3; + f = function f______t___c__tf_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -748,12 +782,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchThrows, doFinally, // finallyReturns] - f = function f_____t___c__tfr___ () { - var local = 3; + f = function f______t___c__tfr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -766,17 +800,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(4, counter); // Variant flags: [tryThrows, doCatch, catchReturns] - f = function f_____t___cr_______ () { - var local = 3; + f = function f______t___cr_______ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -790,12 +824,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchReturns, deopt] - f = function f_____t___cr______d () { - var local = 3; + f = function f______t___cr______d () { + var local = 888; deopt = true; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -809,12 +843,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchReturns, doFinally] - f = function f_____t___cr__f____ () { - var local = 3; + f = function f______t___cr__f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -833,12 +867,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchReturns, doFinally, // finallyThrows] - f = function f_____t___cr__f_t__ () { - var local = 3; + f = function f______t___cr__f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -857,12 +891,12 @@ function runThisShard() { // Variant flags: [tryThrows, doCatch, catchReturns, doFinally, // finallyReturns] - f = function f_____t___cr__fr___ () { - var local = 3; + f = function f______t___cr__fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -875,18 +909,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, doFinally] - f = function f_____tr______f____ () { - var local = 3; + f = function f______tr______f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -900,13 +934,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doFinally, finallyThrows] - f = function f_____tr______f_t__ () { - var local = 3; + f = function f______tr______f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -920,13 +954,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doFinally, finallyReturns] - f = function f_____tr______fr___ () { - var local = 3; + f = function f______tr______fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } finally { counter++; @@ -935,18 +969,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, tryReturns, doCatch] - f = function f_____tr__c________ () { - var local = 3; + f = function f______tr__c________ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -959,13 +993,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, doFinally] - f = function f_____tr__c___f____ () { - var local = 3; + f = function f______tr__c___f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -983,13 +1017,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, doFinally, // finallyThrows] - f = function f_____tr__c___f_t__ () { - var local = 3; + f = function f______tr__c___f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1007,13 +1041,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, doFinally, // finallyReturns] - f = function f_____tr__c___fr___ () { - var local = 3; + f = function f______tr__c___fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1025,18 +1059,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(5, counter); // Variant flags: [tryThrows, tryReturns, doCatch, catchThrows] - f = function f_____tr__c__t_____ () { - var local = 3; + f = function f______tr__c__t_____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1051,13 +1085,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchThrows, // doFinally] - f = function f_____tr__c__tf____ () { - var local = 3; + f = function f______tr__c__tf____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1076,13 +1110,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchThrows, // doFinally, finallyThrows] - f = function f_____tr__c__tf_t__ () { - var local = 3; + f = function f______tr__c__tf_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1101,13 +1135,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchThrows, // doFinally, finallyReturns] - f = function f_____tr__c__tfr___ () { - var local = 3; + f = function f______tr__c__tfr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1120,18 +1154,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, doCatch, catchReturns] - f = function f_____tr__cr_______ () { - var local = 3; + f = function f______tr__cr_______ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1146,13 +1180,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchReturns, // doFinally] - f = function f_____tr__cr__f____ () { - var local = 3; + f = function f______tr__cr__f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1171,13 +1205,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchReturns, // doFinally, finallyThrows] - f = function f_____tr__cr__f_t__ () { - var local = 3; + f = function f______tr__cr__f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1196,13 +1230,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, doCatch, catchReturns, // doFinally, finallyReturns] - f = function f_____tr__cr__fr___ () { - var local = 3; + f = function f______tr__cr__fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndThrow42(); - return increaseAndReturn15(); + return 4 + increaseAndThrow42(); + return 4 + increaseAndReturn15(); counter++; } catch (ex) { counter++; @@ -1215,19 +1249,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, // doFinally] - f = function f_____trf_____f____ () { - var local = 3; + f = function f______trf_____f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -1236,19 +1270,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, // doFinally, finallyThrows] - f = function f_____trf_____f_t__ () { - var local = 3; + f = function f______trf_____f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -1263,13 +1297,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, tryFirstReturns, // doFinally, finallyReturns] - f = function f_____trf_____fr___ () { - var local = 3; + f = function f______trf_____fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } finally { counter++; @@ -1278,18 +1312,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch] - f = function f_____trf_c________ () { - var local = 3; + f = function f______trf_c________ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1297,19 +1331,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // doFinally] - f = function f_____trf_c___f____ () { - var local = 3; + f = function f______trf_c___f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1321,19 +1355,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // doFinally, finallyThrows] - f = function f_____trf_c___f_t__ () { - var local = 3; + f = function f______trf_c___f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1351,13 +1385,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // doFinally, finallyReturns] - f = function f_____trf_c___fr___ () { - var local = 3; + f = function f______trf_c___fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1369,19 +1403,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchThrows] - f = function f_____trf_c__t_____ () { - var local = 3; + f = function f______trf_c__t_____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1390,19 +1424,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchThrows, doFinally] - f = function f_____trf_c__tf____ () { - var local = 3; + f = function f______trf_c__tf____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1415,19 +1449,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchThrows, doFinally, finallyThrows] - f = function f_____trf_c__tf_t__ () { - var local = 3; + f = function f______trf_c__tf_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1446,13 +1480,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchThrows, doFinally, finallyReturns] - f = function f_____trf_c__tfr___ () { - var local = 3; + f = function f______trf_c__tfr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1465,19 +1499,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchReturns] - f = function f_____trf_cr_______ () { - var local = 3; + f = function f______trf_cr_______ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1486,19 +1520,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchReturns, doFinally] - f = function f_____trf_cr__f____ () { - var local = 3; + f = function f______trf_cr__f____ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1511,19 +1545,19 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(4, counter); // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchReturns, doFinally, finallyThrows] - f = function f_____trf_cr__f_t__ () { - var local = 3; + f = function f______trf_cr__f_t__ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1542,13 +1576,13 @@ function runThisShard() { // Variant flags: [tryThrows, tryReturns, tryFirstReturns, doCatch, // catchReturns, doFinally, finallyReturns] - f = function f_____trf_cr__fr___ () { - var local = 3; + f = function f______trf_cr__fr___ () { + var local = 888; deopt = false; try { counter++; - return increaseAndReturn15(); - return increaseAndThrow42(); + return 4 + increaseAndReturn15(); + return 4 + increaseAndThrow42(); counter++; } catch (ex) { counter++; @@ -1561,17 +1595,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(6, f); + resetOptAndAssertResultEquals(891, f); assertEquals(3, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch] - f = function f____1_r__c________ () { - var local = 3; + f = function f_____1_r__c________ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1579,17 +1613,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch, deopt] - f = function f____1_r__c_______d () { - var local = 3; + f = function f_____1_r__c_______d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1597,17 +1631,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows] - f = function f____1_r__c__t_____ () { - var local = 3; + f = function f_____1_r__c__t_____ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1616,18 +1650,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch, catchThrows, // deopt] - f = function f____1_r__c__t____d () { - var local = 3; + f = function f_____1_r__c__t____d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1636,18 +1670,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch, // catchReturns] - f = function f____1_r__cr_______ () { - var local = 3; + f = function f_____1_r__cr_______ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1656,18 +1690,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryReturns, doCatch, // catchReturns, deopt] - f = function f____1_r__cr______d () { - var local = 3; + f = function f_____1_r__cr______d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(true); + return 4 + returnOrThrow(true); counter++; } catch (ex) { counter++; @@ -1676,17 +1710,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn1, tryThrows, doCatch] - f = function f____1t___c________ () { - var local = 3; + f = function f_____1t___c________ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1699,12 +1733,12 @@ function runThisShard() { // Variant flags: [alternativeFn1, tryThrows, doCatch, deopt] - f = function f____1t___c_______d () { - var local = 3; + f = function f_____1t___c_______d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1717,12 +1751,12 @@ function runThisShard() { // Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows] - f = function f____1t___c__t_____ () { - var local = 3; + f = function f_____1t___c__t_____ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1737,12 +1771,12 @@ function runThisShard() { // Variant flags: [alternativeFn1, tryThrows, doCatch, catchThrows, // deopt] - f = function f____1t___c__t____d () { - var local = 3; + f = function f_____1t___c__t____d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1756,12 +1790,12 @@ function runThisShard() { // Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns] - f = function f____1t___cr_______ () { - var local = 3; + f = function f_____1t___cr_______ () { + var local = 888; deopt = false; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1776,12 +1810,12 @@ function runThisShard() { // Variant flags: [alternativeFn1, tryThrows, doCatch, catchReturns, // deopt] - f = function f____1t___cr______d () { - var local = 3; + f = function f_____1t___cr______d () { + var local = 888; deopt = true; try { counter++; - return returnOrThrow(false); + return 4 + returnOrThrow(false); counter++; } catch (ex) { counter++; @@ -1793,151 +1827,15 @@ function runThisShard() { resetOptAndAssertResultEquals(44, f); assertEquals(3, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch] - - f = function f___2__r__c________ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, deopt] - - f = function f___2__r__c_______d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows] - - f = function f___2__r__c__t_____ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, catchThrows, - // deopt] - - f = function f___2__r__c__t____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchWithLocal] - - f = function f___2__r__c_l______ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchWithLocal, deopt] - - f = function f___2__r__c_l_____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchWithLocal, endReturnLocal] - - f = function f___2__r__c_l____l_ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, // catchWithLocal, endReturnLocal, deopt] - f = function f___2__r__c_l____ld () { - var local = 3; + f = function f____2__r__c_l____ld () { + var local = 888; deopt = true; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + increaseAndReturn15_calls_noopt(); counter++; } catch (ex) { counter++; @@ -1947,18 +1845,278 @@ function runThisShard() { counter++; return 5 + local; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, + // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, + // doCatch, endReturnLocal, deopt] + + f = function f____2__r_lc______ld () { + var local = 888; + deopt = true; + try { + counter++; + local += 4 + increaseAndReturn15_calls_noopt(); + counter++; + } catch (ex) { + counter++; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(912, f); + assertEquals(4, counter); + + // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, + // doCatch, catchWithLocal, endReturnLocal, deopt] + + f = function f____2__r_lc_l____ld () { + var local = 888; + deopt = true; + try { + counter++; + local += 4 + increaseAndReturn15_calls_noopt(); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(912, f); + assertEquals(4, counter); + + // Variant flags: [alternativeFn2, tryThrows, doCatch, + // catchWithLocal, endReturnLocal, deopt] + + f = function f____2_t___c_l____ld () { + var local = 888; + deopt = true; + try { + counter++; + return 4 + increaseAndThrow42_calls_noopt(); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(935, f); + assertEquals(5, counter); + + // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, + // doCatch, endReturnLocal, deopt] + + f = function f____2_t__lc______ld () { + var local = 888; + deopt = true; + try { + counter++; + local += 4 + increaseAndThrow42_calls_noopt(); + counter++; + } catch (ex) { + counter++; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(893, f); + assertEquals(5, counter); + + // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, + // doCatch, catchWithLocal, endReturnLocal, deopt] + + f = function f____2_t__lc_l____ld () { + var local = 888; + deopt = true; + try { + counter++; + local += 4 + increaseAndThrow42_calls_noopt(); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(935, f); + assertEquals(5, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch] + + f = function f___3___r__c________ () { + var local = 888; + deopt = false; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, deopt] + + f = function f___3___r__c_______d () { + var local = 888; + deopt = true; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, catchThrows] + + f = function f___3___r__c__t_____ () { + var local = 888; + deopt = false; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + throw 2 + ex; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, catchThrows, + // deopt] + + f = function f___3___r__c__t____d () { + var local = 888; + deopt = true; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + throw 2 + ex; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, + // catchWithLocal] + + f = function f___3___r__c_l______ () { + var local = 888; + deopt = false; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, + // catchWithLocal, deopt] + + f = function f___3___r__c_l_____d () { + var local = 888; + deopt = true; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, + // catchWithLocal, endReturnLocal] + + f = function f___3___r__c_l____l_ () { + var local = 888; + deopt = false; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, + // catchWithLocal, endReturnLocal, deopt] + + f = function f___3___r__c_l____ld () { + var local = 888; + deopt = true; + try { + counter++; + return 4 + invertFunctionCall(increaseAndThrow42); + counter++; + } catch (ex) { + counter++; + local += ex; + counter++; + } + counter++; + return 5 + local; + } + resetOptAndAssertResultEquals(19, f); + assertEquals(2, counter); + + // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchWithLocal, catchThrows] - f = function f___2__r__c_lt_____ () { - var local = 3; + f = function f___3___r__c_lt_____ () { + var local = 888; deopt = false; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -1967,18 +2125,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, + // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchWithLocal, catchThrows, deopt] - f = function f___2__r__c_lt____d () { - var local = 3; + f = function f___3___r__c_lt____d () { + var local = 888; deopt = true; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -1987,18 +2145,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, + // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchWithLocal, catchThrows, endReturnLocal] - f = function f___2__r__c_lt___l_ () { - var local = 3; + f = function f___3___r__c_lt___l_ () { + var local = 888; deopt = false; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -2008,18 +2166,18 @@ function runThisShard() { counter++; return 5 + local; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, + // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchWithLocal, catchThrows, endReturnLocal, deopt] - f = function f___2__r__c_lt___ld () { - var local = 3; + f = function f___3___r__c_lt___ld () { + var local = 888; deopt = true; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -2029,18 +2187,18 @@ function runThisShard() { counter++; return 5 + local; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn2, tryReturns, doCatch, + // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchReturns] - f = function f___2__r__cr_______ () { - var local = 3; + f = function f___3___r__cr_______ () { + var local = 888; deopt = false; try { counter++; - return invertFunctionCall(increaseAndThrow42); + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -2049,73 +2207,13 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchReturns, deopt] - - f = function f___2__r__cr______d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchReturns, catchWithLocal] - - f = function f___2__r__crl______ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchReturns, catchWithLocal, deopt] - - f = function f___2__r__crl_____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); } %NeverOptimizeFunction(runThisShard); -// 94 tests in this shard. -// 94 tests up to here. +// 97 tests in this shard. +// 97 tests up to here. runThisShard(); diff --git a/test/mjsunit/compiler/inline-exception-2.js b/test/mjsunit/compiler/inline-exception-2.js index 7c40ab9290..89523cc6b2 100644 --- a/test/mjsunit/compiler/inline-exception-2.js +++ b/test/mjsunit/compiler/inline-exception-2.js @@ -66,6 +66,24 @@ function increaseAndThrow42() { 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(); @@ -74,6 +92,17 @@ function returnOrThrow(doReturn) { } } +// 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) { @@ -86,6 +115,7 @@ function invertFunctionCall(f) { throw result + 27; } +// Alternative 4: constructor function increaseAndStore15Constructor() { if (deopt) %DeoptimizeFunction(f); ++counter; @@ -99,6 +129,7 @@ function increaseAndThrow42Constructor() { throw this.x; } +// Alternative 5: property var magic = {}; Object.defineProperty(magic, 'prop', { get: function () { @@ -116,6 +147,9 @@ Object.defineProperty(magic, 'prop', { // 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; @@ -124,1488 +158,15 @@ assertThrowsEquals(function() { function runThisShard() { - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchReturns, catchWithLocal, endReturnLocal] - - f = function f___2__r__crl____l_ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, doCatch, - // catchReturns, catchWithLocal, endReturnLocal, deopt] - - f = function f___2__r__crl____ld () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch] - - f = function f___2__r_lc________ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, deopt] - - f = function f___2__r_lc_______d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, endReturnLocal] - - f = function f___2__r_lc______l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, endReturnLocal, deopt] - - f = function f___2__r_lc______ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchThrows] - - f = function f___2__r_lc__t_____ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchThrows, deopt] - - f = function f___2__r_lc__t____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchThrows, endReturnLocal] - - f = function f___2__r_lc__t___l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchThrows, endReturnLocal, deopt] - - f = function f___2__r_lc__t___ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal] - - f = function f___2__r_lc_l______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, deopt] - - f = function f___2__r_lc_l_____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, endReturnLocal] - - f = function f___2__r_lc_l____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, endReturnLocal, deopt] - - f = function f___2__r_lc_l____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows] - - f = function f___2__r_lc_lt_____ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, deopt] - - f = function f___2__r_lc_lt____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, endReturnLocal] - - f = function f___2__r_lc_lt___l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, endReturnLocal, deopt] - - f = function f___2__r_lc_lt___ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns] - - f = function f___2__r_lcr_______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, deopt] - - f = function f___2__r_lcr______d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, endReturnLocal] - - f = function f___2__r_lcr_____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, endReturnLocal, deopt] - - f = function f___2__r_lcr_____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal] - - f = function f___2__r_lcrl______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, deopt] - - f = function f___2__r_lcrl_____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, endReturnLocal] - - f = function f___2__r_lcrl____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryReturns, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, endReturnLocal, deopt] - - f = function f___2__r_lcrl____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndThrow42); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(23, f); - assertEquals(4, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch] - - f = function f___2_t___c________ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, deopt] - - f = function f___2_t___c_______d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows] - - f = function f___2_t___c__t_____ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchThrows, - // deopt] - - f = function f___2_t___c__t____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal] - - f = function f___2_t___c_l______ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, deopt] - - f = function f___2_t___c_l_____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, endReturnLocal] - - f = function f___2_t___c_l____l_ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(50, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, endReturnLocal, deopt] - - f = function f___2_t___c_l____ld () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(50, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, catchThrows] - - f = function f___2_t___c_lt_____ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, catchThrows, deopt] - - f = function f___2_t___c_lt____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, catchThrows, endReturnLocal] - - f = function f___2_t___c_lt___l_ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, - // catchWithLocal, catchThrows, endReturnLocal, deopt] - - f = function f___2_t___c_lt___ld () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns] - - f = function f___2_t___cr_______ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns, - // deopt] - - f = function f___2_t___cr______d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns, - // catchWithLocal] - - f = function f___2_t___crl______ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns, - // catchWithLocal, deopt] - - f = function f___2_t___crl_____d () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns, - // catchWithLocal, endReturnLocal] - - f = function f___2_t___crl____l_ () { - var local = 3; - deopt = false; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, doCatch, catchReturns, - // catchWithLocal, endReturnLocal, deopt] - - f = function f___2_t___crl____ld () { - var local = 3; - deopt = true; - try { - counter++; - return invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch] - - f = function f___2_t__lc________ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, deopt] - - f = function f___2_t__lc_______d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, endReturnLocal] - - f = function f___2_t__lc______l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(8, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, endReturnLocal, deopt] - - f = function f___2_t__lc______ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(8, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchThrows] - - f = function f___2_t__lc__t_____ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchThrows, deopt] - - f = function f___2_t__lc__t____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchThrows, endReturnLocal] - - f = function f___2_t__lc__t___l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchThrows, endReturnLocal, deopt] - - f = function f___2_t__lc__t___ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal] - - f = function f___2_t__lc_l______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, deopt] - - f = function f___2_t__lc_l_____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(undefined, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, endReturnLocal] - - f = function f___2_t__lc_l____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(50, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, endReturnLocal, deopt] - - f = function f___2_t__lc_l____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - local += ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(50, f); - assertEquals(5, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows] - - f = function f___2_t__lc_lt_____ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, deopt] - - f = function f___2_t__lc_lt____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, endReturnLocal] - - f = function f___2_t__lc_lt___l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchWithLocal, catchThrows, endReturnLocal, deopt] - - f = function f___2_t__lc_lt___ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertThrowsWith(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns] - - f = function f___2_t__lcr_______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, deopt] - - f = function f___2_t__lcr______d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, endReturnLocal] - - f = function f___2_t__lcr_____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, endReturnLocal, deopt] - - f = function f___2_t__lcr_____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(44, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal] - - f = function f___2_t__lcrl______ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, deopt] - - f = function f___2_t__lcrl_____d () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, endReturnLocal] - - f = function f___2_t__lcrl____l_ () { - var local = 3; - deopt = false; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn2, tryThrows, tryResultToLocal, - // doCatch, catchReturns, catchWithLocal, endReturnLocal, deopt] - - f = function f___2_t__lcrl____ld () { - var local = 3; - deopt = true; - try { - counter++; - local += invertFunctionCall(increaseAndReturn15); - counter++; - } catch (ex) { - counter++; - return 2 + local; - counter++; - } - counter++; - return 5 + local; - } - resetOptAndAssertResultEquals(5, f); - assertEquals(3, counter); - - // Variant flags: [alternativeFn3, tryReturns, doCatch] - - f = function f__3___r__c________ () { - var local = 3; - deopt = false; - try { - counter++; - return (new increaseAndStore15Constructor()).x; - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn3, tryReturns, doCatch, deopt] - - f = function f__3___r__c_______d () { - var local = 3; - deopt = true; - try { - counter++; - return (new increaseAndStore15Constructor()).x; - counter++; - } catch (ex) { - counter++; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn3, tryReturns, doCatch, catchThrows] - - f = function f__3___r__c__t_____ () { - var local = 3; - deopt = false; - try { - counter++; - return (new increaseAndStore15Constructor()).x; - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn3, tryReturns, doCatch, catchThrows, - // deopt] - - f = function f__3___r__c__t____d () { - var local = 3; - deopt = true; - try { - counter++; - return (new increaseAndStore15Constructor()).x; - counter++; - } catch (ex) { - counter++; - throw 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - - // Variant flags: [alternativeFn3, tryReturns, doCatch, - // catchReturns] - - f = function f__3___r__cr_______ () { - var local = 3; - deopt = false; - try { - counter++; - return (new increaseAndStore15Constructor()).x; - counter++; - } catch (ex) { - counter++; - return 2 + ex; - counter++; - } - counter++; - } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); - // Variant flags: [alternativeFn3, tryReturns, doCatch, // catchReturns, deopt] - f = function f__3___r__cr______d () { - var local = 3; + f = function f___3___r__cr______d () { + var local = 888; deopt = true; try { counter++; - return (new increaseAndStore15Constructor()).x; + return 4 + invertFunctionCall(increaseAndThrow42); counter++; } catch (ex) { counter++; @@ -1614,17 +175,587 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); - // Variant flags: [alternativeFn3, tryThrows, doCatch] + // Variant flags: [alternativeFn3, tryReturns, doCatch, + // catchReturns, catchWithLocal] - f = function f__3__t___c________ () { - var local = 3; + f = function f___3___r__crl______ () { + var local = 888; deopt = false; try { counter++; - return (new increaseAndThrow42Constructor()).x; + 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++; @@ -1637,12 +768,12 @@ function runThisShard() { // Variant flags: [alternativeFn3, tryThrows, doCatch, deopt] - f = function f__3__t___c_______d () { - var local = 3; + f = function f___3__t___c_______d () { + var local = 888; deopt = true; try { counter++; - return (new increaseAndThrow42Constructor()).x; + return 4 + invertFunctionCall(increaseAndReturn15); counter++; } catch (ex) { counter++; @@ -1655,12 +786,12 @@ function runThisShard() { // Variant flags: [alternativeFn3, tryThrows, doCatch, catchThrows] - f = function f__3__t___c__t_____ () { - var local = 3; + f = function f___3__t___c__t_____ () { + var local = 888; deopt = false; try { counter++; - return (new increaseAndThrow42Constructor()).x; + return 4 + invertFunctionCall(increaseAndReturn15); counter++; } catch (ex) { counter++; @@ -1675,12 +806,12 @@ function runThisShard() { // Variant flags: [alternativeFn3, tryThrows, doCatch, catchThrows, // deopt] - f = function f__3__t___c__t____d () { - var local = 3; + f = function f___3__t___c__t____d () { + var local = 888; deopt = true; try { counter++; - return (new increaseAndThrow42Constructor()).x; + return 4 + invertFunctionCall(increaseAndReturn15); counter++; } catch (ex) { counter++; @@ -1692,14 +823,178 @@ function runThisShard() { resetOptAndAssertThrowsWith(44, f); assertEquals(3, counter); - // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns] + // Variant flags: [alternativeFn3, tryThrows, doCatch, + // catchWithLocal] - f = function f__3__t___cr_______ () { - var local = 3; + f = function f___3__t___c_l______ () { + var local = 888; deopt = false; try { counter++; - return (new increaseAndThrow42Constructor()).x; + 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++; @@ -1714,12 +1009,12 @@ function runThisShard() { // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns, // deopt] - f = function f__3__t___cr______d () { - var local = 3; + f = function f___3__t___cr______d () { + var local = 888; deopt = true; try { counter++; - return (new increaseAndThrow42Constructor()).x; + return 4 + invertFunctionCall(increaseAndReturn15); counter++; } catch (ex) { counter++; @@ -1731,32 +1026,97 @@ function runThisShard() { resetOptAndAssertResultEquals(44, f); assertEquals(3, counter); - // Variant flags: [alternativeFn4, tryReturns, doCatch] + // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns, + // catchWithLocal] - f = function f_4____r__c________ () { - var local = 3; + f = function f___3__t___crl______ () { + var local = 888; deopt = false; try { counter++; - return magic.prop /* returns 15 */; + return 4 + invertFunctionCall(increaseAndReturn15); counter++; } catch (ex) { counter++; + return 2 + local; counter++; } counter++; } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); + resetOptAndAssertResultEquals(890, f); + assertEquals(3, counter); - // Variant flags: [alternativeFn4, tryReturns, doCatch, deopt] + // Variant flags: [alternativeFn3, tryThrows, doCatch, catchReturns, + // catchWithLocal, deopt] - f = function f_4____r__c_______d () { - var local = 3; + f = function f___3__t___crl_____d () { + var local = 888; deopt = true; try { counter++; - return magic.prop /* returns 15 */; + 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++; @@ -1764,17 +1124,77 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); - assertEquals(2, counter); + resetOptAndAssertResultEquals(undefined, f); + assertEquals(5, counter); - // Variant flags: [alternativeFn4, tryReturns, doCatch, catchThrows] + // Variant flags: [alternativeFn3, tryThrows, tryResultToLocal, + // doCatch, deopt] - f = function f_4____r__c__t_____ () { - var local = 3; + 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++; - return magic.prop /* returns 15 */; + 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++; @@ -1783,18 +1203,463 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + 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 = 3; + f = function f__4____r__c__t____d () { + var local = 888; deopt = true; try { counter++; - return magic.prop /* returns 15 */; + return 4 + (new increaseAndStore15Constructor()).x; counter++; } catch (ex) { counter++; @@ -1803,18 +1668,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn4, tryReturns, doCatch, // catchReturns] - f = function f_4____r__cr_______ () { - var local = 3; + f = function f__4____r__cr_______ () { + var local = 888; deopt = false; try { counter++; - return magic.prop /* returns 15 */; + return 4 + (new increaseAndStore15Constructor()).x; counter++; } catch (ex) { counter++; @@ -1823,18 +1688,18 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn4, tryReturns, doCatch, // catchReturns, deopt] - f = function f_4____r__cr______d () { - var local = 3; + f = function f__4____r__cr______d () { + var local = 888; deopt = true; try { counter++; - return magic.prop /* returns 15 */; + return 4 + (new increaseAndStore15Constructor()).x; counter++; } catch (ex) { counter++; @@ -1843,17 +1708,17 @@ function runThisShard() { } counter++; } - resetOptAndAssertResultEquals(15, f); + resetOptAndAssertResultEquals(19, f); assertEquals(2, counter); // Variant flags: [alternativeFn4, tryThrows, doCatch] - f = function f_4___t___c________ () { - var local = 3; + f = function f__4___t___c________ () { + var local = 888; deopt = false; try { counter++; - return (magic.prop = 37 /* throws 42 */); + return 4 + (new increaseAndThrow42Constructor()).x; counter++; } catch (ex) { counter++; @@ -1866,12 +1731,12 @@ function runThisShard() { // Variant flags: [alternativeFn4, tryThrows, doCatch, deopt] - f = function f_4___t___c_______d () { - var local = 3; + f = function f__4___t___c_______d () { + var local = 888; deopt = true; try { counter++; - return (magic.prop = 37 /* throws 42 */); + return 4 + (new increaseAndThrow42Constructor()).x; counter++; } catch (ex) { counter++; @@ -1884,12 +1749,12 @@ function runThisShard() { // Variant flags: [alternativeFn4, tryThrows, doCatch, catchThrows] - f = function f_4___t___c__t_____ () { - var local = 3; + f = function f__4___t___c__t_____ () { + var local = 888; deopt = false; try { counter++; - return (magic.prop = 37 /* throws 42 */); + return 4 + (new increaseAndThrow42Constructor()).x; counter++; } catch (ex) { counter++; @@ -1904,12 +1769,12 @@ function runThisShard() { // Variant flags: [alternativeFn4, tryThrows, doCatch, catchThrows, // deopt] - f = function f_4___t___c__t____d () { - var local = 3; + f = function f__4___t___c__t____d () { + var local = 888; deopt = true; try { counter++; - return (magic.prop = 37 /* throws 42 */); + return 4 + (new increaseAndThrow42Constructor()).x; counter++; } catch (ex) { counter++; @@ -1923,12 +1788,12 @@ function runThisShard() { // Variant flags: [alternativeFn4, tryThrows, doCatch, catchReturns] - f = function f_4___t___cr_______ () { - var local = 3; + f = function f__4___t___cr_______ () { + var local = 888; deopt = false; try { counter++; - return (magic.prop = 37 /* throws 42 */); + return 4 + (new increaseAndThrow42Constructor()).x; counter++; } catch (ex) { counter++; @@ -1943,12 +1808,241 @@ function runThisShard() { // Variant flags: [alternativeFn4, tryThrows, doCatch, catchReturns, // deopt] - f = function f_4___t___cr______d () { - var local = 3; + f = function f__4___t___cr______d () { + var local = 888; deopt = true; try { counter++; - return (magic.prop = 37 /* throws 42 */); + 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++; @@ -1963,7 +2057,7 @@ function runThisShard() { } %NeverOptimizeFunction(runThisShard); -// 92 tests in this shard. -// 186 tests up to here. +// 95 tests in this shard. +// 192 tests up to here. runThisShard(); diff --git a/tools/gen-inlining-tests.py b/tools/gen-inlining-tests.py index 179b4ad325..1a377e61ed 100644 --- a/tools/gen-inlining-tests.py +++ b/tools/gen-inlining-tests.py @@ -11,7 +11,7 @@ import sys SHARD_FILENAME_TEMPLATE = "test/mjsunit/compiler/inline-exception-{shard}.js" # Generates 2 files. Found by trial and error. -SHARD_SIZE = 94 +SHARD_SIZE = 97 PREAMBLE = """ @@ -81,6 +81,24 @@ function increaseAndThrow42() { 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(); @@ -89,6 +107,17 @@ function returnOrThrow(doReturn) { } } +// 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) { @@ -101,6 +130,7 @@ function invertFunctionCall(f) { throw result + 27; } +// Alternative 4: constructor function increaseAndStore15Constructor() { if (deopt) %DeoptimizeFunction(f); ++counter; @@ -114,6 +144,7 @@ function increaseAndThrow42Constructor() { throw this.x; } +// Alternative 5: property var magic = {}; Object.defineProperty(magic, 'prop', { get: function () { @@ -131,6 +162,9 @@ Object.defineProperty(magic, 'prop', { // 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; @@ -153,8 +187,6 @@ def booltuples(n): yield initial + (False,) yield initial + (True,) -FLAGLETTERS="4321trflcrltfrtld" - def fnname(flags): assert len(FLAGLETTERS) == len(flags) @@ -175,10 +207,17 @@ def printtest(flags): # tuples, ordered lexicographically from false to true, we get first the # default, then alternative 1, then 2, etc. ( - alternativeFn4, # use alternative #4 for returning/throwing. - alternativeFn3, # use alternative #3 for returning/throwing. - alternativeFn2, # use alternative #2 for returning/throwing. - alternativeFn1, # use alternative #1 for returning/throwing. + alternativeFn5, # use alternative #5 for returning/throwing: + # return/throw using property + alternativeFn4, # use alternative #4 for returning/throwing: + # return/throw using constructor + alternativeFn3, # use alternative #3 for returning/throwing: + # return/throw indirectly, based on function argument + alternativeFn2, # use alternative #2 for returning/throwing: + # return/throw indirectly in unoptimized code, + # no branching + alternativeFn1, # use alternative #1 for returning/throwing: + # return/throw indirectly, based on boolean arg tryThrows, # in try block, call throwing function tryReturns, # in try block, call returning function tryFirstReturns, # in try block, returning goes before throwing @@ -197,7 +236,8 @@ def printtest(flags): # BASIC RULES # Only one alternative can be applied at any time. - if alternativeFn1 + alternativeFn2 + alternativeFn3 + alternativeFn4 > 1: + if (alternativeFn1 + alternativeFn2 + alternativeFn3 + alternativeFn4 + + alternativeFn5 > 1): return # In try, return or throw, or both. @@ -228,8 +268,9 @@ def printtest(flags): # PRUNING anyAlternative = any([alternativeFn1, alternativeFn2, alternativeFn3, - alternativeFn4]) - rareAlternative = any([alternativeFn1, alternativeFn3, alternativeFn4]) + alternativeFn4, alternativeFn5]) + specificAlternative = any([alternativeFn2, alternativeFn3]) + rareAlternative = not specificAlternative # If try returns and throws, then don't catchWithLocal, endReturnLocal, or # deopt, or do any alternative. @@ -238,13 +279,18 @@ def printtest(flags): return # We don't do any alternative if we do a finally. if doFinally and anyAlternative: return - # We only use the local variable if we do alternative #2. + # We only use the local variable if we do alternative #2 or #3. if ((tryResultToLocal or catchWithLocal or endReturnLocal) and - not alternativeFn2): + not specificAlternative): return # We don't need to test deopting into a finally. if doFinally and deopt: return + # We're only interested in alternative #2 if we have endReturnLocal, no + # catchReturns, and no catchThrows, and deopt. + if (alternativeFn2 and + (not endReturnLocal or catchReturns or catchThrows or not deopt)): + return # Flag check succeeded. @@ -265,17 +311,22 @@ def printtest(flags): 'increaseAndThrow42': 'returnOrThrow(false)', } elif alternativeFn2: + fragments = { + 'increaseAndReturn15': 'increaseAndReturn15_calls_noopt()', + 'increaseAndThrow42': 'increaseAndThrow42_calls_noopt()', + } + elif alternativeFn3: fragments = { 'increaseAndReturn15': 'invertFunctionCall(increaseAndThrow42)', 'increaseAndThrow42': 'invertFunctionCall(increaseAndReturn15)', } - elif alternativeFn3: + elif alternativeFn4: fragments = { 'increaseAndReturn15': '(new increaseAndStore15Constructor()).x', 'increaseAndThrow42': '(new increaseAndThrow42Constructor()).x', } else: - assert alternativeFn4 + assert alternativeFn5 fragments = { 'increaseAndReturn15': 'magic.prop /* returns 15 */', 'increaseAndThrow42': '(magic.prop = 37 /* throws 42 */)', @@ -294,34 +345,34 @@ def printtest(flags): counter = 0 write( " f = function {} () {{".format(fnname(flags))) - write( " var local = 3;") + write( " var local = 888;") write( " deopt = {};".format("true" if deopt else "false")) - local = 3 + local = 888 write( " try {") write( " counter++;") counter += 1 resultTo = "local +=" if tryResultToLocal else "return" if tryReturns and not (tryThrows and not tryFirstReturns): - write( " {} {increaseAndReturn15};".format(resultTo, **fragments)) + write( " {} 4 + {increaseAndReturn15};".format(resultTo, **fragments)) if result == None: counter += 1 if tryResultToLocal: - local += 15 + local += 19 else: - result = ("return", 15) + result = ("return", 19) if tryThrows: - write( " {} {increaseAndThrow42};".format(resultTo, **fragments)) + write( " {} 4 + {increaseAndThrow42};".format(resultTo, **fragments)) if result == None: counter += 1 result = ("throw", 42) if tryReturns and tryThrows and not tryFirstReturns: - write( " {} {increaseAndReturn15};".format(resultTo, **fragments)) + write( " {} 4 + {increaseAndReturn15};".format(resultTo, **fragments)) if result == None: counter += 1 if tryResultToLocal: - local += 15 + local += 19 else: - result = ("return", 15) + result = ("return", 19) write( " counter++;") if result == None: counter += 1 @@ -447,8 +498,10 @@ def write_shard_footer(): write("") write("runThisShard();") +FLAGLETTERS="54321trflcrltfrtld" flagtuple = namedtuple('flagtuple', ( + "alternativeFn5", "alternativeFn4", "alternativeFn3", "alternativeFn2", @@ -508,3 +561,6 @@ if __name__ == '__main__': rotateshard() finishshard() + + if MODE == 'shard': + print("Total: {} tests.".format(NUM_TESTS_PRINTED))