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