| // Copyright 2016 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 |
| |
| function c4(w, h) { |
| var size = w * h; |
| if (size < 0) size = 0; |
| return new Uint32Array(size); |
| } |
| |
| for (var i = 0; i < 3; i++) { |
| // Computing -0 as the result makes the "size = w * h" multiplication IC |
| // go into double mode. |
| c4(0, -1); |
| } |
| // Optimize Uint32ConstructFromLength. |
| for (var i = 0; i < 1000; i++) c4(2, 2); |
| |
| // This array will have a HeapNumber as its length: |
| var bomb = c4(2, 2); |
| |
| function reader(o, i) { |
| // Dummy try-catch, so that TurboFan is used to optimize this. |
| try { |
| } catch (e) { |
| } |
| return o[i]; |
| } |
| // Optimize reader! |
| ; |
| %PrepareFunctionForOptimization(reader); |
| for (var i = 0; i < 3; i++) reader(bomb, 0); |
| %OptimizeFunctionOnNextCall(reader); |
| reader(bomb, 0); |
| |
| for (var i = bomb.length; i < 100; i++) { |
| assertEquals(undefined, reader(bomb, i)); |
| } |