diff options
Diffstat (limited to 'deps/v8/src/js/json.js')
-rw-r--r-- | deps/v8/src/js/json.js | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/deps/v8/src/js/json.js b/deps/v8/src/js/json.js index 73d7802be9..c6dbed9cbb 100644 --- a/deps/v8/src/js/json.js +++ b/deps/v8/src/js/json.js @@ -19,6 +19,10 @@ var MakeTypeError; var MaxSimple; var MinSimple; var ObjectHasOwnProperty; +var Stack; +var StackHas; +var StackPop; +var StackPush; var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); utils.Import(function(from) { @@ -26,6 +30,10 @@ utils.Import(function(from) { MaxSimple = from.MaxSimple; MinSimple = from.MinSimple; ObjectHasOwnProperty = from.ObjectHasOwnProperty; + Stack = from.Stack; + StackHas = from.StackHas; + StackPop = from.StackPop; + StackPush = from.StackPush; }); // ------------------------------------------------------------------- @@ -51,7 +59,9 @@ function InternalizeJSONProperty(holder, name, reviver) { } } } else { - for (var p of %object_keys(val)) { + var keys = %object_keys(val); + for (var i = 0; i < keys.length; i++) { + var p = keys[i]; var newElement = InternalizeJSONProperty(val, p, reviver); if (IS_UNDEFINED(newElement)) { %reflect_delete_property(val, p); @@ -76,7 +86,8 @@ function JSONParse(text, reviver) { function SerializeArray(value, replacer, stack, indent, gap) { - if (!%PushIfAbsent(stack, value)) throw MakeTypeError(kCircularStructure); + if (StackHas(stack, value)) throw MakeTypeError(kCircularStructure); + StackPush(stack, value); var stepback = indent; indent += gap; var partial = new InternalArray(); @@ -99,13 +110,14 @@ function SerializeArray(value, replacer, stack, indent, gap) { } else { final = "[]"; } - stack.pop(); + StackPop(stack); return final; } function SerializeObject(value, replacer, stack, indent, gap) { - if (!%PushIfAbsent(stack, value)) throw MakeTypeError(kCircularStructure); + if (StackHas(stack, value)) throw MakeTypeError(kCircularStructure); + StackPush(stack, value); var stepback = indent; indent += gap; var partial = new InternalArray(); @@ -122,7 +134,9 @@ function SerializeObject(value, replacer, stack, indent, gap) { } } } else { - for (var p of %object_keys(value)) { + var keys = %object_keys(value); + for (var i = 0; i < keys.length; i++) { + var p = keys[i]; var strP = JSONSerialize(p, value, replacer, stack, indent, gap); if (!IS_UNDEFINED(strP)) { var member = %QuoteJSONString(p) + ":"; @@ -142,7 +156,7 @@ function SerializeObject(value, replacer, stack, indent, gap) { } else { final = "{}"; } - stack.pop(); + StackPop(stack); return final; } @@ -237,7 +251,7 @@ function JSONStringify(value, replacer, space) { if (!IS_CALLABLE(replacer) && !property_list && !gap && !IS_PROXY(value)) { return %BasicJSONStringify(value); } - return JSONSerialize('', {'': value}, replacer, new InternalArray(), "", gap); + return JSONSerialize('', {'': value}, replacer, new Stack(), "", gap); } // ------------------------------------------------------------------- @@ -275,7 +289,7 @@ 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(), "", ""); + return JSONSerialize(key, holder, UNDEFINED, new Stack(), "", ""); } %InstallToContext(["json_serialize_adapter", JsonSerializeAdapter]); |