//@ runFTLNoCJIT function shouldEqual(testId, actual, expected) { if (actual != expected) { throw testId + ": ERROR: expect " + expected + ", actual " + actual; } } function frozenArrayReviver(k, v) { if (k === "a") { this.b = Object.freeze(["unmodifiable"]); return v; } if (k === "0") return "modified"; return v; } function frozenArrayLikeObjectReviver(k, v) { if (k === "a") { var obj = {}; obj[0] = 'unmodifiable'; obj.length = 1; this.b = Object.freeze(obj); return v; } if (k === "0") return "modified"; return v; } function frozenArrayReviverWithDelete(k, v) { if (k === "a") { this.b = Object.freeze(["unmodifiable"]); return v; } if (k === "0") return undefined; return v; } function frozenArrayLikeObjectReviverWithDelete(k, v) { if (k === "a") { var obj = {}; obj[0] = 'unmodifiable'; obj.length = 1; this.b = Object.freeze(obj); return v; } if (k === "0") return undefined; return v; } function runTest(testId, reviver, expectedValue, expectedException) { let numIterations = 10000; for (var i = 0; i < numIterations; i++) { var exception = undefined; var obj; try { obj = JSON.parse('{ "a": 0, "b": 0 }', reviver); } catch (e) { exception = "" + e; exception = exception.substr(0, 10); // Search for "TypeError:". } shouldEqual(testId, exception, expectedException); shouldEqual(testId, obj.b[0], expectedValue); } } runTest(10000, frozenArrayReviver, "unmodifiable", undefined); runTest(10001, frozenArrayLikeObjectReviver, "unmodifiable", undefined); runTest(10002, frozenArrayReviverWithDelete, "unmodifiable", undefined); runTest(10003, frozenArrayLikeObjectReviverWithDelete, "unmodifiable", undefined);