| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 if (IS_FUNCTION(toJSON)) { | 146 if (IS_FUNCTION(toJSON)) { |
| 147 value = %_CallFunction(value, key, toJSON); | 147 value = %_CallFunction(value, key, toJSON); |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 if (IS_FUNCTION(replacer)) { | 150 if (IS_FUNCTION(replacer)) { |
| 151 value = %_CallFunction(holder, key, value, replacer); | 151 value = %_CallFunction(holder, key, value, replacer); |
| 152 } | 152 } |
| 153 if (IS_STRING(value)) { | 153 if (IS_STRING(value)) { |
| 154 return %QuoteJSONString(value); | 154 return %QuoteJSONString(value); |
| 155 } else if (IS_NUMBER(value)) { | 155 } else if (IS_NUMBER(value)) { |
| 156 return NUMBER_IS_FINITE(value) ? $String(value) : "null"; | 156 return JSON_NUMBER_TO_STRING(value); |
| 157 } else if (IS_BOOLEAN(value)) { | 157 } else if (IS_BOOLEAN(value)) { |
| 158 return value ? "true" : "false"; | 158 return value ? "true" : "false"; |
| 159 } else if (IS_NULL(value)) { | 159 } else if (IS_NULL(value)) { |
| 160 return "null"; | 160 return "null"; |
| 161 } else if (IS_SPEC_OBJECT(value) && !(typeof value == "function")) { | 161 } else if (IS_SPEC_OBJECT(value) && !(typeof value == "function")) { |
| 162 // Non-callable object. If it's a primitive wrapper, it must be unwrapped. | 162 // Non-callable object. If it's a primitive wrapper, it must be unwrapped. |
| 163 if (IS_ARRAY(value)) { | 163 if (IS_ARRAY(value)) { |
| 164 return SerializeArray(value, replacer, stack, indent, gap); | 164 return SerializeArray(value, replacer, stack, indent, gap); |
| 165 } else if (IS_NUMBER_WRAPPER(value)) { | 165 } else if (IS_NUMBER_WRAPPER(value)) { |
| 166 value = ToNumber(value); | 166 value = ToNumber(value); |
| 167 return NUMBER_IS_FINITE(value) ? ToString(value) : "null"; | 167 return JSON_NUMBER_TO_STRING(value); |
| 168 } else if (IS_STRING_WRAPPER(value)) { | 168 } else if (IS_STRING_WRAPPER(value)) { |
| 169 return %QuoteJSONString(ToString(value)); | 169 return %QuoteJSONString(ToString(value)); |
| 170 } else if (IS_BOOLEAN_WRAPPER(value)) { | 170 } else if (IS_BOOLEAN_WRAPPER(value)) { |
| 171 return %_ValueOf(value) ? "true" : "false"; | 171 return %_ValueOf(value) ? "true" : "false"; |
| 172 } else { | 172 } else { |
| 173 return SerializeObject(value, replacer, stack, indent, gap); | 173 return SerializeObject(value, replacer, stack, indent, gap); |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 // Undefined or a callable object. | 176 // Undefined or a callable object. |
| 177 return void 0; | 177 return void 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 196 builder[builder.length - 1] = array_string; | 196 builder[builder.length - 1] = array_string; |
| 197 } else { | 197 } else { |
| 198 builder.push(%QuoteJSONString(val)); | 198 builder.push(%QuoteJSONString(val)); |
| 199 for (var i = 1; i < len; i++) { | 199 for (var i = 1; i < len; i++) { |
| 200 val = value[i]; | 200 val = value[i]; |
| 201 if (IS_STRING(val)) { | 201 if (IS_STRING(val)) { |
| 202 builder.push(%QuoteJSONStringComma(val)); | 202 builder.push(%QuoteJSONStringComma(val)); |
| 203 } else { | 203 } else { |
| 204 builder.push(","); | 204 builder.push(","); |
| 205 var before = builder.length; | 205 var before = builder.length; |
| 206 BasicJSONSerialize(i, value[i], stack, builder); | 206 BasicJSONSerialize(i, val, stack, builder); |
| 207 if (before == builder.length) builder[before - 1] = ",null"; | 207 if (before == builder.length) builder[before - 1] = ",null"; |
| 208 } | 208 } |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 } else if (IS_NUMBER(val)) { | 211 } else if (IS_NUMBER(val)) { |
| 212 // First entry is a number. Remaining entries are likely to be numbers too. | 212 // First entry is a number. Remaining entries are likely to be numbers too. |
| 213 builder.push(NUMBER_IS_FINITE(val) ? %_NumberToString(val) : "null"); | 213 builder.push(JSON_NUMBER_TO_STRING(val)); |
| 214 for (var i = 1; i < len; i++) { | 214 for (var i = 1; i < len; i++) { |
| 215 builder.push(","); | 215 builder.push(","); |
| 216 val = value[i]; | 216 val = value[i]; |
| 217 if (IS_NUMBER(val)) { | 217 if (IS_NUMBER(val)) { |
| 218 builder.push(NUMBER_IS_FINITE(val) | 218 builder.push(JSON_NUMBER_TO_STRING(val)); |
| 219 ? %_NumberToString(val) | |
| 220 : "null"); | |
| 221 } else { | 219 } else { |
| 222 var before = builder.length; | 220 var before = builder.length; |
| 223 BasicJSONSerialize(i, value[i], stack, builder); | 221 BasicJSONSerialize(i, val, stack, builder); |
| 224 if (before == builder.length) builder[before - 1] = ",null"; | 222 if (before == builder.length) builder[before - 1] = ",null"; |
| 225 } | 223 } |
| 226 } | 224 } |
| 227 } else { | 225 } else { |
| 228 var before = builder.length; | 226 var before = builder.length; |
| 229 BasicJSONSerialize(0, val, stack, builder); | 227 BasicJSONSerialize(0, val, stack, builder); |
| 230 if (before == builder.length) builder.push("null"); | 228 if (before == builder.length) builder.push("null"); |
| 231 for (var i = 1; i < len; i++) { | 229 for (var i = 1; i < len; i++) { |
| 232 builder.push(","); | 230 builder.push(","); |
| 233 before = builder.length; | 231 before = builder.length; |
| 234 val = value[i]; | 232 BasicJSONSerialize(i, value[i], stack, builder); |
| 235 BasicJSONSerialize(i, val, stack, builder); | |
| 236 if (before == builder.length) builder[before - 1] = ",null"; | 233 if (before == builder.length) builder[before - 1] = ",null"; |
| 237 } | 234 } |
| 238 } | 235 } |
| 239 stack.pop(); | 236 stack.pop(); |
| 240 builder.push("]"); | 237 builder.push("]"); |
| 241 } | 238 } |
| 242 | 239 |
| 243 | 240 |
| 244 function BasicSerializeObject(value, stack, builder) { | 241 function BasicSerializeObject(value, stack, builder) { |
| 245 if (!%PushIfAbsent(stack, value)) { | 242 if (!%PushIfAbsent(stack, value)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 273 function BasicJSONSerialize(key, value, stack, builder) { | 270 function BasicJSONSerialize(key, value, stack, builder) { |
| 274 if (IS_SPEC_OBJECT(value)) { | 271 if (IS_SPEC_OBJECT(value)) { |
| 275 var toJSON = value.toJSON; | 272 var toJSON = value.toJSON; |
| 276 if (IS_FUNCTION(toJSON)) { | 273 if (IS_FUNCTION(toJSON)) { |
| 277 value = %_CallFunction(value, ToString(key), toJSON); | 274 value = %_CallFunction(value, ToString(key), toJSON); |
| 278 } | 275 } |
| 279 } | 276 } |
| 280 if (IS_STRING(value)) { | 277 if (IS_STRING(value)) { |
| 281 builder.push(%QuoteJSONString(value)); | 278 builder.push(%QuoteJSONString(value)); |
| 282 } else if (IS_NUMBER(value)) { | 279 } else if (IS_NUMBER(value)) { |
| 283 builder.push(NUMBER_IS_FINITE(value) ? %_NumberToString(value) : "null"); | 280 builder.push(JSON_NUMBER_TO_STRING(value)); |
| 284 } else if (IS_BOOLEAN(value)) { | 281 } else if (IS_BOOLEAN(value)) { |
| 285 builder.push(value ? "true" : "false"); | 282 builder.push(value ? "true" : "false"); |
| 286 } else if (IS_NULL(value)) { | 283 } else if (IS_NULL(value)) { |
| 287 builder.push("null"); | 284 builder.push("null"); |
| 288 } else if (IS_SPEC_OBJECT(value) && !(typeof value == "function")) { | 285 } else if (IS_SPEC_OBJECT(value) && !(typeof value == "function")) { |
| 289 // Value is a non-callable object. | 286 // Value is a non-callable object. |
| 290 // Unwrap value if necessary | 287 // Unwrap value if necessary |
| 291 if (IS_NUMBER_WRAPPER(value)) { | 288 if (IS_NUMBER_WRAPPER(value)) { |
| 292 value = ToNumber(value); | 289 value = ToNumber(value); |
| 293 builder.push(NUMBER_IS_FINITE(value) ? %_NumberToString(value) : "null"); | 290 builder.push(JSON_NUMBER_TO_STRING(value)); |
| 294 } else if (IS_STRING_WRAPPER(value)) { | 291 } else if (IS_STRING_WRAPPER(value)) { |
| 295 builder.push(%QuoteJSONString(ToString(value))); | 292 builder.push(%QuoteJSONString(ToString(value))); |
| 296 } else if (IS_BOOLEAN_WRAPPER(value)) { | 293 } else if (IS_BOOLEAN_WRAPPER(value)) { |
| 297 builder.push(%_ValueOf(value) ? "true" : "false"); | 294 builder.push(%_ValueOf(value) ? "true" : "false"); |
| 298 } else if (IS_ARRAY(value)) { | 295 } else if (IS_ARRAY(value)) { |
| 299 BasicSerializeArray(value, stack, builder); | 296 BasicSerializeArray(value, stack, builder); |
| 300 } else { | 297 } else { |
| 301 BasicSerializeObject(value, stack, builder); | 298 BasicSerializeObject(value, stack, builder); |
| 302 } | 299 } |
| 303 } | 300 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 } | 335 } |
| 339 | 336 |
| 340 function SetupJSON() { | 337 function SetupJSON() { |
| 341 InstallFunctions($JSON, DONT_ENUM, $Array( | 338 InstallFunctions($JSON, DONT_ENUM, $Array( |
| 342 "parse", JSONParse, | 339 "parse", JSONParse, |
| 343 "stringify", JSONStringify | 340 "stringify", JSONStringify |
| 344 )); | 341 )); |
| 345 } | 342 } |
| 346 | 343 |
| 347 SetupJSON(); | 344 SetupJSON(); |
| OLD | NEW |