| OLD | NEW | 
|    1 // Copyright 2009 the V8 project authors. All rights reserved. |    1 // Copyright 2009 the V8 project authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 (function(global, utils) { |    5 (function(global, utils) { | 
|    6  |    6  | 
|    7 "use strict"; |    7 "use strict"; | 
|    8  |    8  | 
|    9 %CheckIsBootstrapping(); |    9 %CheckIsBootstrapping(); | 
|   10  |   10  | 
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  114   return final; |  114   return final; | 
|  115 } |  115 } | 
|  116  |  116  | 
|  117  |  117  | 
|  118 function SerializeObject(value, replacer, stack, indent, gap) { |  118 function SerializeObject(value, replacer, stack, indent, gap) { | 
|  119   if (StackHas(stack, value)) throw MakeTypeError(kCircularStructure); |  119   if (StackHas(stack, value)) throw MakeTypeError(kCircularStructure); | 
|  120   StackPush(stack, value); |  120   StackPush(stack, value); | 
|  121   var stepback = indent; |  121   var stepback = indent; | 
|  122   indent += gap; |  122   indent += gap; | 
|  123   var partial = new InternalArray(); |  123   var partial = new InternalArray(); | 
|  124   if (IS_ARRAY(replacer)) { |  124   var keys = %object_keys(value); | 
|  125     var length = replacer.length; |  125   for (var i = 0; i < keys.length; i++) { | 
|  126     for (var i = 0; i < length; i++) { |  126     var p = keys[i]; | 
|  127       var p = replacer[i]; |  127     var strP = JSONSerialize(p, value, replacer, stack, indent, gap); | 
|  128       var strP = JSONSerialize(p, value, replacer, stack, indent, gap); |  128     if (!IS_UNDEFINED(strP)) { | 
|  129       if (!IS_UNDEFINED(strP)) { |  129       var member = %QuoteJSONString(p) + ":"; | 
|  130         var member = %QuoteJSONString(p) + ":"; |  130       if (gap != "") member += " "; | 
|  131         if (gap != "") member += " "; |  131       member += strP; | 
|  132         member += strP; |  132       partial.push(member); | 
|  133         partial.push(member); |  | 
|  134       } |  | 
|  135     } |  | 
|  136   } else { |  | 
|  137     var keys = %object_keys(value); |  | 
|  138     for (var i = 0; i < keys.length; i++) { |  | 
|  139       var p = keys[i]; |  | 
|  140       var strP = JSONSerialize(p, value, replacer, stack, indent, gap); |  | 
|  141       if (!IS_UNDEFINED(strP)) { |  | 
|  142         var member = %QuoteJSONString(p) + ":"; |  | 
|  143         if (gap != "") member += " "; |  | 
|  144         member += strP; |  | 
|  145         partial.push(member); |  | 
|  146       } |  | 
|  147     } |  133     } | 
|  148   } |  134   } | 
|  149   var final; |  135   var final; | 
|  150   if (gap == "") { |  136   if (gap == "") { | 
|  151     final = "{" + partial.join(",") + "}"; |  137     final = "{" + partial.join(",") + "}"; | 
|  152   } else if (partial.length > 0) { |  138   } else if (partial.length > 0) { | 
|  153     var separator = ",\n" + indent; |  139     var separator = ",\n" + indent; | 
|  154     final = "{\n" + indent + partial.join(separator) + "\n" + |  140     final = "{\n" + indent + partial.join(separator) + "\n" + | 
|  155         stepback + "}"; |  141         stepback + "}"; | 
|  156   } else { |  142   } else { | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  194     } else { |  180     } else { | 
|  195       return SerializeObject(value, replacer, stack, indent, gap); |  181       return SerializeObject(value, replacer, stack, indent, gap); | 
|  196     } |  182     } | 
|  197   } |  183   } | 
|  198   // Undefined or a callable object. |  184   // Undefined or a callable object. | 
|  199   return UNDEFINED; |  185   return UNDEFINED; | 
|  200 } |  186 } | 
|  201  |  187  | 
|  202  |  188  | 
|  203 function JSONStringify(value, replacer, space) { |  189 function JSONStringify(value, replacer, space) { | 
|  204   if (arguments.length === 1) return %BasicJSONStringify(value, ""); |  190   if (arguments.length === 1) return %BasicJSONStringify(value, UNDEFINED, ""); | 
|  205   if (!IS_CALLABLE(replacer) && %is_arraylike(replacer)) { |  191   if (!IS_CALLABLE(replacer)) { | 
|  206     var property_list = new InternalArray(); |  192     return %BasicJSONStringify(value, replacer, space); | 
|  207     var seen_properties = new GlobalSet(); |  | 
|  208     var length = TO_LENGTH(replacer.length); |  | 
|  209     for (var i = 0; i < length; i++) { |  | 
|  210       var v = replacer[i]; |  | 
|  211       var item; |  | 
|  212       if (IS_STRING(v)) { |  | 
|  213         item = v; |  | 
|  214       } else if (IS_NUMBER(v)) { |  | 
|  215         item = %_NumberToString(v); |  | 
|  216       } else if (IS_STRING_WRAPPER(v) || IS_NUMBER_WRAPPER(v)) { |  | 
|  217         item = TO_STRING(v); |  | 
|  218       } else { |  | 
|  219         continue; |  | 
|  220       } |  | 
|  221       if (!seen_properties.has(item)) { |  | 
|  222         property_list.push(item); |  | 
|  223         seen_properties.add(item); |  | 
|  224       } |  | 
|  225     } |  | 
|  226     replacer = property_list; |  | 
|  227   } |  193   } | 
|  228   if (IS_OBJECT(space)) { |  194   if (IS_OBJECT(space)) { | 
|  229     // Unwrap 'space' if it is wrapped |  195     // Unwrap 'space' if it is wrapped | 
|  230     if (IS_NUMBER_WRAPPER(space)) { |  196     if (IS_NUMBER_WRAPPER(space)) { | 
|  231       space = TO_NUMBER(space); |  197       space = TO_NUMBER(space); | 
|  232     } else if (IS_STRING_WRAPPER(space)) { |  198     } else if (IS_STRING_WRAPPER(space)) { | 
|  233       space = TO_STRING(space); |  199       space = TO_STRING(space); | 
|  234     } |  200     } | 
|  235   } |  201   } | 
|  236   if (!IS_CALLABLE(replacer) && !property_list) { |  | 
|  237     return %BasicJSONStringify(value, space); |  | 
|  238   } |  | 
|  239   var gap; |  202   var gap; | 
|  240   if (IS_NUMBER(space)) { |  203   if (IS_NUMBER(space)) { | 
|  241     space = MaxSimple(0, MinSimple(TO_INTEGER(space), 10)); |  204     space = MaxSimple(0, MinSimple(TO_INTEGER(space), 10)); | 
|  242     gap = %_SubString("          ", 0, space); |  205     gap = %_SubString("          ", 0, space); | 
|  243   } else if (IS_STRING(space)) { |  206   } else if (IS_STRING(space)) { | 
|  244     if (space.length > 10) { |  207     if (space.length > 10) { | 
|  245       gap = %_SubString(space, 0, 10); |  208       gap = %_SubString(space, 0, 10); | 
|  246     } else { |  209     } else { | 
|  247       gap = space; |  210       gap = space; | 
|  248     } |  211     } | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  274   } |  237   } | 
|  275   return o.toISOString(); |  238   return o.toISOString(); | 
|  276 } |  239 } | 
|  277  |  240  | 
|  278 // Set up non-enumerable functions of the Date prototype object. |  241 // Set up non-enumerable functions of the Date prototype object. | 
|  279 utils.InstallFunctions(GlobalDate.prototype, DONT_ENUM, [ |  242 utils.InstallFunctions(GlobalDate.prototype, DONT_ENUM, [ | 
|  280   "toJSON", DateToJSON |  243   "toJSON", DateToJSON | 
|  281 ]); |  244 ]); | 
|  282  |  245  | 
|  283 }) |  246 }) | 
| OLD | NEW |