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