| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 4ec3936be557e3d9df1d7ace82417e99316b2453..bd5518f75f03a02c27ed59166e8b96cd3a9fb039 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -4011,31 +4011,30 @@ class Utf8LengthHelper : public i::AllStatic {
|
|
|
| class Visitor {
|
| public:
|
| - explicit Visitor()
|
| + inline explicit Visitor()
|
| : utf8_length_(0),
|
| state_(kInitialState) {}
|
|
|
| - template<typename Char>
|
| - inline void Visit(const Char* chars, int length) {
|
| + void VisitOneByteString(const uint8_t* chars, int length) {
|
| int utf8_length = 0;
|
| - int last_character = unibrow::Utf16::kNoPreviousCharacter;
|
| + // Add in length 1 for each non-ASCII character.
|
| for (int i = 0; i < length; i++) {
|
| - uint16_t c = chars[i];
|
| - utf8_length += unibrow::Utf8::Length(c, last_character);
|
| - if (sizeof(Char) > 1) {
|
| - last_character = c;
|
| - }
|
| + utf8_length += *chars++ >> 7;
|
| }
|
| - utf8_length_ = utf8_length;
|
| - }
|
| -
|
| - void VisitOneByteString(const uint8_t* chars, int length) {
|
| - Visit(chars, length);
|
| + // Add in length 1 for each character.
|
| + utf8_length_ = utf8_length + length;
|
| state_ = kInitialState;
|
| }
|
|
|
| void VisitTwoByteString(const uint16_t* chars, int length) {
|
| - Visit(chars, length);
|
| + int utf8_length = 0;
|
| + int last_character = unibrow::Utf16::kNoPreviousCharacter;
|
| + for (int i = 0; i < length; i++) {
|
| + uint16_t c = chars[i];
|
| + utf8_length += unibrow::Utf8::Length(c, last_character);
|
| + last_character = c;
|
| + }
|
| + utf8_length_ = utf8_length;
|
| uint8_t state = 0;
|
| if (unibrow::Utf16::IsTrailSurrogate(chars[0])) {
|
| state |= kStartsWithTrailingSurrogate;
|
| @@ -4132,32 +4131,30 @@ class Utf8LengthHelper : public i::AllStatic {
|
| if (right_as_cons == NULL) {
|
| total_length += leaf_length;
|
| MergeLeafRight(&total_length, &state, right_leaf_state);
|
| - // Terminal node.
|
| - if (left_as_cons == NULL) {
|
| - MergeTerminal(&total_length, state, state_out);
|
| - return total_length;
|
| - }
|
| - } else if (left_as_cons != NULL) {
|
| - // Both strings are ConsStrings.
|
| - // Recurse on smallest.
|
| - if (left->length() < right->length()) {
|
| - total_length += Calculate(left_as_cons, &left_leaf_state);
|
| - MergeLeafLeft(&total_length, &state, left_leaf_state);
|
| - current = right_as_cons;
|
| - continue;
|
| - } else {
|
| - total_length += Calculate(right_as_cons, &right_leaf_state);
|
| - MergeLeafRight(&total_length, &state, right_leaf_state);
|
| + if (left_as_cons != NULL) {
|
| + // 1 Leaf node. Descend in place.
|
| current = left_as_cons;
|
| continue;
|
| + } else {
|
| + // Terminal node.
|
| + MergeTerminal(&total_length, state, state_out);
|
| + return total_length;
|
| }
|
| + } else if (left_as_cons == NULL) {
|
| + // 1 Leaf node. Descend in place.
|
| + current = right_as_cons;
|
| + continue;
|
| }
|
| - // 1 leaf node. Do in place descent.
|
| - if (left_as_cons != NULL) {
|
| - current = left_as_cons;
|
| - } else {
|
| - ASSERT(right_as_cons != NULL);
|
| + // Both strings are ConsStrings.
|
| + // Recurse on smallest.
|
| + if (left->length() < right->length()) {
|
| + total_length += Calculate(left_as_cons, &left_leaf_state);
|
| + MergeLeafLeft(&total_length, &state, left_leaf_state);
|
| current = right_as_cons;
|
| + } else {
|
| + total_length += Calculate(right_as_cons, &right_leaf_state);
|
| + MergeLeafRight(&total_length, &state, right_leaf_state);
|
| + current = left_as_cons;
|
| }
|
| }
|
| UNREACHABLE();
|
| @@ -4267,7 +4264,7 @@ class Utf8WriterVisitor {
|
| if (sizeof(Char) == 1) {
|
| for (; i < fast_length; i++) {
|
| buffer +=
|
| - Utf8::Encode(buffer, *chars++, Utf16::kNoPreviousCharacter);
|
| + Utf8::EncodeOneByte(buffer, static_cast<uint8_t>(*chars++));
|
| ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_);
|
| }
|
| } else {
|
|
|