Index: src/json.js |
diff --git a/src/json.js b/src/json.js |
deleted file mode 100644 |
index 8ec30ff6ea941abaabd6512239eccb4992f27fad..0000000000000000000000000000000000000000 |
--- a/src/json.js |
+++ /dev/null |
@@ -1,254 +0,0 @@ |
-// Copyright 2009 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-(function(global, utils) { |
- |
-"use strict"; |
- |
-%CheckIsBootstrapping(); |
- |
-// ------------------------------------------------------------------- |
-// Imports |
- |
-var GlobalJSON = global.JSON; |
-var InternalArray = utils.InternalArray; |
-var MathMax; |
-var MathMin; |
-var ObjectHasOwnProperty; |
-var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); |
- |
-utils.Import(function(from) { |
- MathMax = from.MathMax; |
- MathMin = from.MathMin; |
- ObjectHasOwnProperty = from.ObjectHasOwnProperty; |
-}); |
- |
-// ------------------------------------------------------------------- |
- |
-function Revive(holder, name, reviver) { |
- var val = holder[name]; |
- if (IS_OBJECT(val)) { |
- if (IS_ARRAY(val)) { |
- var length = val.length; |
- for (var i = 0; i < length; i++) { |
- var newElement = Revive(val, %_NumberToString(i), reviver); |
- val[i] = newElement; |
- } |
- } else { |
- for (var p in val) { |
- if (HAS_OWN_PROPERTY(val, p)) { |
- var newElement = Revive(val, p, reviver); |
- if (IS_UNDEFINED(newElement)) { |
- delete val[p]; |
- } else { |
- val[p] = newElement; |
- } |
- } |
- } |
- } |
- } |
- return %_Call(reviver, holder, name, val); |
-} |
- |
- |
-function JSONParse(text, reviver) { |
- var unfiltered = %ParseJson(text); |
- if (IS_CALLABLE(reviver)) { |
- return Revive({'': unfiltered}, '', reviver); |
- } else { |
- return unfiltered; |
- } |
-} |
- |
- |
-function SerializeArray(value, replacer, stack, indent, gap) { |
- if (!%PushIfAbsent(stack, value)) throw MakeTypeError(kCircularStructure); |
- var stepback = indent; |
- indent += gap; |
- var partial = new InternalArray(); |
- var len = value.length; |
- for (var i = 0; i < len; i++) { |
- var strP = JSONSerialize(%_NumberToString(i), value, replacer, stack, |
- indent, gap); |
- if (IS_UNDEFINED(strP)) { |
- strP = "null"; |
- } |
- partial.push(strP); |
- } |
- var final; |
- if (gap == "") { |
- final = "[" + partial.join(",") + "]"; |
- } else if (partial.length > 0) { |
- var separator = ",\n" + indent; |
- final = "[\n" + indent + partial.join(separator) + "\n" + |
- stepback + "]"; |
- } else { |
- final = "[]"; |
- } |
- stack.pop(); |
- return final; |
-} |
- |
- |
-function SerializeObject(value, replacer, stack, indent, gap) { |
- if (!%PushIfAbsent(stack, value)) throw MakeTypeError(kCircularStructure); |
- var stepback = indent; |
- indent += gap; |
- var partial = new InternalArray(); |
- if (IS_ARRAY(replacer)) { |
- var length = replacer.length; |
- for (var i = 0; i < length; i++) { |
- if (HAS_OWN_PROPERTY(replacer, i)) { |
- var p = replacer[i]; |
- var strP = JSONSerialize(p, value, replacer, stack, indent, gap); |
- if (!IS_UNDEFINED(strP)) { |
- var member = %QuoteJSONString(p) + ":"; |
- if (gap != "") member += " "; |
- member += strP; |
- partial.push(member); |
- } |
- } |
- } |
- } else { |
- for (var p in value) { |
- if (HAS_OWN_PROPERTY(value, p)) { |
- var strP = JSONSerialize(p, value, replacer, stack, indent, gap); |
- if (!IS_UNDEFINED(strP)) { |
- var member = %QuoteJSONString(p) + ":"; |
- if (gap != "") member += " "; |
- member += strP; |
- partial.push(member); |
- } |
- } |
- } |
- } |
- var final; |
- if (gap == "") { |
- final = "{" + partial.join(",") + "}"; |
- } else if (partial.length > 0) { |
- var separator = ",\n" + indent; |
- final = "{\n" + indent + partial.join(separator) + "\n" + |
- stepback + "}"; |
- } else { |
- final = "{}"; |
- } |
- stack.pop(); |
- return final; |
-} |
- |
- |
-function JSONSerialize(key, holder, replacer, stack, indent, gap) { |
- var value = holder[key]; |
- if (IS_SPEC_OBJECT(value)) { |
- var toJSON = value.toJSON; |
- if (IS_CALLABLE(toJSON)) { |
- value = %_Call(toJSON, value, key); |
- } |
- } |
- if (IS_CALLABLE(replacer)) { |
- value = %_Call(replacer, holder, key, value); |
- } |
- if (IS_STRING(value)) { |
- return %QuoteJSONString(value); |
- } else if (IS_NUMBER(value)) { |
- return JSON_NUMBER_TO_STRING(value); |
- } else if (IS_BOOLEAN(value)) { |
- return value ? "true" : "false"; |
- } else if (IS_NULL(value)) { |
- return "null"; |
- } else if (IS_SPEC_OBJECT(value) && !IS_CALLABLE(value)) { |
- // Non-callable object. If it's a primitive wrapper, it must be unwrapped. |
- if (IS_ARRAY(value)) { |
- return SerializeArray(value, replacer, stack, indent, gap); |
- } else if (IS_NUMBER_WRAPPER(value)) { |
- value = TO_NUMBER(value); |
- return JSON_NUMBER_TO_STRING(value); |
- } else if (IS_STRING_WRAPPER(value)) { |
- return %QuoteJSONString(TO_STRING(value)); |
- } else if (IS_BOOLEAN_WRAPPER(value)) { |
- return %_ValueOf(value) ? "true" : "false"; |
- } else { |
- return SerializeObject(value, replacer, stack, indent, gap); |
- } |
- } |
- // Undefined or a callable object. |
- return UNDEFINED; |
-} |
- |
- |
-function JSONStringify(value, replacer, space) { |
- if (%_ArgumentsLength() == 1) { |
- return %BasicJSONStringify(value); |
- } |
- if (IS_ARRAY(replacer)) { |
- // Deduplicate replacer array items. |
- var property_list = new InternalArray(); |
- var seen_properties = { __proto__: null }; |
- var length = replacer.length; |
- for (var i = 0; i < length; i++) { |
- var v = replacer[i]; |
- var item; |
- if (IS_STRING(v)) { |
- item = v; |
- } else if (IS_NUMBER(v)) { |
- item = %_NumberToString(v); |
- } else if (IS_STRING_WRAPPER(v) || IS_NUMBER_WRAPPER(v)) { |
- item = TO_STRING(v); |
- } else { |
- continue; |
- } |
- if (!seen_properties[item]) { |
- property_list.push(item); |
- seen_properties[item] = true; |
- } |
- } |
- replacer = property_list; |
- } |
- if (IS_OBJECT(space)) { |
- // Unwrap 'space' if it is wrapped |
- if (IS_NUMBER_WRAPPER(space)) { |
- space = TO_NUMBER(space); |
- } else if (IS_STRING_WRAPPER(space)) { |
- space = TO_STRING(space); |
- } |
- } |
- var gap; |
- if (IS_NUMBER(space)) { |
- space = MathMax(0, MathMin(TO_INTEGER(space), 10)); |
- gap = %_SubString(" ", 0, space); |
- } else if (IS_STRING(space)) { |
- if (space.length > 10) { |
- gap = %_SubString(space, 0, 10); |
- } else { |
- gap = space; |
- } |
- } else { |
- gap = ""; |
- } |
- return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap); |
-} |
- |
-// ------------------------------------------------------------------- |
- |
-%AddNamedProperty(GlobalJSON, toStringTagSymbol, "JSON", READ_ONLY | DONT_ENUM); |
- |
-// Set up non-enumerable properties of the JSON object. |
-utils.InstallFunctions(GlobalJSON, DONT_ENUM, [ |
- "parse", JSONParse, |
- "stringify", JSONStringify |
-]); |
- |
-// ------------------------------------------------------------------- |
-// JSON Builtins |
- |
-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, UNDEFINED, new InternalArray(), "", ""); |
-} |
- |
-%InstallToContext(["json_serialize_adapter", JsonSerializeAdapter]); |
- |
-}) |