diff options
Diffstat (limited to 'deps/v8/src/json.js')
-rw-r--r-- | deps/v8/src/json.js | 143 |
1 files changed, 10 insertions, 133 deletions
diff --git a/deps/v8/src/json.js b/deps/v8/src/json.js index 85224b0f05..9ab1a31e59 100644 --- a/deps/v8/src/json.js +++ b/deps/v8/src/json.js @@ -178,141 +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 builder = new InternalArray(); - BasicJSONSerialize('', value, new InternalArray(), builder); - if (builder.length == 0) return; - var 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 @@ -338,6 +206,7 @@ function JSONStringify(value, replacer, space) { return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap); } + function SetUpJSON() { %CheckIsBootstrapping(); InstallFunctions($JSON, DONT_ENUM, $Array( @@ -346,4 +215,12 @@ function SetUpJSON() { )); } + +function JSONSerializeAdapter(key, object) { + var holder = {}; + holder[key] = object; + // No need to pass the actual holder since there is no replacer function. + return JSONSerialize(key, holder, void 0, new InternalArray(), "", ""); +} + SetUpJSON(); |