a70344c63a
Modification of InstanceType enum caused JsonStringifier::Serialize_() function to consume more stack space (because of a switch statement) in non-optimized debug build which now causes stack overflow on certain depth of nested objects. The modification affects neither optimized debug nor release builds. Change-Id: Ia2925d9abbd1c32c5a4694e14c49b2d0bd119419 Reviewed-on: https://chromium-review.googlesource.com/789074 Commit-Queue: Igor Sheludko <ishell@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Cr-Commit-Position: refs/heads/master@{#49657}
530 lines
22 KiB
JavaScript
530 lines
22 KiB
JavaScript
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions
|
|
// are met:
|
|
// 1. Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// 2. Redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
|
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
function createTests() {
|
|
var simpleArray = ['a', 'b', 'c'];
|
|
var simpleObject = {a:"1", b:"2", c:"3"};
|
|
var complexArray = ['a', 'b', 'c',,,simpleObject, simpleArray, [simpleObject,simpleArray]];
|
|
var complexObject = {a:"1", b:"2", c:"3", d:undefined, e:null, "":12, get f(){ return simpleArray; }, array: complexArray};
|
|
var simpleArrayWithProto = ['d', 'e', 'f'];
|
|
simpleArrayWithProto.__proto__ = simpleObject;
|
|
var simpleObjectWithProto = {d:"4", e:"5", f:"6", __proto__:simpleObject};
|
|
var complexArrayWithProto = ['d', 'e', 'f',,,simpleObjectWithProto, simpleArrayWithProto, [simpleObjectWithProto,simpleArrayWithProto]];
|
|
complexArrayWithProto.__proto__ = simpleObjectWithProto;
|
|
var complexObjectWithProto = {d:"4", e:"5", f:"6", g:undefined, h:null, "":12, get i(){ return simpleArrayWithProto; }, array2: complexArrayWithProto, __proto__:complexObject};
|
|
var objectWithSideEffectGetter = {get b() {this.foo=1;}};
|
|
var objectWithSideEffectGetterAndProto = {__proto__:{foo:"bar"}, get b() {this.foo=1;}};
|
|
var arrayWithSideEffectGetter = [];
|
|
arrayWithSideEffectGetter.__defineGetter__("b", function(){this.foo=1;});
|
|
var arrayWithSideEffectGetterAndProto = [];
|
|
arrayWithSideEffectGetterAndProto.__defineGetter__("b", function(){this.foo=1;});
|
|
arrayWithSideEffectGetterAndProto.__proto__ = {foo:"bar"};
|
|
var result = [];
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(1);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(1.5);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(-1);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(-1.5);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(null);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify("string");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Number(0));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Number(1));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Number(1.5));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Number(-1));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Number(-1.5));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new String("a string object"));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Boolean(true));
|
|
});
|
|
result.push(function (jsonObject){
|
|
var value = new Number(1);
|
|
value.valueOf = function() { return 2; }
|
|
return jsonObject.stringify(value);
|
|
});
|
|
result[result.length - 1].expected = '2';
|
|
result.push(function (jsonObject){
|
|
var value = new Boolean(true);
|
|
value.valueOf = function() { return 2; }
|
|
return jsonObject.stringify(value);
|
|
});
|
|
result[result.length - 1].expected = '2';
|
|
result.push(function (jsonObject){
|
|
var value = new String("fail");
|
|
value.toString = function() { return "converted string"; }
|
|
return jsonObject.stringify(value);
|
|
});
|
|
result[result.length - 1].expected = '"converted string"';
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(true);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(false);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Date(0));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON: Date.prototype.toJSON});
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return "custom toISOString"; }});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
var d = new Date(0);
|
|
d.toISOString = null;
|
|
return jsonObject.stringify(d);
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
var d = new Date(0);
|
|
d.toJSON = undefined;
|
|
return jsonObject.stringify(d);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({get Foo() { return "bar"; }});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({get Foo() { this.foo="wibble"; return "bar"; }});
|
|
});
|
|
result.push(function (jsonObject){
|
|
var count = 0;
|
|
jsonObject.stringify({get Foo() { count++; return "bar"; }});
|
|
return count;
|
|
});
|
|
result.push(function (jsonObject){
|
|
var count = 0;
|
|
return jsonObject.stringify({get Foo() { count++; delete this.bar; return "bar"; }, bar: "wibble"});
|
|
});
|
|
result.push(function (jsonObject){
|
|
var count = 0;
|
|
return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7});
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, function(k,v){allString = allString && (typeof k == "string"); return v});
|
|
return allString;
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
|
|
return allString;
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = [];
|
|
return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = ["a"];
|
|
return jsonObject.stringify({get a(){return 1;array[1]="b";array[2]="c"}, b:"2", c:"3"}, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
|
|
return jsonObject.stringify(simpleObject, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
|
|
return jsonObject.stringify(simpleObjectWithProto, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = [1, new Number(2), NaN, Infinity, -Infinity, new String("str")];
|
|
return jsonObject.stringify({"1":"1","2":"2","NaN":"NaN","Infinity":"Infinity","-Infinity":"-Infinity","str":"str"}, array);
|
|
});
|
|
result[result.length - 1].expected = '{"1":"1","2":"2","NaN":"NaN","Infinity":"Infinity","-Infinity":"-Infinity","str":"str"}';
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = ["1","2","3"];
|
|
return jsonObject.stringify({1:'a', 2:'b', 3:'c'}, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = ["1","2","3"];
|
|
return jsonObject.stringify(simpleArray, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArray, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArray, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArray, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArray, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, 10);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, 11);
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, " ");
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObject, null, " ");
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArray, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArray, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArray, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArray, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObject, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObject, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObject, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObject, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = ["1","2","3"];
|
|
return jsonObject.stringify(simpleArrayWithProto, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArrayWithProto, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArrayWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArrayWithProto, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleArrayWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, 10);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, 11);
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, " ");
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(simpleObjectWithProto, null, " ");
|
|
});
|
|
result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArrayWithProto, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArrayWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArrayWithProto, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexArrayWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObjectWithProto, null, " ");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObjectWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObjectWithProto, null, "ab");
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(complexObjectWithProto, null, 4);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(objectWithSideEffectGetter);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(objectWithSideEffectGetterAndProto);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(arrayWithSideEffectGetter);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(arrayWithSideEffectGetterAndProto);
|
|
});
|
|
var replaceTracker;
|
|
function replaceFunc(key, value) {
|
|
replaceTracker += key + "("+(typeof key)+")" + JSON.stringify(value) + ";";
|
|
return value;
|
|
}
|
|
result.push(function (jsonObject){
|
|
replaceTracker = "";
|
|
jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
|
|
return replaceTracker;
|
|
});
|
|
result[result.length - 1].expected = '(string)[1,2,3,null,null,null,4,5,6];0(number)1;1(number)2;2(number)3;3(number)undefined;4(number)undefined;5(number)undefined;6(number)4;7(number)5;8(number)6;'
|
|
result.push(function (jsonObject){
|
|
replaceTracker = "";
|
|
jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
|
|
return replaceTracker;
|
|
});
|
|
result[result.length - 1].expected = '(string){"1":"f","2":"e","3":"d","a":"a","b":"b","c":"c"};1(string)"f";2(string)"e";3(string)"d";a(string)"a";b(string)"b";c(string)"c";';
|
|
result.push(function (jsonObject){
|
|
var count = 0;
|
|
var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
|
|
jsonObject.stringify(simpleObject, array);
|
|
return count;
|
|
});
|
|
result.push(function (jsonObject){
|
|
var allString = true;
|
|
var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
|
|
return jsonObject.stringify(simpleObject, array);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var count = 0;
|
|
var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
|
|
jsonObject.stringify(simpleObject, array);
|
|
return count;
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:"1", get b() { this.a="foo"; return "getter"; }, c:"3"});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:"1", get b() { this.c="foo"; return "getter"; }, c:"3"});
|
|
});
|
|
result.push(function (jsonObject){
|
|
var setterCalled = false;
|
|
jsonObject.stringify({a:"1", set b(s) { setterCalled = true; return "setter"; }, c:"3"});
|
|
return setterCalled;
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:"1", get b(){ return "getter"; }, set b(s) { return "setter"; }, c:"3"});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(new Array(10));
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify([undefined,,null,0,false]);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({p1:undefined,p2:null,p3:0,p4:false});
|
|
});
|
|
var cycleTracker = "";
|
|
var cyclicObject = { get preSelf1() { cycleTracker+="preSelf1,"; return "preSelf1"; },
|
|
preSelf2: {toJSON:function(){cycleTracker+="preSelf2,"; return "preSelf2"}},
|
|
self: [],
|
|
get postSelf1() { cycleTracker+="postSelf1,"; return "postSelf1" },
|
|
postSelf2: {toJSON:function(){cycleTracker+="postSelf2,"; return "postSelf2"}},
|
|
toJSON : function(key) { cycleTracker += key + "("+(typeof key)+"):" + this; return this; }
|
|
};
|
|
cyclicObject.self = cyclicObject;
|
|
result.push(function (jsonObject){
|
|
cycleTracker = "";
|
|
return jsonObject.stringify(cyclicObject);
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
cycleTracker = "";
|
|
try { jsonObject.stringify(cyclicObject); } catch(e) { cycleTracker += " -> exception" }
|
|
return cycleTracker;
|
|
});
|
|
result[result.length - 1].expected = "(string):[object Object]preSelf1,preSelf2,self(string):[object Object] -> exception"
|
|
var cyclicArray = [{toJSON : function(key,value) { cycleTracker += key + "("+(typeof key)+"):" + this; cycleTracker += "first,"; return this; }},
|
|
cyclicArray,
|
|
{toJSON : function(key,value) { cycleTracker += key + "("+(typeof key)+"):" + this; cycleTracker += "second,"; return this; }}];
|
|
cyclicArray[1] = cyclicArray;
|
|
result.push(function (jsonObject){
|
|
cycleTracker = "";
|
|
return jsonObject.stringify(cyclicArray);
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
result.push(function (jsonObject){
|
|
cycleTracker = "";
|
|
try { jsonObject.stringify(cyclicArray); } catch(e) { cycleTracker += " -> exception" }
|
|
return cycleTracker;
|
|
});
|
|
result[result.length - 1].expected = "0(number):[object Object]first, -> exception";
|
|
function createArray(len, o) { var r = []; for (var i = 0; i < len; i++) r[i] = o; return r; }
|
|
var getterCalls;
|
|
var magicObject = createArray(10, {abcdefg: [1,2,5,"ab", null, undefined, true, false,,],
|
|
get calls() {return ++getterCalls; },
|
|
"123":createArray(15, "foo"),
|
|
"":{a:"b"}});
|
|
result.push(function (jsonObject){
|
|
getterCalls = 0;
|
|
return jsonObject.stringify(magicObject) + " :: getter calls = " + getterCalls;
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(undefined);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(null);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON:function(){ return undefined; }});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({toJSON:function(){ return null; }});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify([{toJSON:function(){ return undefined; }}]);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify([{toJSON:function(){ return null; }}]);
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:{toJSON:function(){ return undefined; }}});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:{toJSON:function(){ return null; }}});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:{toJSON:function(){ return function(){}; }}});
|
|
});
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify({a:function(){}});
|
|
});
|
|
result.push(function (jsonObject){
|
|
var deepObject = {};
|
|
for (var i = 0; i < 1000; i++)
|
|
deepObject = {next:deepObject};
|
|
return jsonObject.stringify(deepObject);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var deepArray = [];
|
|
for (var i = 0; i < 1024; i++)
|
|
deepArray = [deepArray];
|
|
return jsonObject.stringify(deepArray);
|
|
});
|
|
result.push(function (jsonObject){
|
|
var depth = 0;
|
|
function toDeepVirtualJSONObject() {
|
|
if (++depth >= 1000)
|
|
return {};
|
|
var r = {};
|
|
r.toJSON = toDeepVirtualJSONObject;
|
|
return {recurse: r};
|
|
}
|
|
return jsonObject.stringify(toDeepVirtualJSONObject());
|
|
});
|
|
result.push(function (jsonObject){
|
|
var depth = 0;
|
|
function toDeepVirtualJSONArray() {
|
|
if (++depth >= 1024)
|
|
return [];
|
|
var r = [];
|
|
r.toJSON = toDeepJSONArray;
|
|
return [r];
|
|
}
|
|
return jsonObject.stringify(toDeepVirtualJSONArray());
|
|
});
|
|
var fullCharsetString = "";
|
|
for (var i = 0; i < 65536; i++)
|
|
fullCharsetString += String.fromCharCode(i);
|
|
result.push(function (jsonObject){
|
|
return jsonObject.stringify(fullCharsetString);
|
|
});
|
|
return result;
|
|
}
|
|
var tests = createTests();
|
|
for (var i = 0; i < tests.length; i++) {
|
|
try {
|
|
debug(tests[i]);
|
|
if (tests[i].throws)
|
|
shouldThrow('tests[i](nativeJSON)');
|
|
else if (tests[i].expected)
|
|
shouldBe('tests[i](nativeJSON)', "tests[i].expected");
|
|
else
|
|
shouldBe('tests[i](nativeJSON)', "tests[i](JSON)");
|
|
}catch(e){}
|
|
}
|