| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 ScopedVector<uc16> smart_chars(this->length()); | 946 ScopedVector<uc16> smart_chars(this->length()); |
| 947 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); | 947 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); |
| 948 ASSERT(memcmp(smart_chars.start(), | 948 ASSERT(memcmp(smart_chars.start(), |
| 949 resource->data(), | 949 resource->data(), |
| 950 resource->length() * sizeof(smart_chars[0])) == 0); | 950 resource->length() * sizeof(smart_chars[0])) == 0); |
| 951 } | 951 } |
| 952 #endif // DEBUG | 952 #endif // DEBUG |
| 953 Heap* heap = GetHeap(); | 953 Heap* heap = GetHeap(); |
| 954 int size = this->Size(); // Byte size of the original string. | 954 int size = this->Size(); // Byte size of the original string. |
| 955 if (size < ExternalString::kSize) { | 955 if (size < ExternalString::kSize) { |
| 956 // The string is too small to fit an external String in its place. This can | |
| 957 // only happen for zero length strings. | |
| 958 return false; | 956 return false; |
| 959 } | 957 } |
| 960 ASSERT(size >= ExternalString::kSize); | 958 ASSERT(size >= ExternalString::kSize); |
| 961 bool is_ascii = this->IsAsciiRepresentation(); | 959 bool is_ascii = this->IsAsciiRepresentation(); |
| 962 bool is_symbol = this->IsSymbol(); | 960 bool is_symbol = this->IsSymbol(); |
| 963 int length = this->length(); | 961 int length = this->length(); |
| 964 int hash_field = this->hash_field(); | 962 int hash_field = this->hash_field(); |
| 965 | 963 |
| 966 // Morph the object to an external string by adjusting the map and | 964 // Morph the object to an external string by adjusting the map and |
| 967 // reinitializing the fields. | 965 // reinitializing the fields. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 ScopedVector<char> smart_chars(this->length()); | 998 ScopedVector<char> smart_chars(this->length()); |
| 1001 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); | 999 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); |
| 1002 ASSERT(memcmp(smart_chars.start(), | 1000 ASSERT(memcmp(smart_chars.start(), |
| 1003 resource->data(), | 1001 resource->data(), |
| 1004 resource->length() * sizeof(smart_chars[0])) == 0); | 1002 resource->length() * sizeof(smart_chars[0])) == 0); |
| 1005 } | 1003 } |
| 1006 #endif // DEBUG | 1004 #endif // DEBUG |
| 1007 Heap* heap = GetHeap(); | 1005 Heap* heap = GetHeap(); |
| 1008 int size = this->Size(); // Byte size of the original string. | 1006 int size = this->Size(); // Byte size of the original string. |
| 1009 if (size < ExternalString::kSize) { | 1007 if (size < ExternalString::kSize) { |
| 1010 // The string is too small to fit an external String in its place. This can | |
| 1011 // only happen for zero length strings. | |
| 1012 return false; | 1008 return false; |
| 1013 } | 1009 } |
| 1014 ASSERT(size >= ExternalString::kSize); | 1010 ASSERT(size >= ExternalString::kSize); |
| 1015 bool is_symbol = this->IsSymbol(); | 1011 bool is_symbol = this->IsSymbol(); |
| 1016 int length = this->length(); | 1012 int length = this->length(); |
| 1017 int hash_field = this->hash_field(); | 1013 int hash_field = this->hash_field(); |
| 1018 | 1014 |
| 1019 // Morph the object to an external string by adjusting the map and | 1015 // Morph the object to an external string by adjusting the map and |
| 1020 // reinitializing the fields. | 1016 // reinitializing the fields. |
| 1021 this->set_map(heap->external_ascii_string_map()); | 1017 this->set_map(heap->external_ascii_string_map()); |
| (...skipping 4761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5783 string = slice->parent(); | 5779 string = slice->parent(); |
| 5784 shape = StringShape(string); | 5780 shape = StringShape(string); |
| 5785 ASSERT(shape.representation_tag() != kConsStringTag && | 5781 ASSERT(shape.representation_tag() != kConsStringTag && |
| 5786 shape.representation_tag() != kSlicedStringTag); | 5782 shape.representation_tag() != kSlicedStringTag); |
| 5787 } | 5783 } |
| 5788 if (shape.encoding_tag() == kAsciiStringTag) { | 5784 if (shape.encoding_tag() == kAsciiStringTag) { |
| 5789 const char* start; | 5785 const char* start; |
| 5790 if (shape.representation_tag() == kSeqStringTag) { | 5786 if (shape.representation_tag() == kSeqStringTag) { |
| 5791 start = SeqAsciiString::cast(string)->GetChars(); | 5787 start = SeqAsciiString::cast(string)->GetChars(); |
| 5792 } else { | 5788 } else { |
| 5793 start = ExternalAsciiString::cast(string)->resource()->data(); | 5789 start = ExternalAsciiString::cast(string)->GetChars(); |
| 5794 } | 5790 } |
| 5795 return FlatContent(Vector<const char>(start + offset, length)); | 5791 return FlatContent(Vector<const char>(start + offset, length)); |
| 5796 } else { | 5792 } else { |
| 5797 ASSERT(shape.encoding_tag() == kTwoByteStringTag); | 5793 ASSERT(shape.encoding_tag() == kTwoByteStringTag); |
| 5798 const uc16* start; | 5794 const uc16* start; |
| 5799 if (shape.representation_tag() == kSeqStringTag) { | 5795 if (shape.representation_tag() == kSeqStringTag) { |
| 5800 start = SeqTwoByteString::cast(string)->GetChars(); | 5796 start = SeqTwoByteString::cast(string)->GetChars(); |
| 5801 } else { | 5797 } else { |
| 5802 start = ExternalTwoByteString::cast(string)->resource()->data(); | 5798 start = ExternalTwoByteString::cast(string)->GetChars(); |
| 5803 } | 5799 } |
| 5804 return FlatContent(Vector<const uc16>(start + offset, length)); | 5800 return FlatContent(Vector<const uc16>(start + offset, length)); |
| 5805 } | 5801 } |
| 5806 } | 5802 } |
| 5807 | 5803 |
| 5808 | 5804 |
| 5809 SmartArrayPointer<char> String::ToCString(AllowNullsFlag allow_nulls, | 5805 SmartArrayPointer<char> String::ToCString(AllowNullsFlag allow_nulls, |
| 5810 RobustnessFlag robust_flag, | 5806 RobustnessFlag robust_flag, |
| 5811 int offset, | 5807 int offset, |
| 5812 int length, | 5808 int length, |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6025 rbb, | 6021 rbb, |
| 6026 &offset, | 6022 &offset, |
| 6027 max_chars > rbb->capacity ? rbb->capacity : max_chars); | 6023 max_chars > rbb->capacity ? rbb->capacity : max_chars); |
| 6028 *offset_ptr = offset + offset_correction; | 6024 *offset_ptr = offset + offset_correction; |
| 6029 return rbb->util_buffer; | 6025 return rbb->util_buffer; |
| 6030 } | 6026 } |
| 6031 } | 6027 } |
| 6032 } | 6028 } |
| 6033 | 6029 |
| 6034 | 6030 |
| 6035 uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) { | |
| 6036 ASSERT(index >= 0 && index < length()); | |
| 6037 return resource()->data()[index]; | |
| 6038 } | |
| 6039 | |
| 6040 | |
| 6041 const unibrow::byte* ExternalAsciiString::ExternalAsciiStringReadBlock( | 6031 const unibrow::byte* ExternalAsciiString::ExternalAsciiStringReadBlock( |
| 6042 unsigned* remaining, | 6032 unsigned* remaining, |
| 6043 unsigned* offset_ptr, | 6033 unsigned* offset_ptr, |
| 6044 unsigned max_chars) { | 6034 unsigned max_chars) { |
| 6045 // Cast const char* to unibrow::byte* (signedness difference). | 6035 // Cast const char* to unibrow::byte* (signedness difference). |
| 6046 const unibrow::byte* b = | 6036 const unibrow::byte* b = |
| 6047 reinterpret_cast<const unibrow::byte*>(resource()->data()) + *offset_ptr; | 6037 reinterpret_cast<const unibrow::byte*>(GetChars()) + *offset_ptr; |
| 6048 *remaining = max_chars; | 6038 *remaining = max_chars; |
| 6049 *offset_ptr += max_chars; | 6039 *offset_ptr += max_chars; |
| 6050 return b; | 6040 return b; |
| 6051 } | 6041 } |
| 6052 | 6042 |
| 6053 | 6043 |
| 6054 const uc16* ExternalTwoByteString::ExternalTwoByteStringGetData( | |
| 6055 unsigned start) { | |
| 6056 return resource()->data() + start; | |
| 6057 } | |
| 6058 | |
| 6059 | |
| 6060 uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) { | |
| 6061 ASSERT(index >= 0 && index < length()); | |
| 6062 return resource()->data()[index]; | |
| 6063 } | |
| 6064 | |
| 6065 | |
| 6066 void ExternalTwoByteString::ExternalTwoByteStringReadBlockIntoBuffer( | 6044 void ExternalTwoByteString::ExternalTwoByteStringReadBlockIntoBuffer( |
| 6067 ReadBlockBuffer* rbb, | 6045 ReadBlockBuffer* rbb, |
| 6068 unsigned* offset_ptr, | 6046 unsigned* offset_ptr, |
| 6069 unsigned max_chars) { | 6047 unsigned max_chars) { |
| 6070 unsigned chars_read = 0; | 6048 unsigned chars_read = 0; |
| 6071 unsigned offset = *offset_ptr; | 6049 unsigned offset = *offset_ptr; |
| 6072 const uint16_t* data = resource()->data(); | 6050 const uint16_t* data = GetChars(); |
| 6073 while (chars_read < max_chars) { | 6051 while (chars_read < max_chars) { |
| 6074 uint16_t c = data[offset]; | 6052 uint16_t c = data[offset]; |
| 6075 if (c <= kMaxAsciiCharCode) { | 6053 if (c <= kMaxAsciiCharCode) { |
| 6076 // Fast case for ASCII characters. Cursor is an input output argument. | 6054 // Fast case for ASCII characters. Cursor is an input output argument. |
| 6077 if (!unibrow::CharacterStream::EncodeAsciiCharacter(c, | 6055 if (!unibrow::CharacterStream::EncodeAsciiCharacter(c, |
| 6078 rbb->util_buffer, | 6056 rbb->util_buffer, |
| 6079 rbb->capacity, | 6057 rbb->capacity, |
| 6080 rbb->cursor)) | 6058 rbb->cursor)) |
| 6081 break; | 6059 break; |
| 6082 } else { | 6060 } else { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 6108 rbb->cursor += max_chars; | 6086 rbb->cursor += max_chars; |
| 6109 } | 6087 } |
| 6110 | 6088 |
| 6111 | 6089 |
| 6112 void ExternalAsciiString::ExternalAsciiStringReadBlockIntoBuffer( | 6090 void ExternalAsciiString::ExternalAsciiStringReadBlockIntoBuffer( |
| 6113 ReadBlockBuffer* rbb, | 6091 ReadBlockBuffer* rbb, |
| 6114 unsigned* offset_ptr, | 6092 unsigned* offset_ptr, |
| 6115 unsigned max_chars) { | 6093 unsigned max_chars) { |
| 6116 unsigned capacity = rbb->capacity - rbb->cursor; | 6094 unsigned capacity = rbb->capacity - rbb->cursor; |
| 6117 if (max_chars > capacity) max_chars = capacity; | 6095 if (max_chars > capacity) max_chars = capacity; |
| 6118 memcpy(rbb->util_buffer + rbb->cursor, | 6096 memcpy(rbb->util_buffer + rbb->cursor, GetChars() + *offset_ptr, max_chars); |
| 6119 resource()->data() + *offset_ptr, | |
| 6120 max_chars); | |
| 6121 rbb->remaining += max_chars; | 6097 rbb->remaining += max_chars; |
| 6122 *offset_ptr += max_chars; | 6098 *offset_ptr += max_chars; |
| 6123 rbb->cursor += max_chars; | 6099 rbb->cursor += max_chars; |
| 6124 } | 6100 } |
| 6125 | 6101 |
| 6126 | 6102 |
| 6127 // This method determines the type of string involved and then copies | 6103 // This method determines the type of string involved and then copies |
| 6128 // a whole chunk of characters into a buffer, or returns a pointer to a buffer | 6104 // a whole chunk of characters into a buffer, or returns a pointer to a buffer |
| 6129 // where they can be found. The pointer is not necessarily valid across a GC | 6105 // where they can be found. The pointer is not necessarily valid across a GC |
| 6130 // (see AsciiStringReadBlock). | 6106 // (see AsciiStringReadBlock). |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6552 int f, | 6528 int f, |
| 6553 int t) { | 6529 int t) { |
| 6554 String* source = src; | 6530 String* source = src; |
| 6555 int from = f; | 6531 int from = f; |
| 6556 int to = t; | 6532 int to = t; |
| 6557 while (true) { | 6533 while (true) { |
| 6558 ASSERT(0 <= from && from <= to && to <= source->length()); | 6534 ASSERT(0 <= from && from <= to && to <= source->length()); |
| 6559 switch (StringShape(source).full_representation_tag()) { | 6535 switch (StringShape(source).full_representation_tag()) { |
| 6560 case kAsciiStringTag | kExternalStringTag: { | 6536 case kAsciiStringTag | kExternalStringTag: { |
| 6561 CopyChars(sink, | 6537 CopyChars(sink, |
| 6562 ExternalAsciiString::cast(source)->resource()->data() + from, | 6538 ExternalAsciiString::cast(source)->GetChars() + from, |
| 6563 to - from); | 6539 to - from); |
| 6564 return; | 6540 return; |
| 6565 } | 6541 } |
| 6566 case kTwoByteStringTag | kExternalStringTag: { | 6542 case kTwoByteStringTag | kExternalStringTag: { |
| 6567 const uc16* data = | 6543 const uc16* data = |
| 6568 ExternalTwoByteString::cast(source)->resource()->data(); | 6544 ExternalTwoByteString::cast(source)->GetChars(); |
| 6569 CopyChars(sink, | 6545 CopyChars(sink, |
| 6570 data + from, | 6546 data + from, |
| 6571 to - from); | 6547 to - from); |
| 6572 return; | 6548 return; |
| 6573 } | 6549 } |
| 6574 case kAsciiStringTag | kSeqStringTag: { | 6550 case kAsciiStringTag | kSeqStringTag: { |
| 6575 CopyChars(sink, | 6551 CopyChars(sink, |
| 6576 SeqAsciiString::cast(source)->GetChars() + from, | 6552 SeqAsciiString::cast(source)->GetChars() + from, |
| 6577 to - from); | 6553 to - from); |
| 6578 return; | 6554 return; |
| (...skipping 3400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9979 return NumberOfLocalProperties(static_cast<PropertyAttributes>(DONT_ENUM)); | 9955 return NumberOfLocalProperties(static_cast<PropertyAttributes>(DONT_ENUM)); |
| 9980 } | 9956 } |
| 9981 | 9957 |
| 9982 | 9958 |
| 9983 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { | 9959 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { |
| 9984 Object* temp = get(i); | 9960 Object* temp = get(i); |
| 9985 set(i, get(j)); | 9961 set(i, get(j)); |
| 9986 set(j, temp); | 9962 set(j, temp); |
| 9987 if (this != numbers) { | 9963 if (this != numbers) { |
| 9988 temp = numbers->get(i); | 9964 temp = numbers->get(i); |
| 9989 numbers->set(i, numbers->get(j)); | 9965 numbers->set(i, Smi::cast(numbers->get(j))); |
| 9990 numbers->set(j, temp); | 9966 numbers->set(j, Smi::cast(temp)); |
| 9991 } | 9967 } |
| 9992 } | 9968 } |
| 9993 | 9969 |
| 9994 | 9970 |
| 9995 static void InsertionSortPairs(FixedArray* content, | 9971 static void InsertionSortPairs(FixedArray* content, |
| 9996 FixedArray* numbers, | 9972 FixedArray* numbers, |
| 9997 int len) { | 9973 int len) { |
| 9998 for (int i = 1; i < len; i++) { | 9974 for (int i = 1; i < len; i++) { |
| 9999 int j = i; | 9975 int j = i; |
| 10000 while (j > 0 && | 9976 while (j > 0 && |
| (...skipping 2538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12539 if (break_point_objects()->IsUndefined()) return 0; | 12515 if (break_point_objects()->IsUndefined()) return 0; |
| 12540 // Single break point. | 12516 // Single break point. |
| 12541 if (!break_point_objects()->IsFixedArray()) return 1; | 12517 if (!break_point_objects()->IsFixedArray()) return 1; |
| 12542 // Multiple break points. | 12518 // Multiple break points. |
| 12543 return FixedArray::cast(break_point_objects())->length(); | 12519 return FixedArray::cast(break_point_objects())->length(); |
| 12544 } | 12520 } |
| 12545 #endif // ENABLE_DEBUGGER_SUPPORT | 12521 #endif // ENABLE_DEBUGGER_SUPPORT |
| 12546 | 12522 |
| 12547 | 12523 |
| 12548 } } // namespace v8::internal | 12524 } } // namespace v8::internal |
| OLD | NEW |