Index: src/json.js |
diff --git a/src/json.js b/src/json.js |
index 608cb7109d972f5981be6f51fefa17aab6ebc2ab..cc7fd7c662fd55f40c865f0d86a82389f0dc5fdb 100644 |
--- a/src/json.js |
+++ b/src/json.js |
@@ -178,143 +178,9 @@ function JSONSerialize(key, holder, replacer, stack, indent, gap) { |
} |
-function BasicSerializeArray(value, stack, builder) { |
- var len = value.length; |
- if (len == 0) { |
- builder.push("[]"); |
- return; |
- } |
- if (!%PushIfAbsent(stack, value)) { |
- throw MakeTypeError('circular_structure', $Array()); |
- } |
- builder.push("["); |
- var val = value[0]; |
- if (IS_STRING(val)) { |
- // First entry is a string. Remaining entries are likely to be strings too. |
- var array_string = %QuoteJSONStringArray(value); |
- if (!IS_UNDEFINED(array_string)) { |
- // array_string also includes bracket characters so we are done. |
- builder[builder.length - 1] = array_string; |
- stack.pop(); |
- return; |
- } else { |
- builder.push(%QuoteJSONString(val)); |
- for (var i = 1; i < len; i++) { |
- val = value[i]; |
- if (IS_STRING(val)) { |
- builder.push(%QuoteJSONStringComma(val)); |
- } else { |
- builder.push(","); |
- var before = builder.length; |
- BasicJSONSerialize(i, val, stack, builder); |
- if (before == builder.length) builder[before - 1] = ",null"; |
- } |
- } |
- } |
- } else if (IS_NUMBER(val)) { |
- // First entry is a number. Remaining entries are likely to be numbers too. |
- builder.push(JSON_NUMBER_TO_STRING(val)); |
- for (var i = 1; i < len; i++) { |
- builder.push(","); |
- val = value[i]; |
- if (IS_NUMBER(val)) { |
- builder.push(JSON_NUMBER_TO_STRING(val)); |
- } else { |
- var before = builder.length; |
- BasicJSONSerialize(i, val, stack, builder); |
- if (before == builder.length) builder[before - 1] = ",null"; |
- } |
- } |
- } else { |
- var before = builder.length; |
- BasicJSONSerialize(0, val, stack, builder); |
- if (before == builder.length) builder.push("null"); |
- for (var i = 1; i < len; i++) { |
- builder.push(","); |
- before = builder.length; |
- BasicJSONSerialize(i, value[i], stack, builder); |
- if (before == builder.length) builder[before - 1] = ",null"; |
- } |
- } |
- stack.pop(); |
- builder.push("]"); |
-} |
- |
- |
-function BasicSerializeObject(value, stack, builder) { |
- if (!%PushIfAbsent(stack, value)) { |
- throw MakeTypeError('circular_structure', $Array()); |
- } |
- builder.push("{"); |
- var first = true; |
- var keys = %ObjectKeys(value); |
- var len = keys.length; |
- for (var i = 0; i < len; i++) { |
- var p = keys[i]; |
- if (!first) { |
- builder.push(%QuoteJSONStringComma(p)); |
- } else { |
- builder.push(%QuoteJSONString(p)); |
- } |
- builder.push(":"); |
- var before = builder.length; |
- BasicJSONSerialize(p, value[p], stack, builder); |
- if (before == builder.length) { |
- builder.pop(); |
- builder.pop(); |
- } else { |
- first = false; |
- } |
- } |
- stack.pop(); |
- builder.push("}"); |
-} |
- |
- |
-function BasicJSONSerialize(key, value, stack, builder) { |
- if (IS_SPEC_OBJECT(value)) { |
- var toJSON = value.toJSON; |
- if (IS_SPEC_FUNCTION(toJSON)) { |
- value = %_CallFunction(value, ToString(key), toJSON); |
- } |
- } |
- if (IS_STRING(value)) { |
- builder.push(value !== "" ? %QuoteJSONString(value) : '""'); |
- } else if (IS_NUMBER(value)) { |
- builder.push(JSON_NUMBER_TO_STRING(value)); |
- } else if (IS_BOOLEAN(value)) { |
- builder.push(value ? "true" : "false"); |
- } else if (IS_NULL(value)) { |
- builder.push("null"); |
- } else if (IS_SPEC_OBJECT(value) && !(typeof value == "function")) { |
- // Value is a non-callable object. |
- // Unwrap value if necessary |
- if (IS_NUMBER_WRAPPER(value)) { |
- value = ToNumber(value); |
- builder.push(JSON_NUMBER_TO_STRING(value)); |
- } else if (IS_STRING_WRAPPER(value)) { |
- builder.push(%QuoteJSONString(ToString(value))); |
- } else if (IS_BOOLEAN_WRAPPER(value)) { |
- builder.push(%_ValueOf(value) ? "true" : "false"); |
- } else if (IS_ARRAY(value)) { |
- BasicSerializeArray(value, stack, builder); |
- } else { |
- BasicSerializeObject(value, stack, builder); |
- } |
- } |
-} |
- |
- |
function JSONStringify(value, replacer, space) { |
if (%_ArgumentsLength() == 1) { |
- var result = %BasicJSONStringify(value); |
- if (result != 0) return result; |
- var builder = new InternalArray(); |
- BasicJSONSerialize('', value, new InternalArray(), builder); |
- if (builder.length == 0) return; |
- result = %_FastAsciiArrayJoin(builder, ""); |
- if (!IS_UNDEFINED(result)) return result; |
- return %StringBuilderConcat(builder, builder.length, ""); |
+ return %BasicJSONStringify(value); |
} |
if (IS_OBJECT(space)) { |
// Unwrap 'space' if it is wrapped |
@@ -340,6 +206,7 @@ function JSONStringify(value, replacer, space) { |
return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap); |
} |
+ |
function SetUpJSON() { |
%CheckIsBootstrapping(); |
InstallFunctions($JSON, DONT_ENUM, $Array( |