| // 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. |
| |
| // Tests that creating an iterator that shrinks the array populated by |
| // Array.from does not lead to out of bounds writes. |
| let oobArray = []; |
| let maxSize = 1028 * 8; |
| Array.from.call(function() { return oobArray }, {[Symbol.iterator] : _ => ( |
| { |
| counter : 0, |
| next() { |
| let result = this.counter++; |
| if (this.counter > maxSize) { |
| oobArray.length = 0; |
| return {done: true}; |
| } else { |
| return {value: result, done: false}; |
| } |
| } |
| } |
| ) }); |
| assertEquals(oobArray.length, maxSize); |
| |
| // iterator reset the length to 0 just before returning done, so this will crash |
| // if the backing store was not resized correctly. |
| oobArray[oobArray.length - 1] = 0x41414141; |