Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 32dd94f39b64457b6cbe853647222c22d49ba8e5..8203b36a97f1dee7ef9c14a2cf413ae2c370c7e4 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -9172,22 +9172,33 @@ class String: public Name { |
static inline int NonAsciiStart(const char* chars, int length) { |
const char* start = chars; |
const char* limit = chars + length; |
-#ifdef V8_HOST_CAN_READ_UNALIGNED |
- DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F); |
- const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80; |
- while (chars + sizeof(uintptr_t) <= limit) { |
- if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) { |
- return static_cast<int>(chars - start); |
+ |
+ if (length >= kIntptrSize) { |
+ // Check unaligned bytes. |
+ while (!IsAligned(reinterpret_cast<intptr_t>(chars), sizeof(uintptr_t))) { |
+ if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { |
+ return static_cast<int>(chars - start); |
+ } |
+ ++chars; |
+ } |
+ // Check aligned words. |
+ DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F); |
+ const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80; |
+ while (chars + sizeof(uintptr_t) <= limit) { |
+ if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) { |
+ return static_cast<int>(chars - start); |
+ } |
+ chars += sizeof(uintptr_t); |
} |
- chars += sizeof(uintptr_t); |
} |
-#endif |
+ // Check remaining unaligned bytes. |
while (chars < limit) { |
if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { |
return static_cast<int>(chars - start); |
} |
++chars; |
} |
+ |
return static_cast<int>(chars - start); |
} |