OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 3993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4004 static inline bool EndsWithSurrogate(uint8_t state) { | 4004 static inline bool EndsWithSurrogate(uint8_t state) { |
4005 return state & kEndsWithLeadingSurrogate; | 4005 return state & kEndsWithLeadingSurrogate; |
4006 } | 4006 } |
4007 | 4007 |
4008 static inline bool StartsWithSurrogate(uint8_t state) { | 4008 static inline bool StartsWithSurrogate(uint8_t state) { |
4009 return state & kStartsWithTrailingSurrogate; | 4009 return state & kStartsWithTrailingSurrogate; |
4010 } | 4010 } |
4011 | 4011 |
4012 class Visitor { | 4012 class Visitor { |
4013 public: | 4013 public: |
4014 explicit Visitor() | 4014 inline explicit Visitor() |
4015 : utf8_length_(0), | 4015 : utf8_length_(0), |
4016 state_(kInitialState) {} | 4016 state_(kInitialState) {} |
4017 | 4017 |
4018 template<typename Char> | 4018 void VisitOneByteString(const uint8_t* chars, int length) { |
4019 inline void Visit(const Char* chars, int length) { | 4019 int utf8_length = 0; |
| 4020 // Add in length 1 for each non-ASCII character. |
| 4021 for (int i = 0; i < length; i++) { |
| 4022 utf8_length += *chars++ >> 7; |
| 4023 } |
| 4024 // Add in length 1 for each character. |
| 4025 utf8_length_ = utf8_length + length; |
| 4026 state_ = kInitialState; |
| 4027 } |
| 4028 |
| 4029 void VisitTwoByteString(const uint16_t* chars, int length) { |
4020 int utf8_length = 0; | 4030 int utf8_length = 0; |
4021 int last_character = unibrow::Utf16::kNoPreviousCharacter; | 4031 int last_character = unibrow::Utf16::kNoPreviousCharacter; |
4022 for (int i = 0; i < length; i++) { | 4032 for (int i = 0; i < length; i++) { |
4023 uint16_t c = chars[i]; | 4033 uint16_t c = chars[i]; |
4024 utf8_length += unibrow::Utf8::Length(c, last_character); | 4034 utf8_length += unibrow::Utf8::Length(c, last_character); |
4025 if (sizeof(Char) > 1) { | 4035 last_character = c; |
4026 last_character = c; | |
4027 } | |
4028 } | 4036 } |
4029 utf8_length_ = utf8_length; | 4037 utf8_length_ = utf8_length; |
4030 } | |
4031 | |
4032 void VisitOneByteString(const uint8_t* chars, int length) { | |
4033 Visit(chars, length); | |
4034 state_ = kInitialState; | |
4035 } | |
4036 | |
4037 void VisitTwoByteString(const uint16_t* chars, int length) { | |
4038 Visit(chars, length); | |
4039 uint8_t state = 0; | 4038 uint8_t state = 0; |
4040 if (unibrow::Utf16::IsTrailSurrogate(chars[0])) { | 4039 if (unibrow::Utf16::IsTrailSurrogate(chars[0])) { |
4041 state |= kStartsWithTrailingSurrogate; | 4040 state |= kStartsWithTrailingSurrogate; |
4042 } | 4041 } |
4043 if (unibrow::Utf16::IsLeadSurrogate(chars[length-1])) { | 4042 if (unibrow::Utf16::IsLeadSurrogate(chars[length-1])) { |
4044 state |= kEndsWithLeadingSurrogate; | 4043 state |= kEndsWithLeadingSurrogate; |
4045 } | 4044 } |
4046 state_ = state; | 4045 state_ = state; |
4047 } | 4046 } |
4048 | 4047 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4125 Visitor::VisitFlat(left, &leaf_length, &left_leaf_state); | 4124 Visitor::VisitFlat(left, &leaf_length, &left_leaf_state); |
4126 if (left_as_cons == NULL) { | 4125 if (left_as_cons == NULL) { |
4127 total_length += leaf_length; | 4126 total_length += leaf_length; |
4128 MergeLeafLeft(&total_length, &state, left_leaf_state); | 4127 MergeLeafLeft(&total_length, &state, left_leaf_state); |
4129 } | 4128 } |
4130 ConsString* right_as_cons = | 4129 ConsString* right_as_cons = |
4131 Visitor::VisitFlat(right, &leaf_length, &right_leaf_state); | 4130 Visitor::VisitFlat(right, &leaf_length, &right_leaf_state); |
4132 if (right_as_cons == NULL) { | 4131 if (right_as_cons == NULL) { |
4133 total_length += leaf_length; | 4132 total_length += leaf_length; |
4134 MergeLeafRight(&total_length, &state, right_leaf_state); | 4133 MergeLeafRight(&total_length, &state, right_leaf_state); |
4135 // Terminal node. | 4134 if (left_as_cons != NULL) { |
4136 if (left_as_cons == NULL) { | 4135 // 1 Leaf node. Descend in place. |
| 4136 current = left_as_cons; |
| 4137 continue; |
| 4138 } else { |
| 4139 // Terminal node. |
4137 MergeTerminal(&total_length, state, state_out); | 4140 MergeTerminal(&total_length, state, state_out); |
4138 return total_length; | 4141 return total_length; |
4139 } | 4142 } |
4140 } else if (left_as_cons != NULL) { | 4143 } else if (left_as_cons == NULL) { |
4141 // Both strings are ConsStrings. | 4144 // 1 Leaf node. Descend in place. |
4142 // Recurse on smallest. | 4145 current = right_as_cons; |
4143 if (left->length() < right->length()) { | 4146 continue; |
4144 total_length += Calculate(left_as_cons, &left_leaf_state); | |
4145 MergeLeafLeft(&total_length, &state, left_leaf_state); | |
4146 current = right_as_cons; | |
4147 continue; | |
4148 } else { | |
4149 total_length += Calculate(right_as_cons, &right_leaf_state); | |
4150 MergeLeafRight(&total_length, &state, right_leaf_state); | |
4151 current = left_as_cons; | |
4152 continue; | |
4153 } | |
4154 } | 4147 } |
4155 // 1 leaf node. Do in place descent. | 4148 // Both strings are ConsStrings. |
4156 if (left_as_cons != NULL) { | 4149 // Recurse on smallest. |
| 4150 if (left->length() < right->length()) { |
| 4151 total_length += Calculate(left_as_cons, &left_leaf_state); |
| 4152 MergeLeafLeft(&total_length, &state, left_leaf_state); |
| 4153 current = right_as_cons; |
| 4154 } else { |
| 4155 total_length += Calculate(right_as_cons, &right_leaf_state); |
| 4156 MergeLeafRight(&total_length, &state, right_leaf_state); |
4157 current = left_as_cons; | 4157 current = left_as_cons; |
4158 } else { | |
4159 ASSERT(right_as_cons != NULL); | |
4160 current = right_as_cons; | |
4161 } | 4158 } |
4162 } | 4159 } |
4163 UNREACHABLE(); | 4160 UNREACHABLE(); |
4164 return 0; | 4161 return 0; |
4165 } | 4162 } |
4166 | 4163 |
4167 static inline int Calculate(i::ConsString* current) { | 4164 static inline int Calculate(i::ConsString* current) { |
4168 uint8_t state = kInitialState; | 4165 uint8_t state = kInitialState; |
4169 return Calculate(current, &state); | 4166 return Calculate(current, &state); |
4170 } | 4167 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4260 (remaining_capacity - max_size_per_char)/max_size_per_char; | 4257 (remaining_capacity - max_size_per_char)/max_size_per_char; |
4261 // Need to drop into slow loop. | 4258 // Need to drop into slow loop. |
4262 if (writable_length <= 0) break; | 4259 if (writable_length <= 0) break; |
4263 fast_length = i + writable_length; | 4260 fast_length = i + writable_length; |
4264 if (fast_length > length) fast_length = length; | 4261 if (fast_length > length) fast_length = length; |
4265 } | 4262 } |
4266 // Write the characters to the stream. | 4263 // Write the characters to the stream. |
4267 if (sizeof(Char) == 1) { | 4264 if (sizeof(Char) == 1) { |
4268 for (; i < fast_length; i++) { | 4265 for (; i < fast_length; i++) { |
4269 buffer += | 4266 buffer += |
4270 Utf8::Encode(buffer, *chars++, Utf16::kNoPreviousCharacter); | 4267 Utf8::EncodeOneByte(buffer, static_cast<uint8_t>(*chars++)); |
4271 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); | 4268 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); |
4272 } | 4269 } |
4273 } else { | 4270 } else { |
4274 for (; i < fast_length; i++) { | 4271 for (; i < fast_length; i++) { |
4275 uint16_t character = *chars++; | 4272 uint16_t character = *chars++; |
4276 buffer += Utf8::Encode(buffer, character, last_character); | 4273 buffer += Utf8::Encode(buffer, character, last_character); |
4277 last_character = character; | 4274 last_character = character; |
4278 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); | 4275 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); |
4279 } | 4276 } |
4280 } | 4277 } |
(...skipping 2783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7064 | 7061 |
7065 v->VisitPointers(blocks_.first(), first_block_limit_); | 7062 v->VisitPointers(blocks_.first(), first_block_limit_); |
7066 | 7063 |
7067 for (int i = 1; i < blocks_.length(); i++) { | 7064 for (int i = 1; i < blocks_.length(); i++) { |
7068 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); | 7065 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); |
7069 } | 7066 } |
7070 } | 7067 } |
7071 | 7068 |
7072 | 7069 |
7073 } } // namespace v8::internal | 7070 } } // namespace v8::internal |
OLD | NEW |