// Any copyright is dedicated to the Public Domain. // http://creativecommons.org/licenses/publicdomain/ //----------------------------------------------------------------------------- var BUGNUMBER = 578273; var summary = "ES5: Properly detect cycles in JSON.stringify (throw TypeError, check for " + "cycles rather than imprecisely rely on recursion limits)"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ // objects var count = 0; var desc = { get: function() { count++; return obj; }, enumerable: true, configurable: true }; var obj = Object.defineProperty({ p1: 0 }, "p2", desc); try { var str = JSON.stringify(obj); assertEq(false, true, "should have thrown, got " + str); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error type: " + e.constructor.name); assertEq(count, 1, "cyclic data structures not detected immediately"); } count = 0; var obj2 = Object.defineProperty({}, "obj", desc); try { var str = JSON.stringify(obj2); assertEq(false, true, "should have thrown, got " + str); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error type: " + e.constructor.name); assertEq(count, 2, "cyclic data structures not detected immediately"); } // arrays var count = 0; var desc = { get: function() { count++; return arr; }, enumerable: true, configurable: true }; var arr = Object.defineProperty([], "0", desc); try { var str = JSON.stringify(arr); assertEq(false, true, "should have thrown, got " + str); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error type: " + e.constructor.name); assertEq(count, 1, "cyclic data structures not detected immediately"); } count = 0; var arr2 = Object.defineProperty([], "0", desc); try { var str = JSON.stringify(arr2); assertEq(false, true, "should have thrown, got " + str); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error type: " + e.constructor.name); assertEq(count, 2, "cyclic data structures not detected immediately"); } /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("Tests complete");