| // Copyright 2018 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // Flags: --allow-natives-syntax --expose-gc --turbo-inline-array-builtins | 
 | // Flags: --opt --no-always-opt | 
 |  | 
 | // Unknown field access leads to eager-deopt unrelated to reduceright, should | 
 | // still lead to correct result. | 
 | (() => { | 
 |   const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; | 
 |   // For this particular eager deopt point to work, we need to dodge | 
 |   // TurboFan's soft-deopts through a non-inlined and non-optimized function | 
 |   // call to foo(). | 
 |   function foo(o, deopt) { | 
 |     if (deopt) { | 
 |       o.abc = 3; | 
 |     } | 
 |   } | 
 |   %NeverOptimizeFunction(foo); | 
 |   function eagerDeoptInCalled(deopt) { | 
 |     return a.reduceRight((r, v, i, o) => { | 
 |       if (i === 7) { | 
 |         foo(a, deopt); | 
 |       } | 
 |       return r + "S"; | 
 |     }, "H"); | 
 |   }; | 
 |   %PrepareFunctionForOptimization(eagerDeoptInCalled); | 
 |   eagerDeoptInCalled(); | 
 |   eagerDeoptInCalled(); | 
 |   %OptimizeFunctionOnNextCall(eagerDeoptInCalled); | 
 |   eagerDeoptInCalled(); | 
 |   assertEquals("HSSSSSSSSSS", eagerDeoptInCalled(true)); | 
 | })(); | 
 |  | 
 | // Make sure we gracefully handle the case of an empty array in | 
 | // optimized code. | 
 | (function() { | 
 | var nothingThere = function(only_holes) { | 
 |   var a = [1, 2, , 3];  // holey smi array. | 
 |   if (only_holes) { | 
 |     a = [ | 
 |       , | 
 |       , | 
 |       , | 
 |     ];  // also a holey smi array. | 
 |   } | 
 |   return a.reduceRight((r, v, i, o) => r + v); | 
 | }; | 
 | ; | 
 | %PrepareFunctionForOptimization(nothingThere); | 
 | nothingThere(); | 
 | nothingThere(); | 
 | %OptimizeFunctionOnNextCall(nothingThere); | 
 | assertThrows(() => nothingThere(true)); | 
 | })(); | 
 |  | 
 | // An error generated inside the callback includes reduce in it's | 
 | // stack trace. | 
 | (function() { | 
 | var re = /Array\.reduceRight/; | 
 | var alwaysThrows = function() { | 
 |   var b = [ | 
 |     , | 
 |     , | 
 |     , | 
 |   ]; | 
 |   var result = 0; | 
 |   var callback = function(r, v, i, o) { | 
 |     return r + v; | 
 |   }; | 
 |   b.reduceRight(callback); | 
 | }; | 
 | ; | 
 | %PrepareFunctionForOptimization(alwaysThrows); | 
 | try { | 
 |   alwaysThrows(); | 
 | } catch (e) { | 
 |   assertTrue(re.exec(e.stack) !== null); | 
 | } | 
 | try { | 
 |   alwaysThrows(); | 
 | } catch (e) { | 
 | } | 
 | try { | 
 |   alwaysThrows(); | 
 | } catch (e) { | 
 | } | 
 | %OptimizeFunctionOnNextCall(alwaysThrows); | 
 | try { | 
 |   alwaysThrows(); | 
 | } catch (e) { | 
 |   assertTrue(re.exec(e.stack) !== null); | 
 | } | 
 | })(); |