Chromium Code Reviews| Index: src/json.js |
| =================================================================== |
| --- src/json.js (revision 6268) |
| +++ src/json.js (working copy) |
| @@ -184,11 +184,42 @@ |
| } |
| builder.push("["); |
| var len = value.length; |
| - for (var i = 0; i < len; i++) { |
| - var before = builder.length; |
| - BasicJSONSerialize(i, value, stack, builder); |
| - if (before == builder.length) builder.push("null"); |
| - builder.push(","); |
| + var val = value[0]; |
|
Erik Corry
2011/01/12 12:44:41
what if len is 0 and value has an accessor on "0"?
sandholm
2011/01/12 13:36:20
Good point. Fix uploaded. Could you have another l
|
| + if (IS_STRING(val)) { |
| + // First entry is a string. Remaining entries are likely to be strings too. |
| + for (var i = 0; i < len; i++) { |
| + val = value[i]; |
| + if (IS_STRING(val)) { |
| + builder.push(%QuoteJSONString(val)); |
| + } else { |
| + var before = builder.length; |
| + BasicJSONSerialize(i, value, stack, builder); |
| + if (before == builder.length) builder.push("null"); |
| + } |
| + builder.push(","); |
| + } |
| + } else if (IS_NUMBER(val)) { |
| + // First entry is a number. Remaining entries are likely to be numbers too. |
| + for (var i = 0; i < len; i++) { |
| + val = value[i]; |
| + if (IS_NUMBER(val)) { |
| + builder.push(NUMBER_IS_FINITE(val) |
| + ? %_NumberToString(val) |
| + : "null"); |
| + } else { |
| + var before = builder.length; |
| + BasicJSONSerialize(i, value, stack, builder); |
| + if (before == builder.length) builder.push("null"); |
| + } |
| + builder.push(","); |
| + } |
| + } else { |
| + for (var i = 0; i < len; i++) { |
| + var before = builder.length; |
| + BasicJSONSerialize(i, value, stack, builder); |
| + if (before == builder.length) builder.push("null"); |
| + builder.push(","); |
| + } |
| } |
| stack.pop(); |
| if (builder.pop() != ",") { |