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