Recently I ran into a problem: Valid JSON when passed to the eval() function causes it to throw the error — “script stack space quota is exhausted”.
It is consistently reproducible, and through initial examination, it seems that this is a limitation on the number of object attributes/properties that can be defined (and not the size of the content).
Here’s the sample code:
function starttest()
{
var d = new Array(50000);
var i = 0;
for (i = 0; i < d.length; i++) {
d[i] = new Object();
d[i].a1 = 1;
d[i].a2 = 2;
d[i].a3 = i;
d[i].a4 = i;
d[i].a5 = i;
d[i].a6 = i;
d[i].a7 = i;
d[i].a8 = i;
d[i].a9 = i;
d[i].a10 = i;
d[i].a11 = i;
d[i].a12 = i;
d[i].a13 = i;
d[i].a14 = i;
d[i].a15 = i;
}
var jsonString = JSON.stringify(d);
alert(jsonString.length);
var obj = eval(jsonString);
var count = 0;
for( var i = 0; i< obj.length; i++) {
for (var k in obj[i]) {
if (obj[i].hasOwnProperty(k)) {
++count;
}
}
}
alert("Done! || Len: " + obj.length + " || " + "Attrib Count: " + count + " || " + typeof obj)
}
The funny thing is I can define many more objects than seen in the code snippet; the problem arises only when using the eval() function.
Any new insights into this would be greatly helpful. I know using eval() is not safe, and all… and I’m open to suggestions!
Yeah, this is a problem with Firefox’s JavaScript interpreter in general. It’s not just
eval: if you put fifty thousand lines of:in an array literal in a plain script file or
<script>element, you get exactly the same error.It seems the complexity of a script block is limited by the compile-time
JS_DEFAULT_SCRIPT_STACK_QUOTA. See 420869 and the related linked bugs.It’s relatively unlikely you should meet this in normal circumstances. Of course for the case of JSON you can use
JSON.parsewhich, not being a full JavaScript interpreter, is not affected by this limitation. If you needed a non-valid-JSON JS literal parser that’s not affected, I guess you’d have to write it yourself… though it’d probably be annoyingly slow when you get to input this long.