OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
(...skipping 8489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8500 return array; | 8500 return array; |
8501 } | 8501 } |
8502 | 8502 |
8503 | 8503 |
8504 // Compares the contents of two strings by reading and comparing | 8504 // Compares the contents of two strings by reading and comparing |
8505 // int-sized blocks of characters. | 8505 // int-sized blocks of characters. |
8506 template <typename Char> | 8506 template <typename Char> |
8507 static inline bool CompareRawStringContents(const Char* const a, | 8507 static inline bool CompareRawStringContents(const Char* const a, |
8508 const Char* const b, | 8508 const Char* const b, |
8509 int length) { | 8509 int length) { |
8510 return CompareChars(a, b, length) == 0; | 8510 int i = 0; |
| 8511 #ifndef V8_HOST_CAN_READ_UNALIGNED |
| 8512 // If this architecture isn't comfortable reading unaligned ints |
| 8513 // then we have to check that the strings are aligned before |
| 8514 // comparing them blockwise. |
| 8515 const int kAlignmentMask = sizeof(uint32_t) - 1; // NOLINT |
| 8516 uintptr_t pa_addr = reinterpret_cast<uintptr_t>(a); |
| 8517 uintptr_t pb_addr = reinterpret_cast<uintptr_t>(b); |
| 8518 if (((pa_addr & kAlignmentMask) | (pb_addr & kAlignmentMask)) == 0) { |
| 8519 #endif |
| 8520 const int kStepSize = sizeof(int) / sizeof(Char); // NOLINT |
| 8521 int endpoint = length - kStepSize; |
| 8522 // Compare blocks until we reach near the end of the string. |
| 8523 for (; i <= endpoint; i += kStepSize) { |
| 8524 uint32_t wa = *reinterpret_cast<const uint32_t*>(a + i); |
| 8525 uint32_t wb = *reinterpret_cast<const uint32_t*>(b + i); |
| 8526 if (wa != wb) { |
| 8527 return false; |
| 8528 } |
| 8529 } |
| 8530 #ifndef V8_HOST_CAN_READ_UNALIGNED |
| 8531 } |
| 8532 #endif |
| 8533 // Compare the remaining characters that didn't fit into a block. |
| 8534 for (; i < length; i++) { |
| 8535 if (a[i] != b[i]) { |
| 8536 return false; |
| 8537 } |
| 8538 } |
| 8539 return true; |
8511 } | 8540 } |
8512 | 8541 |
8513 | 8542 |
8514 template<typename Chars1, typename Chars2> | 8543 template<typename Chars1, typename Chars2> |
8515 class RawStringComparator : public AllStatic { | 8544 class RawStringComparator : public AllStatic { |
8516 public: | 8545 public: |
8517 static inline bool compare(const Chars1* a, const Chars2* b, int len) { | 8546 static inline bool compare(const Chars1* a, const Chars2* b, int len) { |
8518 DCHECK(sizeof(Chars1) != sizeof(Chars2)); | 8547 DCHECK(sizeof(Chars1) != sizeof(Chars2)); |
8519 for (int i = 0; i < len; i++) { | 8548 for (int i = 0; i < len; i++) { |
8520 if (a[i] != b[i]) { | 8549 if (a[i] != b[i]) { |
(...skipping 7851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16372 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16401 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16373 static const char* error_messages_[] = { | 16402 static const char* error_messages_[] = { |
16374 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16403 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16375 }; | 16404 }; |
16376 #undef ERROR_MESSAGES_TEXTS | 16405 #undef ERROR_MESSAGES_TEXTS |
16377 return error_messages_[reason]; | 16406 return error_messages_[reason]; |
16378 } | 16407 } |
16379 | 16408 |
16380 | 16409 |
16381 } } // namespace v8::internal | 16410 } } // namespace v8::internal |
OLD | NEW |