diff options
Diffstat (limited to 'deps/v8/src/js/json.js')
-rw-r--r-- | deps/v8/src/js/json.js | 112 |
1 files changed, 68 insertions, 44 deletions
diff --git a/deps/v8/src/js/json.js b/deps/v8/src/js/json.js index 38c46af6d6..b8836eaddd 100644 --- a/deps/v8/src/js/json.js +++ b/deps/v8/src/js/json.js @@ -11,7 +11,9 @@ // ------------------------------------------------------------------- // Imports +var GlobalDate = global.Date; var GlobalJSON = global.JSON; +var GlobalSet = global.Set; var InternalArray = utils.InternalArray; var MakeTypeError; var MaxSimple; @@ -28,24 +30,33 @@ utils.Import(function(from) { // ------------------------------------------------------------------- -function Revive(holder, name, reviver) { +function CreateDataProperty(o, p, v) { + var desc = {value: v, enumerable: true, writable: true, configurable: true}; + return %reflect_define_property(o, p, desc); +} + + +function InternalizeJSONProperty(holder, name, reviver) { var val = holder[name]; - if (IS_OBJECT(val)) { - if (IS_ARRAY(val)) { - var length = val.length; + if (IS_RECEIVER(val)) { + if (%is_arraylike(val)) { + var length = TO_LENGTH(val.length); for (var i = 0; i < length; i++) { - var newElement = Revive(val, %_NumberToString(i), reviver); - val[i] = newElement; + var newElement = + InternalizeJSONProperty(val, %_NumberToString(i), reviver); + if (IS_UNDEFINED(newElement)) { + %reflect_delete_property(val, i); + } else { + CreateDataProperty(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; - } + for (var p of %object_keys(val)) { + var newElement = InternalizeJSONProperty(val, p, reviver); + if (IS_UNDEFINED(newElement)) { + %reflect_delete_property(val, p); + } else { + CreateDataProperty(val, p, newElement); } } } @@ -57,7 +68,7 @@ function Revive(holder, name, reviver) { function JSONParse(text, reviver) { var unfiltered = %ParseJson(text); if (IS_CALLABLE(reviver)) { - return Revive({'': unfiltered}, '', reviver); + return InternalizeJSONProperty({'': unfiltered}, '', reviver); } else { return unfiltered; } @@ -69,7 +80,7 @@ function SerializeArray(value, replacer, stack, indent, gap) { var stepback = indent; indent += gap; var partial = new InternalArray(); - var len = value.length; + var len = TO_LENGTH(value.length); for (var i = 0; i < len; i++) { var strP = JSONSerialize(%_NumberToString(i), value, replacer, stack, indent, gap); @@ -101,27 +112,23 @@ function SerializeObject(value, replacer, stack, indent, gap) { 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); - } + 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); - } + for (var p of %object_keys(value)) { + 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); } } } @@ -142,7 +149,7 @@ function SerializeObject(value, replacer, stack, indent, gap) { function JSONSerialize(key, holder, replacer, stack, indent, gap) { var value = holder[key]; - if (IS_SPEC_OBJECT(value)) { + if (IS_RECEIVER(value)) { var toJSON = value.toJSON; if (IS_CALLABLE(toJSON)) { value = %_Call(toJSON, value, key); @@ -159,9 +166,9 @@ function JSONSerialize(key, holder, replacer, stack, indent, gap) { return value ? "true" : "false"; } else if (IS_NULL(value)) { return "null"; - } else if (IS_SPEC_OBJECT(value) && !IS_CALLABLE(value)) { + } else if (IS_RECEIVER(value) && !IS_CALLABLE(value)) { // Non-callable object. If it's a primitive wrapper, it must be unwrapped. - if (IS_ARRAY(value)) { + if (%is_arraylike(value)) { return SerializeArray(value, replacer, stack, indent, gap); } else if (IS_NUMBER_WRAPPER(value)) { value = TO_NUMBER(value); @@ -180,14 +187,13 @@ function JSONSerialize(key, holder, replacer, stack, indent, gap) { function JSONStringify(value, replacer, space) { - if (%_ArgumentsLength() == 1) { + if (%_ArgumentsLength() == 1 && !IS_PROXY(value)) { return %BasicJSONStringify(value); } - if (IS_ARRAY(replacer)) { - // Deduplicate replacer array items. + if (!IS_CALLABLE(replacer) && %is_arraylike(replacer)) { var property_list = new InternalArray(); - var seen_properties = { __proto__: null }; - var length = replacer.length; + var seen_properties = new GlobalSet(); + var length = TO_LENGTH(replacer.length); for (var i = 0; i < length; i++) { var v = replacer[i]; var item; @@ -200,9 +206,9 @@ function JSONStringify(value, replacer, space) { } else { continue; } - if (!seen_properties[item]) { + if (!seen_properties.has(item)) { property_list.push(item); - seen_properties[item] = true; + seen_properties.add(item); } } replacer = property_list; @@ -242,6 +248,24 @@ utils.InstallFunctions(GlobalJSON, DONT_ENUM, [ ]); // ------------------------------------------------------------------- +// Date.toJSON + +// 20.3.4.37 Date.prototype.toJSON ( key ) +function DateToJSON(key) { + var o = TO_OBJECT(this); + var tv = TO_PRIMITIVE_NUMBER(o); + if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) { + return null; + } + return o.toISOString(); +} + +// Set up non-enumerable functions of the Date prototype object. +utils.InstallFunctions(GlobalDate.prototype, DONT_ENUM, [ + "toJSON", DateToJSON +]); + +// ------------------------------------------------------------------- // JSON Builtins function JsonSerializeAdapter(key, object) { |