| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_JSON_STRINGIFIER_H_ | 5 #ifndef V8_JSON_STRINGIFIER_H_ |
| 6 #define V8_JSON_STRINGIFIER_H_ | 6 #define V8_JSON_STRINGIFIER_H_ |
| 7 | 7 |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/lookup.h" | 9 #include "src/lookup.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 Result SerializeDouble(double number); | 75 Result SerializeDouble(double number); |
| 76 INLINE(Result SerializeHeapNumber(Handle<HeapNumber> object)) { | 76 INLINE(Result SerializeHeapNumber(Handle<HeapNumber> object)) { |
| 77 return SerializeDouble(object->value()); | 77 return SerializeDouble(object->value()); |
| 78 } | 78 } |
| 79 | 79 |
| 80 Result SerializeJSValue(Handle<JSValue> object); | 80 Result SerializeJSValue(Handle<JSValue> object); |
| 81 | 81 |
| 82 INLINE(Result SerializeJSArray(Handle<JSArray> object)); | 82 INLINE(Result SerializeJSArray(Handle<JSArray> object)); |
| 83 INLINE(Result SerializeJSObject(Handle<JSObject> object)); | 83 INLINE(Result SerializeJSObject(Handle<JSObject> object)); |
| 84 | 84 |
| 85 Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t length); | 85 Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t start, |
| 86 uint32_t length); |
| 86 | 87 |
| 87 void SerializeString(Handle<String> object); | 88 void SerializeString(Handle<String> object); |
| 88 | 89 |
| 89 template <typename SrcChar, typename DestChar> | 90 template <typename SrcChar, typename DestChar> |
| 90 INLINE(static void SerializeStringUnchecked_( | 91 INLINE(static void SerializeStringUnchecked_( |
| 91 Vector<const SrcChar> src, | 92 Vector<const SrcChar> src, |
| 92 IncrementalStringBuilder::NoExtend<DestChar>* dest)); | 93 IncrementalStringBuilder::NoExtend<DestChar>* dest)); |
| 93 | 94 |
| 94 template <typename SrcChar, typename DestChar> | 95 template <typename SrcChar, typename DestChar> |
| 95 INLINE(void SerializeString_(Handle<String> string)); | 96 INLINE(void SerializeString_(Handle<String> string)); |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( | 430 BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
| 430 Handle<JSArray> object) { | 431 Handle<JSArray> object) { |
| 431 HandleScope handle_scope(isolate_); | 432 HandleScope handle_scope(isolate_); |
| 432 Result stack_push = StackPush(object); | 433 Result stack_push = StackPush(object); |
| 433 if (stack_push != SUCCESS) return stack_push; | 434 if (stack_push != SUCCESS) return stack_push; |
| 434 uint32_t length = 0; | 435 uint32_t length = 0; |
| 435 CHECK(object->length()->ToArrayLength(&length)); | 436 CHECK(object->length()->ToArrayLength(&length)); |
| 436 builder_.AppendCharacter('['); | 437 builder_.AppendCharacter('['); |
| 437 switch (object->GetElementsKind()) { | 438 switch (object->GetElementsKind()) { |
| 438 case FAST_SMI_ELEMENTS: { | 439 case FAST_SMI_ELEMENTS: { |
| 439 Handle<FixedArray> elements( | 440 Handle<FixedArray> elements(FixedArray::cast(object->elements()), |
| 440 FixedArray::cast(object->elements()), isolate_); | 441 isolate_); |
| 441 for (uint32_t i = 0; i < length; i++) { | 442 for (uint32_t i = 0; i < length; i++) { |
| 442 if (i > 0) builder_.AppendCharacter(','); | 443 if (i > 0) builder_.AppendCharacter(','); |
| 443 SerializeSmi(Smi::cast(elements->get(i))); | 444 SerializeSmi(Smi::cast(elements->get(i))); |
| 444 } | 445 } |
| 445 break; | 446 break; |
| 446 } | 447 } |
| 447 case FAST_DOUBLE_ELEMENTS: { | 448 case FAST_DOUBLE_ELEMENTS: { |
| 448 // Empty array is FixedArray but not FixedDoubleArray. | 449 // Empty array is FixedArray but not FixedDoubleArray. |
| 449 if (length == 0) break; | 450 if (length == 0) break; |
| 450 Handle<FixedDoubleArray> elements( | 451 Handle<FixedDoubleArray> elements( |
| 451 FixedDoubleArray::cast(object->elements()), isolate_); | 452 FixedDoubleArray::cast(object->elements()), isolate_); |
| 452 for (uint32_t i = 0; i < length; i++) { | 453 for (uint32_t i = 0; i < length; i++) { |
| 453 if (i > 0) builder_.AppendCharacter(','); | 454 if (i > 0) builder_.AppendCharacter(','); |
| 454 SerializeDouble(elements->get_scalar(i)); | 455 SerializeDouble(elements->get_scalar(i)); |
| 455 } | 456 } |
| 456 break; | 457 break; |
| 457 } | 458 } |
| 458 case FAST_ELEMENTS: { | 459 case FAST_ELEMENTS: { |
| 459 Handle<FixedArray> elements( | 460 Handle<Object> old_length(object->length(), isolate_); |
| 460 FixedArray::cast(object->elements()), isolate_); | |
| 461 for (uint32_t i = 0; i < length; i++) { | 461 for (uint32_t i = 0; i < length; i++) { |
| 462 if (object->length() != *old_length || |
| 463 object->GetElementsKind() != FAST_ELEMENTS) { |
| 464 Result result = SerializeJSArraySlow(object, i, length); |
| 465 if (result != SUCCESS) return result; |
| 466 break; |
| 467 } |
| 462 if (i > 0) builder_.AppendCharacter(','); | 468 if (i > 0) builder_.AppendCharacter(','); |
| 463 Result result = | 469 Result result = SerializeElement( |
| 464 SerializeElement(isolate_, | 470 isolate_, |
| 465 Handle<Object>(elements->get(i), isolate_), | 471 Handle<Object>(FixedArray::cast(object->elements())->get(i), |
| 466 i); | 472 isolate_), |
| 473 i); |
| 467 if (result == SUCCESS) continue; | 474 if (result == SUCCESS) continue; |
| 468 if (result == UNCHANGED) { | 475 if (result == UNCHANGED) { |
| 469 builder_.AppendCString("null"); | 476 builder_.AppendCString("null"); |
| 470 } else { | 477 } else { |
| 471 return result; | 478 return result; |
| 472 } | 479 } |
| 473 } | 480 } |
| 474 break; | 481 break; |
| 475 } | 482 } |
| 476 // TODO(yangguo): The FAST_HOLEY_* cases could be handled in a faster way. | 483 // The FAST_HOLEY_* cases could be handled in a faster way. They resemble |
| 477 // They resemble the non-holey cases except that a prototype chain lookup | 484 // the non-holey cases except that a lookup is necessary for holes. |
| 478 // is necessary for holes. | |
| 479 default: { | 485 default: { |
| 480 Result result = SerializeJSArraySlow(object, length); | 486 Result result = SerializeJSArraySlow(object, 0, length); |
| 481 if (result != SUCCESS) return result; | 487 if (result != SUCCESS) return result; |
| 482 break; | 488 break; |
| 483 } | 489 } |
| 484 } | 490 } |
| 485 builder_.AppendCharacter(']'); | 491 builder_.AppendCharacter(']'); |
| 486 StackPop(); | 492 StackPop(); |
| 487 return SUCCESS; | 493 return SUCCESS; |
| 488 } | 494 } |
| 489 | 495 |
| 490 | 496 |
| 491 BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow( | 497 BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow( |
| 492 Handle<JSArray> object, uint32_t length) { | 498 Handle<JSArray> object, uint32_t start, uint32_t length) { |
| 493 for (uint32_t i = 0; i < length; i++) { | 499 for (uint32_t i = start; i < length; i++) { |
| 494 if (i > 0) builder_.AppendCharacter(','); | 500 if (i > 0) builder_.AppendCharacter(','); |
| 495 Handle<Object> element; | 501 Handle<Object> element; |
| 496 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 502 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 497 isolate_, element, | 503 isolate_, element, |
| 498 Object::GetElement(isolate_, object, i), | 504 Object::GetElement(isolate_, object, i), |
| 499 EXCEPTION); | 505 EXCEPTION); |
| 500 if (element->IsUndefined()) { | 506 if (element->IsUndefined()) { |
| 501 builder_.AppendCString("null"); | 507 builder_.AppendCString("null"); |
| 502 } else { | 508 } else { |
| 503 Result result = SerializeElement(isolate_, element, i); | 509 Result result = SerializeElement(isolate_, element, i); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 SerializeString_<uint8_t, uc16>(object); | 677 SerializeString_<uint8_t, uc16>(object); |
| 672 } else { | 678 } else { |
| 673 SerializeString_<uc16, uc16>(object); | 679 SerializeString_<uc16, uc16>(object); |
| 674 } | 680 } |
| 675 } | 681 } |
| 676 } | 682 } |
| 677 | 683 |
| 678 } } // namespace v8::internal | 684 } } // namespace v8::internal |
| 679 | 685 |
| 680 #endif // V8_JSON_STRINGIFIER_H_ | 686 #endif // V8_JSON_STRINGIFIER_H_ |
| OLD | NEW |