| // 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. |
| |
| (function CycleDetection() { |
| const arr = [ |
| { |
| toLocaleString() { |
| return [1, arr]; |
| } |
| } |
| ]; |
| assertSame('1,', arr.toLocaleString()); |
| assertSame('1,', arr.toLocaleString()); |
| })(); |
| |
| (function ThrowsError(){ |
| function TestError() {} |
| const arr = []; |
| const obj = { |
| toLocaleString(){ |
| throw new TestError(); |
| } |
| }; |
| arr[0] = obj; |
| assertThrows(() => arr.toLocaleString(), TestError); |
| |
| // Verifies cycle detection still works properly after thrown error. |
| arr[0] = { |
| toLocaleString() { |
| return 1; |
| } |
| }; |
| assertSame('1', arr.toLocaleString()); |
| })(); |
| |
| (function AccessThrowsError(){ |
| function TestError() {} |
| const arr = []; |
| const obj = { |
| get toLocaleString(){ |
| throw new TestError(); |
| } |
| }; |
| arr[0] = obj; |
| assertThrows(() => arr.toLocaleString(), TestError); |
| |
| // Verifies cycle detection still works properly after thrown error. |
| arr[0] = { |
| toLocaleString() { |
| return 1; |
| } |
| }; |
| assertSame('1', arr.toLocaleString()); |
| })(); |
| |
| (function NotCallable(){ |
| const arr = []; |
| const obj = { |
| toLocaleString: 7 |
| } |
| arr[0] = obj; |
| assertThrows(() => arr.toLocaleString(), TypeError, '7 is not a function'); |
| |
| // Verifies cycle detection still works properly after thrown error. |
| arr[0] = { |
| toLocaleString() { |
| return 1; |
| } |
| }; |
| assertSame('1', arr.toLocaleString()); |
| })(); |