Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: third_party/WebKit/Source/wtf/text/StringImpl.h

Issue 2624443003: Enable ThreadRestrictionVerifier for StringImpl (Closed)
Patch Set: static assert Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights 3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights
4 * reserved. 4 * reserved.
5 * Copyright (C) 2009 Google Inc. All rights reserved. 5 * Copyright (C) 2009 Google Inc. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 17 matching lines...) Expand all
28 #include "wtf/Forward.h" 28 #include "wtf/Forward.h"
29 #include "wtf/HashMap.h" 29 #include "wtf/HashMap.h"
30 #include "wtf/StringHasher.h" 30 #include "wtf/StringHasher.h"
31 #include "wtf/Vector.h" 31 #include "wtf/Vector.h"
32 #include "wtf/WTFExport.h" 32 #include "wtf/WTFExport.h"
33 #include "wtf/text/ASCIIFastPath.h" 33 #include "wtf/text/ASCIIFastPath.h"
34 #include "wtf/text/Unicode.h" 34 #include "wtf/text/Unicode.h"
35 #include <limits.h> 35 #include <limits.h>
36 #include <string.h> 36 #include <string.h>
37 37
38 #if DCHECK_IS_ON()
39 #include "wtf/ThreadRestrictionVerifier.h"
40 #endif
41
38 #if OS(MACOSX) 42 #if OS(MACOSX)
39 typedef const struct __CFString* CFStringRef; 43 typedef const struct __CFString* CFStringRef;
40 #endif 44 #endif
41 45
42 #ifdef __OBJC__ 46 #ifdef __OBJC__
43 @class NSString; 47 @class NSString;
44 #endif 48 #endif
45 49
46 namespace WTF { 50 namespace WTF {
47 51
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 DCHECK(hasHash()); 294 DCHECK(hasHash());
291 return m_hash; 295 return m_hash;
292 } 296 }
293 297
294 unsigned hash() const { 298 unsigned hash() const {
295 if (hasHash()) 299 if (hasHash())
296 return existingHash(); 300 return existingHash();
297 return hashSlowCase(); 301 return hashSlowCase();
298 } 302 }
299 303
300 ALWAYS_INLINE bool hasOneRef() const { return m_refCount == 1; } 304 ALWAYS_INLINE bool hasOneRef() const {
305 #if DCHECK_IS_ON()
306 DCHECK(isStatic() || m_verifier.isSafeToUse()) << asciiForDebugging();
307 #endif
308 return m_refCount == 1;
309 }
301 310
302 ALWAYS_INLINE void ref() { ++m_refCount; } 311 ALWAYS_INLINE void ref() const {
312 #if DCHECK_IS_ON()
313 DCHECK(isStatic() || m_verifier.onRef(m_refCount)) << asciiForDebugging();
314 #endif
315 ++m_refCount;
316 }
303 317
304 ALWAYS_INLINE void deref() { 318 ALWAYS_INLINE void deref() const {
319 #if DCHECK_IS_ON()
320 DCHECK(isStatic() || m_verifier.onDeref(m_refCount))
321 << asciiForDebugging() << " " << currentThread();
322 #endif
305 if (!--m_refCount) 323 if (!--m_refCount)
306 destroyIfNotStatic(); 324 destroyIfNotStatic();
307 } 325 }
308 326
309 static StringImpl* empty(); 327 static StringImpl* empty();
310 static StringImpl* empty16Bit(); 328 static StringImpl* empty16Bit();
311 329
312 // FIXME: Does this really belong in StringImpl? 330 // FIXME: Does this really belong in StringImpl?
313 template <typename T> 331 template <typename T>
314 static void copyChars(T* destination, 332 static void copyChars(T* destination,
315 const T* source, 333 const T* source,
316 unsigned numCharacters) { 334 unsigned numCharacters) {
317 memcpy(destination, source, numCharacters * sizeof(T)); 335 memcpy(destination, source, numCharacters * sizeof(T));
318 } 336 }
319 337
320 ALWAYS_INLINE static void copyChars(UChar* destination, 338 ALWAYS_INLINE static void copyChars(UChar* destination,
321 const LChar* source, 339 const LChar* source,
322 unsigned numCharacters) { 340 unsigned numCharacters) {
323 for (unsigned i = 0; i < numCharacters; ++i) 341 for (unsigned i = 0; i < numCharacters; ++i)
324 destination[i] = source[i]; 342 destination[i] = source[i];
325 } 343 }
326 344
327 // Some string features, like refcounting and the atomicity flag, are not 345 // Some string features, like refcounting and the atomicity flag, are not
328 // thread-safe. We achieve thread safety by isolation, giving each thread 346 // thread-safe. We achieve thread safety by isolation, giving each thread
329 // its own copy of the string. 347 // its own copy of the string.
330 PassRefPtr<StringImpl> isolatedCopy() const; 348 PassRefPtr<StringImpl> isolatedCopy() const;
331 349
332 PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX); 350 PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX) const;
333 351
334 UChar operator[](unsigned i) const { 352 UChar operator[](unsigned i) const {
335 SECURITY_DCHECK(i < m_length); 353 SECURITY_DCHECK(i < m_length);
336 if (is8Bit()) 354 if (is8Bit())
337 return characters8()[i]; 355 return characters8()[i];
338 return characters16()[i]; 356 return characters16()[i];
339 } 357 }
340 UChar32 characterStartingAt(unsigned); 358 UChar32 characterStartingAt(unsigned);
341 359
342 bool containsOnlyWhitespace(); 360 bool containsOnlyWhitespace();
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 const UChar* replacement, 498 const UChar* replacement,
481 unsigned replacementLength); 499 unsigned replacementLength);
482 500
483 template <class UCharPredicate> 501 template <class UCharPredicate>
484 PassRefPtr<StringImpl> stripMatchedCharacters(UCharPredicate); 502 PassRefPtr<StringImpl> stripMatchedCharacters(UCharPredicate);
485 template <typename CharType, class UCharPredicate> 503 template <typename CharType, class UCharPredicate>
486 PassRefPtr<StringImpl> simplifyMatchedCharactersToSpace(UCharPredicate, 504 PassRefPtr<StringImpl> simplifyMatchedCharactersToSpace(UCharPredicate,
487 StripBehavior); 505 StripBehavior);
488 NEVER_INLINE unsigned hashSlowCase() const; 506 NEVER_INLINE unsigned hashSlowCase() const;
489 507
490 void destroyIfNotStatic(); 508 void destroyIfNotStatic() const;
491 void updateContainsOnlyASCII() const; 509 void updateContainsOnlyASCII() const;
492 510
511 #if DCHECK_IS_ON()
512 std::string asciiForDebugging() const;
513 #endif
514
493 #ifdef STRING_STATS 515 #ifdef STRING_STATS
494 static StringStats m_stringStats; 516 static StringStats m_stringStats;
495 #endif 517 #endif
496 518
497 static unsigned m_highestStaticStringLength; 519 static unsigned m_highestStaticStringLength;
498 520
499 #if DCHECK_IS_ON() 521 #if DCHECK_IS_ON()
500 void assertHashIsCorrect() { 522 void assertHashIsCorrect() {
501 DCHECK(hasHash()); 523 DCHECK(hasHash());
502 DCHECK_EQ(existingHash(), StringHasher::computeHashAndMaskTop8Bits( 524 DCHECK_EQ(existingHash(), StringHasher::computeHashAndMaskTop8Bits(
503 characters8(), length())); 525 characters8(), length()));
504 } 526 }
505 #endif 527 #endif
506 528
507 private: 529 private:
508 unsigned m_refCount; 530 #if DCHECK_IS_ON()
531 mutable ThreadRestrictionVerifier m_verifier;
532 #endif
533 mutable unsigned m_refCount;
509 const unsigned m_length; 534 const unsigned m_length;
510 mutable unsigned m_hash : 24; 535 mutable unsigned m_hash : 24;
511 mutable unsigned m_containsOnlyASCII : 1; 536 mutable unsigned m_containsOnlyASCII : 1;
512 mutable unsigned m_needsASCIICheck : 1; 537 mutable unsigned m_needsASCIICheck : 1;
513 unsigned m_isAtomic : 1; 538 unsigned m_isAtomic : 1;
514 const unsigned m_is8Bit : 1; 539 const unsigned m_is8Bit : 1;
515 const unsigned m_isStatic : 1; 540 const unsigned m_isStatic : 1;
516 }; 541 };
517 542
518 template <> 543 template <>
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 using WTF::TextCaseASCIIInsensitive; 885 using WTF::TextCaseASCIIInsensitive;
861 using WTF::TextCaseUnicodeInsensitive; 886 using WTF::TextCaseUnicodeInsensitive;
862 using WTF::TextCaseSensitive; 887 using WTF::TextCaseSensitive;
863 using WTF::TextCaseSensitivity; 888 using WTF::TextCaseSensitivity;
864 using WTF::equal; 889 using WTF::equal;
865 using WTF::equalNonNull; 890 using WTF::equalNonNull;
866 using WTF::lengthOfNullTerminatedString; 891 using WTF::lengthOfNullTerminatedString;
867 using WTF::reverseFind; 892 using WTF::reverseFind;
868 893
869 #endif 894 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/wtf/ThreadRestrictionVerifier.h ('k') | third_party/WebKit/Source/wtf/text/StringImpl.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698