| 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(
|
|
|