OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 13 matching lines...) Expand all Loading... |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "config.h" | 31 #include "config.h" |
32 #include "platform/JSONValues.h" | 32 #include "platform/JSONValues.h" |
33 | 33 |
34 #include "wtf/DecimalNumber.h" | 34 #include "platform/Decimal.h" |
35 #include "wtf/dtoa.h" | 35 #include "wtf/MathExtras.h" |
36 #include "wtf/text/StringBuilder.h" | 36 #include "wtf/text/StringBuilder.h" |
37 | 37 |
38 namespace WebCore { | 38 namespace WebCore { |
39 | 39 |
40 namespace { | 40 namespace { |
41 | 41 |
42 const char* const nullString = "null"; | 42 const char* const nullString = "null"; |
43 const char* const trueString = "true"; | 43 const char* const trueString = "true"; |
44 const char* const falseString = "false"; | 44 const char* const falseString = "false"; |
45 | 45 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 | 207 |
208 void JSONBasicValue::writeJSON(StringBuilder* output) const | 208 void JSONBasicValue::writeJSON(StringBuilder* output) const |
209 { | 209 { |
210 ASSERT(type() == TypeBoolean || type() == TypeNumber); | 210 ASSERT(type() == TypeBoolean || type() == TypeNumber); |
211 if (type() == TypeBoolean) { | 211 if (type() == TypeBoolean) { |
212 if (m_boolValue) | 212 if (m_boolValue) |
213 output->append(trueString, 4); | 213 output->append(trueString, 4); |
214 else | 214 else |
215 output->append(falseString, 5); | 215 output->append(falseString, 5); |
216 } else if (type() == TypeNumber) { | 216 } else if (type() == TypeNumber) { |
217 NumberToLStringBuffer buffer; | |
218 if (!std::isfinite(m_doubleValue)) { | 217 if (!std::isfinite(m_doubleValue)) { |
219 output->append(nullString, 4); | 218 output->append(nullString, 4); |
220 return; | 219 return; |
221 } | 220 } |
222 DecimalNumber decimal = m_doubleValue; | 221 output->append(Decimal::fromDouble(m_doubleValue).toString()); |
223 unsigned length = 0; | |
224 if (decimal.bufferLengthForStringDecimal() > WTF::NumberToStringBufferLe
ngth) { | |
225 // Not enough room for decimal. Use exponential format. | |
226 if (decimal.bufferLengthForStringExponential() > WTF::NumberToString
BufferLength) { | |
227 // Fallback for an abnormal case if it's too little even for exp
onential. | |
228 output->append("NaN", 3); | |
229 return; | |
230 } | |
231 length = decimal.toStringExponential(buffer, WTF::NumberToStringBuff
erLength); | |
232 } else { | |
233 length = decimal.toStringDecimal(buffer, WTF::NumberToStringBufferLe
ngth); | |
234 } | |
235 output->append(buffer, length); | |
236 } | 222 } |
237 } | 223 } |
238 | 224 |
239 bool JSONString::asString(String* output) const | 225 bool JSONString::asString(String* output) const |
240 { | 226 { |
241 *output = m_stringValue; | 227 *output = m_stringValue; |
242 return true; | 228 return true; |
243 } | 229 } |
244 | 230 |
245 void JSONString::writeJSON(StringBuilder* output) const | 231 void JSONString::writeJSON(StringBuilder* output) const |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 m_data.append(value); | 447 m_data.append(value); |
462 } | 448 } |
463 | 449 |
464 PassRefPtr<JSONValue> JSONArrayBase::get(size_t index) | 450 PassRefPtr<JSONValue> JSONArrayBase::get(size_t index) |
465 { | 451 { |
466 ASSERT_WITH_SECURITY_IMPLICATION(index < m_data.size()); | 452 ASSERT_WITH_SECURITY_IMPLICATION(index < m_data.size()); |
467 return m_data[index]; | 453 return m_data[index]; |
468 } | 454 } |
469 | 455 |
470 } // namespace WebCore | 456 } // namespace WebCore |
OLD | NEW |