Changeset 95682 in webkit
- Timestamp:
- Sep 21, 2011 4:44:20 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r95665 r95682 1 2011-09-21 Leandro Pereira <leandro@profusion.mobi> 1 2011-09-21 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: compare strings without decoding 4 https://bugs.webkit.org/show_bug.cgi?id=68554 5 6 Reviewed by Tony Chang. 7 8 Resolves a FIXME in IndexedDB that was also identified as a hotspot 9 during profiling. Yields a small performance improvement. 10 11 * Source/WebCore/storage/IDBLevelDBCoding.cpp: 12 * Source/WebCore/storage/IDBLevelDBCoding.h: 13 * Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp: 14 15 011-09-21 Leandro Pereira <leandro@profusion.mobi> 2 16 3 17 Unreviewed. Remove unused ENABLE_AS_IMAGE flag after r95234 from -
trunk/Source/WebCore/storage/IDBLevelDBCoding.cpp
r95373 r95682 299 299 p += len * 2; 300 300 return p; 301 } 302 303 int compareEncodedStringsWithLength(const char* p, const char* limitP, const char* q, const char* limitQ) 304 { 305 ASSERT(limitP >= p); 306 ASSERT(limitQ >= q); 307 int64_t lenP, lenQ; 308 p = decodeVarInt(p, limitP, lenP); 309 q = decodeVarInt(q, limitQ, lenQ); 310 ASSERT(p && q); 311 ASSERT(lenP >= 0); 312 ASSERT(lenQ >= 0); 313 ASSERT(p + lenP * 2 <= limitP); 314 ASSERT(q + lenQ * 2 <= limitQ); 315 316 const size_t lmin = static_cast<size_t>(lenP < lenQ ? lenP : lenQ); 317 if (int x = memcmp(p, q, lmin * 2)) 318 return x; 319 320 if (lenP == lenQ) 321 return 0; 322 323 return (lenP > lenQ) ? 1 : -1; 301 324 } 302 325 … … 442 465 unsigned char typeB = *q++; 443 466 444 String s, t;445 467 double d, e; 446 468 … … 455 477 case kIDBKeyStringTypeByte: 456 478 // String type. 457 p = decodeStringWithLength(p, limitA, s); // FIXME: Compare without actually decoding the String! 458 ASSERT(p); 459 q = decodeStringWithLength(q, limitB, t); 460 ASSERT(q); 461 return codePointCompare(s, t); 479 return compareEncodedStringsWithLength(p, limitA, q, limitB); 462 480 case kIDBKeyDateTypeByte: 463 481 case kIDBKeyNumberTypeByte: -
trunk/Source/WebCore/storage/IDBLevelDBCoding.h
r95373 r95682 54 54 Vector<char> encodeStringWithLength(const String&); 55 55 const char* decodeStringWithLength(const char* p, const char* limit, String& foundString); 56 int compareEncodedStringsWithLength(const char* p, const char* limitP, const char* q, const char* limitQ); 56 57 Vector<char> encodeDouble(double); 57 58 const char* decodeDouble(const char* p, const char* limit, double*); -
trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp
r95373 r95682 231 231 } 232 232 233 TEST(IDBLevelDBCodingTest, CompareEncodedStringsWithLength) 234 { 235 const UChar testStringA[] = {0x1000, 0x1000, '\0'}; 236 const UChar testStringB[] = {0x1000, 0x1000, 0x1000, '\0'}; 237 const UChar testStringC[] = {0x1000, 0x1000, 0x1001, '\0'}; 238 const UChar testStringD[] = {0x1001, 0x1000, 0x1000, '\0'}; 239 const UChar testStringE[] = {0xd834, 0xdd1e, '\0'}; 240 const UChar testStringF[] = {0xfffd, '\0'}; 241 242 Vector<String> testCases; 243 testCases.append(String("")); 244 testCases.append(String("a")); 245 testCases.append(String("b")); 246 testCases.append(String("baaa")); 247 testCases.append(String("baab")); 248 testCases.append(String("c")); 249 testCases.append(String(testStringA)); 250 testCases.append(String(testStringB)); 251 testCases.append(String(testStringC)); 252 testCases.append(String(testStringD)); 253 testCases.append(String(testStringE)); 254 testCases.append(String(testStringF)); 255 256 for (size_t i = 0; i < testCases.size() - 1; ++i) { 257 String a = testCases[i]; 258 String b = testCases[i + 1]; 259 260 EXPECT_LT(codePointCompare(a, b), 0); 261 EXPECT_GT(codePointCompare(b, a), 0); 262 EXPECT_EQ(codePointCompare(a, a), 0); 263 EXPECT_EQ(codePointCompare(b, b), 0); 264 265 Vector<char> encodedA = encodeStringWithLength(a); 266 EXPECT_TRUE(encodedA.size()); 267 Vector<char> encodedB = encodeStringWithLength(b); 268 EXPECT_TRUE(encodedA.size()); 269 270 const char* p = encodedA.data(); 271 const char* limitP = p + encodedA.size(); 272 const char* q = encodedB.data(); 273 const char* limitQ = q + encodedB.size(); 274 275 EXPECT_LT(compareEncodedStringsWithLength(p, limitP, q, limitQ), 0); 276 EXPECT_GT(compareEncodedStringsWithLength(q, limitQ, p, limitP), 0); 277 EXPECT_EQ(compareEncodedStringsWithLength(p, limitP, p, limitP), 0); 278 EXPECT_EQ(compareEncodedStringsWithLength(q, limitQ, q, limitQ), 0); 279 } 280 } 281 233 282 TEST(IDBLevelDBCodingTest, EncodeDouble) 234 283 { … … 303 352 keys.append(IDBKey::createString("b")); 304 353 keys.append(IDBKey::createString("baaa")); 354 keys.append(IDBKey::createString("baab")); 355 keys.append(IDBKey::createString("c")); 305 356 306 357 for (size_t i = 0; i < keys.size() - 1; ++i) {
Note: See TracChangeset
for help on using the changeset viewer.