Changeset 62148 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Jun 29, 2010, 3:01:29 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/RegExp.cpp
r61927 r62148 52 52 , m_constructionError(0) 53 53 , m_numSubpatterns(0) 54 , m_lastMatchStart(-1) 54 55 { 55 56 compile(globalData); … … 61 62 , m_constructionError(0) 62 63 , m_numSubpatterns(0) 64 , m_lastMatchStart(-1) 63 65 { 64 66 // NOTE: The global flag is handled on a case-by-case basis by functions like … … 110 112 ovector->resize(0); 111 113 112 if (static_cast<unsigned>(startOffset) > s.size() || s.isNull()) 114 if (static_cast<unsigned>(startOffset) > s.size() || s.isNull()) { 115 m_lastMatchString = UString(); 116 m_lastMatchStart = -1; 117 m_lastOVector.shrink(0); 113 118 return -1; 119 } 120 121 // Perform check to see if this match call is the same as the last match invocation 122 // and if it is return the prior result. 123 if ((startOffset == m_lastMatchStart) && (s.rep() == m_lastMatchString.rep())) { 124 if (ovector) 125 *ovector = m_lastOVector; 126 127 if (m_lastOVector.isEmpty()) 128 return -1; 129 130 return m_lastOVector.at(0); 131 } 114 132 115 133 #if ENABLE(YARR_JIT) … … 148 166 ovector->clear(); 149 167 } 168 169 m_lastMatchString = s; 170 m_lastMatchStart = startOffset; 171 172 if (ovector) 173 m_lastOVector = *ovector; 174 else 175 m_lastOVector = nonReturnedOvector; 176 150 177 return result; 151 178 } 179 180 m_lastMatchString = UString(); 181 m_lastMatchStart = -1; 182 m_lastOVector.shrink(0); 152 183 153 184 return -1; -
trunk/JavaScriptCore/runtime/RegExp.h
r61927 r62148 68 68 const char* m_constructionError; 69 69 unsigned m_numSubpatterns; 70 UString m_lastMatchString; 71 int m_lastMatchStart; 72 Vector<int, 32> m_lastOVector; 70 73 71 74 #if ENABLE(YARR_JIT) -
trunk/JavaScriptCore/runtime/UString.h
r60332 r62148 159 159 ALWAYS_INLINE bool operator==(const UString& s1, const UString& s2) 160 160 { 161 unsigned size = s1.size(); 162 switch (size) { 163 case 0: 164 return !s2.size(); 161 UString::Rep* rep1 = s1.rep(); 162 UString::Rep* rep2 = s2.rep(); 163 unsigned size1 = 0; 164 unsigned size2 = 0; 165 166 if (rep1 == rep2) // If they're the same rep, they're equal. 167 return true; 168 169 if (rep1) 170 size1 = rep1->length(); 171 172 if (rep2) 173 size2 = rep2->length(); 174 175 if (size1 != size2) // If the lengths are not the same, we're done. 176 return false; 177 178 if (!size1) 179 return true; 180 181 // At this point we know 182 // (a) that the strings are the same length and 183 // (b) that they are greater than zero length. 184 const UChar* d1 = rep1->characters(); 185 const UChar* d2 = rep2->characters(); 186 187 if (d1 == d2) // Check to see if the data pointers are the same. 188 return true; 189 190 // Do quick checks for sizes 1 and 2. 191 switch (size1) { 165 192 case 1: 166 return s2.size() == 1 && s1.data()[0] == s2.data()[0]; 167 case 2: { 168 if (s2.size() != 2) 169 return false; 170 const UChar* d1 = s1.data(); 171 const UChar* d2 = s2.data(); 193 return d1[0] == d2[0]; 194 case 2: 172 195 return (d1[0] == d2[0]) & (d1[1] == d2[1]); 173 }174 196 default: 175 return s2.size() == size && memcmp(s1.data(), s2.data(), size* sizeof(UChar)) == 0;197 return memcmp(d1, d2, size1 * sizeof(UChar)) == 0; 176 198 } 177 199 }
Note:
See TracChangeset
for help on using the changeset viewer.