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

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

Issue 2624443003: Enable ThreadRestrictionVerifier for StringImpl (Closed)
Patch Set: minimal const peppering 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 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller ( mueller@kde.org ) 4 * (C) 2001 Dirk Mueller ( mueller@kde.org )
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All
6 * rights reserved. 6 * rights reserved.
7 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) 7 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net)
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 14 matching lines...) Expand all
25 25
26 #include "wtf/text/StringImpl.h" 26 #include "wtf/text/StringImpl.h"
27 27
28 #include "wtf/DynamicAnnotations.h" 28 #include "wtf/DynamicAnnotations.h"
29 #include "wtf/LeakAnnotations.h" 29 #include "wtf/LeakAnnotations.h"
30 #include "wtf/PtrUtil.h" 30 #include "wtf/PtrUtil.h"
31 #include "wtf/StdLibExtras.h" 31 #include "wtf/StdLibExtras.h"
32 #include "wtf/allocator/Partitions.h" 32 #include "wtf/allocator/Partitions.h"
33 #include "wtf/text/AtomicString.h" 33 #include "wtf/text/AtomicString.h"
34 #include "wtf/text/AtomicStringTable.h" 34 #include "wtf/text/AtomicStringTable.h"
35 #include "wtf/text/CString.h"
35 #include "wtf/text/CharacterNames.h" 36 #include "wtf/text/CharacterNames.h"
36 #include "wtf/text/StringBuffer.h" 37 #include "wtf/text/StringBuffer.h"
37 #include "wtf/text/StringHash.h" 38 #include "wtf/text/StringHash.h"
38 #include "wtf/text/StringToNumber.h" 39 #include "wtf/text/StringToNumber.h"
39 #include <algorithm> 40 #include <algorithm>
40 #include <memory> 41 #include <memory>
41 42
42 #ifdef STRING_STATS 43 #ifdef STRING_STATS
43 #include "wtf/DataLog.h" 44 #include "wtf/DataLog.h"
44 #include "wtf/HashMap.h" 45 #include "wtf/HashMap.h"
45 #include "wtf/HashSet.h" 46 #include "wtf/HashSet.h"
46 #include "wtf/RefCounted.h" 47 #include "wtf/RefCounted.h"
47 #include "wtf/ThreadingPrimitives.h" 48 #include "wtf/ThreadingPrimitives.h"
48 #include <unistd.h> 49 #include <unistd.h>
49 #endif 50 #endif
50 51
51 using namespace std; 52 using namespace std;
52 53
53 namespace WTF { 54 namespace WTF {
54 55
55 using namespace Unicode; 56 using namespace Unicode;
56 57
58 #if !DCHECK_IS_ON()
esprehn 2017/01/13 22:35:29 I'd prefer we changed this to have a side for DCHE
57 static_assert(sizeof(StringImpl) == 3 * sizeof(int), 59 static_assert(sizeof(StringImpl) == 3 * sizeof(int),
58 "StringImpl should stay small"); 60 "StringImpl should stay small");
61 #endif
59 62
60 #ifdef STRING_STATS 63 #ifdef STRING_STATS
61 64
62 static Mutex& statsMutex() { 65 static Mutex& statsMutex() {
63 DEFINE_STATIC_LOCAL(Mutex, mutex, ()); 66 DEFINE_STATIC_LOCAL(Mutex, mutex, ());
64 return mutex; 67 return mutex;
65 } 68 }
66 69
67 static HashSet<void*>& liveStrings() { 70 static HashSet<void*>& liveStrings() {
68 // Notice that we can't use HashSet<StringImpl*> because then HashSet would 71 // Notice that we can't use HashSet<StringImpl*> because then HashSet would
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 296
294 inline StringImpl::~StringImpl() { 297 inline StringImpl::~StringImpl() {
295 DCHECK(!isStatic()); 298 DCHECK(!isStatic());
296 299
297 STRING_STATS_REMOVE_STRING(this); 300 STRING_STATS_REMOVE_STRING(this);
298 301
299 if (isAtomic()) 302 if (isAtomic())
300 AtomicStringTable::instance().remove(this); 303 AtomicStringTable::instance().remove(this);
301 } 304 }
302 305
303 void StringImpl::destroyIfNotStatic() { 306 void StringImpl::destroyIfNotStatic() const {
304 if (!isStatic()) 307 if (!isStatic())
305 delete this; 308 delete this;
306 } 309 }
307 310
308 void StringImpl::updateContainsOnlyASCII() const { 311 void StringImpl::updateContainsOnlyASCII() const {
309 m_containsOnlyASCII = is8Bit() 312 m_containsOnlyASCII = is8Bit()
310 ? charactersAreAllASCII(characters8(), length()) 313 ? charactersAreAllASCII(characters8(), length())
311 : charactersAreAllASCII(characters16(), length()); 314 : charactersAreAllASCII(characters16(), length());
312 m_needsASCIICheck = false; 315 m_needsASCIICheck = false;
313 } 316 }
314 317
315 bool StringImpl::isSafeToSendToAnotherThread() const { 318 bool StringImpl::isSafeToSendToAnotherThread() const {
316 if (isStatic()) 319 if (isStatic())
317 return true; 320 return true;
318 // AtomicStrings are not safe to send between threads as ~StringImpl() 321 // AtomicStrings are not safe to send between threads as ~StringImpl()
319 // will try to remove them from the wrong AtomicStringTable. 322 // will try to remove them from the wrong AtomicStringTable.
320 if (isAtomic()) 323 if (isAtomic())
321 return false; 324 return false;
322 if (hasOneRef()) 325 if (hasOneRef())
323 return true; 326 return true;
324 return false; 327 return false;
325 } 328 }
326 329
330 #if DCHECK_IS_ON()
331 std::string StringImpl::asciiForDebugging() const {
332 CString ascii = String(substring(0, 128)).ascii();
333 return std::string(ascii.data(), ascii.length());
334 }
335 #endif
336
327 PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, 337 PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length,
328 LChar*& data) { 338 LChar*& data) {
329 if (!length) { 339 if (!length) {
330 data = 0; 340 data = 0;
331 return empty(); 341 return empty();
332 } 342 }
333 343
334 // Allocate a single buffer large enough to contain the StringImpl 344 // Allocate a single buffer large enough to contain the StringImpl
335 // struct as well as the data which it contains. This removes one 345 // struct as well as the data which it contains. This removes one
336 // heap allocation from this call. 346 // heap allocation from this call.
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 504 }
495 505
496 for (unsigned i = 0; i < m_length; ++i) { 506 for (unsigned i = 0; i < m_length; ++i) {
497 UChar c = characters16()[i]; 507 UChar c = characters16()[i];
498 if (!isASCIISpace(c)) 508 if (!isASCIISpace(c))
499 return false; 509 return false;
500 } 510 }
501 return true; 511 return true;
502 } 512 }
503 513
504 PassRefPtr<StringImpl> StringImpl::substring(unsigned start, unsigned length) { 514 PassRefPtr<StringImpl> StringImpl::substring(unsigned start,
515 unsigned length) const {
505 if (start >= m_length) 516 if (start >= m_length)
506 return empty(); 517 return empty();
507 unsigned maxLength = m_length - start; 518 unsigned maxLength = m_length - start;
508 if (length >= maxLength) { 519 if (length >= maxLength) {
520 // PassRefPtr has trouble dealing with const arguments. It should be updated
521 // so this const_cast is not necessary.
509 if (!start) 522 if (!start)
510 return this; 523 return const_cast<StringImpl*>(this);
511 length = maxLength; 524 length = maxLength;
512 } 525 }
513 if (is8Bit()) 526 if (is8Bit())
514 return create(characters8() + start, length); 527 return create(characters8() + start, length);
515 528
516 return create(characters16() + start, length); 529 return create(characters16() + start, length);
517 } 530 }
518 531
519 UChar32 StringImpl::characterStartingAt(unsigned i) { 532 UChar32 StringImpl::characterStartingAt(unsigned i) {
520 if (is8Bit()) 533 if (is8Bit())
(...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 } else if (localeIdMatchesLang(localeIdentifier, "lt")) { 2190 } else if (localeIdMatchesLang(localeIdentifier, "lt")) {
2178 // TODO(rob.buis) implement upper-casing rules for lt 2191 // TODO(rob.buis) implement upper-casing rules for lt
2179 // like in StringImpl::upper(locale). 2192 // like in StringImpl::upper(locale).
2180 } 2193 }
2181 } 2194 }
2182 2195
2183 return toUpper(c); 2196 return toUpper(c);
2184 } 2197 }
2185 2198
2186 } // namespace WTF 2199 } // namespace WTF
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/wtf/text/StringImpl.h ('k') | third_party/WebKit/Source/wtf/text/StringImplTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698