1 // Copyright 2019 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_OBJECTS_STRING_COMPARATOR_H_ 6 #define V8_OBJECTS_STRING_COMPARATOR_H_ 7 8 #include "src/base/logging.h" 9 #include "src/common/globals.h" 10 #include "src/objects/string.h" 11 #include "src/utils/utils.h" 12 13 namespace v8 { 14 namespace internal { 15 16 class StringComparator { 17 class State { 18 public: State()19 State() : is_one_byte_(true), length_(0), buffer8_(nullptr) {} 20 State(const State&) = delete; 21 State& operator=(const State&) = delete; 22 23 void Init(String string, 24 const SharedStringAccessGuardIfNeeded& access_guard); 25 VisitOneByteString(const uint8_t * chars,int length)26 inline void VisitOneByteString(const uint8_t* chars, int length) { 27 is_one_byte_ = true; 28 buffer8_ = chars; 29 length_ = length; 30 } 31 VisitTwoByteString(const uint16_t * chars,int length)32 inline void VisitTwoByteString(const uint16_t* chars, int length) { 33 is_one_byte_ = false; 34 buffer16_ = chars; 35 length_ = length; 36 } 37 38 void Advance(int consumed, 39 const SharedStringAccessGuardIfNeeded& access_guard); 40 41 ConsStringIterator iter_; 42 bool is_one_byte_; 43 int length_; 44 union { 45 const uint8_t* buffer8_; 46 const uint16_t* buffer16_; 47 }; 48 }; 49 50 public: 51 inline StringComparator() = default; 52 StringComparator(const StringComparator&) = delete; 53 StringComparator& operator=(const StringComparator&) = delete; 54 55 template <typename Chars1, typename Chars2> Equals(State * state_1,State * state_2,int to_check)56 static inline bool Equals(State* state_1, State* state_2, int to_check) { 57 const Chars1* a = reinterpret_cast<const Chars1*>(state_1->buffer8_); 58 const Chars2* b = reinterpret_cast<const Chars2*>(state_2->buffer8_); 59 return CompareCharsEqual(a, b, to_check); 60 } 61 62 bool Equals(String string_1, String string_2, 63 const SharedStringAccessGuardIfNeeded& access_guard); 64 65 private: 66 State state_1_; 67 State state_2_; 68 }; 69 70 } // namespace internal 71 } // namespace v8 72 73 #endif // V8_OBJECTS_STRING_COMPARATOR_H_ 74