JSON.parse incorrectly handles array proxies
[WebKit-https.git] / JSTests / stress / json-parse-reviver-revoked-proxy.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error('bad value: ' + actual);
4 }
5
6 function revivedObjProxy(key, value) {
7     if (key === 'a') {
8         let {proxy, revoke} = Proxy.revocable({}, {});
9         revoke();
10         this.b = proxy;
11     }
12
13     return value;
14 }
15
16 function revivedArrProxy(key, value) {
17     if (key === '0') {
18         let {proxy, revoke} = Proxy.revocable([], {});
19         revoke();
20         this[1] = proxy;
21     }
22
23     return value;
24 }
25
26 const objJSON = '{"a": 1, "b": 2}';
27 const arrJSON = '[3, 4]';
28 const isArrayError = 'TypeError: Array.isArray cannot be called on a Proxy that has been revoked';
29
30 for (let i = 1; i < 10000; i++) {
31     let error;
32     try {
33         JSON.parse(objJSON, revivedObjProxy);
34     } catch (e) {
35         error = e;
36     }
37     shouldBe(error.toString(), isArrayError);
38 }
39
40 for (let i = 1; i < 10000; i++) {
41     let error;
42     try {
43         JSON.parse(arrJSON, revivedArrProxy);
44     } catch (e) {
45         error = e;
46     }
47     shouldBe(error.toString(), isArrayError);
48 }