Changeset 53418 in webkit
- Timestamp:
- Jan 18, 2010 11:44:50 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r53417 r53418 1 2010-01-18 Gavin Barraclough <barraclough@apple.com> 2 3 Reviewed by NOBODY (build fix). 4 5 Eeeep! reverting r53416 & r53417, more to be done to fix windows. 6 7 * WebCore.base.exp: 8 * platform/sql/SQLiteFileSystem.cpp: 9 (WebCore::SQLiteFileSystem::openDatabase): 10 * platform/sql/SQLiteStatement.cpp: 11 (WebCore::SQLiteStatement::prepare): 12 * platform/sql/SQLiteStatement.h: 13 * platform/sql/chromium/SQLiteFileSystemChromium.cpp: 14 (WebCore::SQLiteFileSystem::openDatabase): 15 * platform/text/PlatformString.h: 16 * platform/text/String.cpp: 17 (WebCore::String::charactersWithNullTermination): 18 * platform/text/StringImpl.cpp: 19 (WebCore::StringImpl::operator new): 20 (WebCore::StringImpl::operator delete): 21 (WebCore::StringImpl::StringImpl): 22 (WebCore::StringImpl::~StringImpl): 23 (WebCore::StringImpl::create): 24 (WebCore::StringImpl::createWithTerminatingNullCharacter): 25 (WebCore::StringImpl::crossThreadString): 26 (WebCore::StringImpl::sharedBuffer): 27 * platform/text/StringImpl.h: 28 (WebCore::StringImpl::hasTerminatingNullCharacter): 29 (WebCore::StringImpl::inTable): 30 (WebCore::StringImpl::setInTable): 31 (WebCore::StringImpl::): 32 * platform/win/ClipboardUtilitiesWin.cpp: 33 (WebCore::createGlobalData): 34 * storage/OriginUsageRecord.cpp: 35 (WebCore::OriginUsageRecord::addDatabase): 36 (WebCore::OriginUsageRecord::markDatabase): 37 1 38 2010-01-18 Gavin Barraclough <barraclough@apple.com> 2 39 -
trunk/WebCore/WebCore.base.exp
r53416 r53418 143 143 __ZN7WebCore10StringImplD1Ev 144 144 __ZN7WebCore10StringImplcvP8NSStringEv 145 __ZN7WebCore10StringImpldlEPv 145 146 __ZN7WebCore10handCursorEv 146 147 __ZN7WebCore10setCookiesEPNS_8DocumentERKNS_4KURLERKNS_6StringE -
trunk/WebCore/platform/sql/SQLiteFileSystem.cpp
r53416 r53418 50 50 { 51 51 // SQLite expects a null terminator on its UTF-16 strings. 52 OwnArrayPtr<const UChar> path; 53 fileName.copyWithNullTermination(path); 54 return sqlite3_open16(path.get(), database); 52 String path = fileName; 53 return sqlite3_open16(path.charactersWithNullTermination(), database); 55 54 } 56 55 -
trunk/WebCore/platform/sql/SQLiteStatement.cpp
r53416 r53418 64 64 const void* tail; 65 65 LOG(SQLDatabase, "SQL - prepare - %s", m_query.ascii().data()); 66 if (!m_queryWithNullTermination) 67 m_query.copyWithNullTermination(m_queryWithNullTermination); 68 int error = sqlite3_prepare16_v2(m_database.sqlite3Handle(), m_queryWithNullTermination.get(), -1, &m_statement, &tail); 66 int error = sqlite3_prepare16_v2(m_database.sqlite3Handle(), m_query.charactersWithNullTermination(), -1, &m_statement, &tail); 69 67 if (error != SQLITE_OK) 70 68 LOG(SQLDatabase, "sqlite3_prepare16 failed (%i)\n%s\n%s", error, m_query.ascii().data(), sqlite3_errmsg(m_database.sqlite3Handle())); -
trunk/WebCore/platform/sql/SQLiteStatement.h
r53416 r53418 92 92 SQLiteDatabase& m_database; 93 93 String m_query; 94 OwnArrayPtr<const UChar> m_queryWithNullTermination;95 94 sqlite3_stmt* m_statement; 96 95 #ifndef NDEBUG -
trunk/WebCore/platform/sql/chromium/SQLiteFileSystemChromium.cpp
r53416 r53418 52 52 { 53 53 if (!ChromiumBridge::sandboxEnabled()) { 54 OwnArrayPtr<const UChar> path; 55 fileName.copyWithNullTermination(path); 56 return sqlite3_open16(path.get(), database); 54 String path = fileName; 55 return sqlite3_open16(path.charactersWithNullTermination(), database); 57 56 } 58 57 -
trunk/WebCore/platform/text/PlatformString.h
r53416 r53418 27 27 28 28 #include "StringImpl.h" 29 #include <wtf/OwnArrayPtr.h>30 29 31 30 #ifdef __OBJC__ … … 95 94 unsigned length() const; 96 95 const UChar* characters() const; 97 void copyWithNullTermination(OwnArrayPtr<const UChar>&) const;96 const UChar* charactersWithNullTermination(); 98 97 99 98 UChar operator[](unsigned i) const; // if i >= length(), returns 0 -
trunk/WebCore/platform/text/String.cpp
r53416 r53418 330 330 } 331 331 332 void String::copyWithNullTermination(OwnArrayPtr<const UChar>& result) const 333 { 334 if (!m_impl) 335 CRASH(); 336 unsigned length = m_impl->length(); 337 UChar* buffer = new UChar[length + 1]; 338 memcpy(buffer, m_impl->characters(), length * sizeof(UChar)); 339 buffer[length] = 0; 340 result.set(buffer); 332 const UChar* String::charactersWithNullTermination() 333 { 334 if (!m_impl) 335 return 0; 336 if (m_impl->hasTerminatingNullCharacter()) 337 return m_impl->characters(); 338 m_impl = StringImpl::createWithTerminatingNullCharacter(*m_impl); 339 return m_impl->characters(); 341 340 } 342 341 -
trunk/WebCore/platform/text/StringImpl.cpp
r53416 r53418 58 58 } 59 59 60 // Some of the factory methods create buffers using fastMalloc. 61 // We must ensure that all allocations of StringImpl are allocated using 62 // fastMalloc so that we don't have mis-matched frees. We accomplish 63 // this by overriding the new and delete operators. 64 void* StringImpl::operator new(size_t size, void* address) 65 { 66 if (address) 67 return address; // Allocating using an internal buffer 68 return fastMalloc(size); 69 } 70 71 void* StringImpl::operator new(size_t size) 72 { 73 return fastMalloc(size); 74 } 75 76 void StringImpl::operator delete(void* address) 77 { 78 fastFree(address); 79 } 80 60 81 // This constructor is used only to create the empty string. 61 82 StringImpl::StringImpl() 62 83 : m_data(0) 63 , m_sharedBuffer(0)64 84 , m_length(0) 65 , m_refCountAndFlags(s_refCountIncrement)66 85 , m_hash(0) 67 86 { … … 74 93 inline StringImpl::StringImpl(const UChar* characters, unsigned length) 75 94 : m_data(characters) 76 , m_sharedBuffer(0)77 95 , m_length(length) 78 , m_refCountAndFlags(s_refCountIncrement)79 96 , m_hash(0) 80 97 { … … 88 105 AtomicString::remove(this); 89 106 if (!bufferIsInternal()) { 90 SharedUChar* sharedBuffer = m_sharedBuffer ;107 SharedUChar* sharedBuffer = m_sharedBufferAndFlags.get(); 91 108 if (sharedBuffer) 92 109 sharedBuffer->deref(); … … 954 971 PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(str.data(), str.size())); 955 972 sharedBuffer->ref(); 956 impl->m_sharedBuffer = sharedBuffer;973 impl->m_sharedBufferAndFlags.set(sharedBuffer); 957 974 return impl; 958 975 } … … 969 986 } 970 987 #endif 988 989 PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const StringImpl& string) 990 { 991 // Use createUninitialized instead of 'new StringImpl' so that the string and its buffer 992 // get allocated in a single malloc block. 993 UChar* data; 994 int length = string.m_length; 995 RefPtr<StringImpl> terminatedString = createUninitialized(length + 1, data); 996 memcpy(data, string.m_data, length * sizeof(UChar)); 997 data[length] = 0; 998 terminatedString->m_length--; 999 terminatedString->m_hash = string.m_hash; 1000 terminatedString->m_sharedBufferAndFlags.setFlag(HasTerminatingNullCharacter); 1001 return terminatedString.release(); 1002 } 971 1003 972 1004 PassRefPtr<StringImpl> StringImpl::threadsafeCopy() const … … 983 1015 if (shared) { 984 1016 RefPtr<StringImpl> impl = adoptRef(new StringImpl(m_data, m_length)); 985 impl->m_sharedBuffer = shared->crossThreadCopy().releaseRef();1017 impl->m_sharedBufferAndFlags.set(shared->crossThreadCopy().releaseRef()); 986 1018 return impl.release(); 987 1019 } … … 996 1028 return 0; 997 1029 998 if (!m_sharedBuffer )999 m_sharedBuffer = SharedUChar::create(new OwnFastMallocPtr<UChar>(const_cast<UChar*>(m_data))).releaseRef();1000 return m_sharedBuffer ;1030 if (!m_sharedBufferAndFlags.get()) 1031 m_sharedBufferAndFlags.set(SharedUChar::create(new OwnFastMallocPtr<UChar>(const_cast<UChar*>(m_data))).releaseRef()); 1032 return m_sharedBufferAndFlags.get(); 1001 1033 } 1002 1034 -
trunk/WebCore/platform/text/StringImpl.h
r53416 r53418 27 27 #include <wtf/ASCIICType.h> 28 28 #include <wtf/CrossThreadRefCounted.h> 29 #include <wtf/Noncopyable.h>30 29 #include <wtf/OwnFastMallocPtr.h> 30 #include <wtf/PtrAndFlags.h> 31 31 #include <wtf/RefCounted.h> 32 32 #include <wtf/StringHashFunctions.h> … … 59 59 typedef bool (*CharacterMatchFunctionPtr)(UChar); 60 60 61 class StringImpl : public Noncopyable{61 class StringImpl : public RefCounted<StringImpl> { 62 62 friend struct CStringTranslator; 63 63 friend struct HashAndCharactersTranslator; … … 83 83 static PassRefPtr<StringImpl> createUninitialized(unsigned length, UChar*& data); 84 84 85 static PassRefPtr<StringImpl> createWithTerminatingNullCharacter(const StringImpl&); 86 85 87 static PassRefPtr<StringImpl> createStrippingNullCharacters(const UChar*, unsigned length); 86 88 static PassRefPtr<StringImpl> adopt(StringBuffer&); … … 95 97 unsigned length() { return m_length; } 96 98 97 bool inTable() const { return m_refCountAndFlags & s_refCountFlagInTable; } 98 void setInTable() { m_refCountAndFlags |= s_refCountFlagInTable; } 99 bool hasTerminatingNullCharacter() const { return m_sharedBufferAndFlags.isFlagSet(HasTerminatingNullCharacter); } 100 101 bool inTable() const { return m_sharedBufferAndFlags.isFlagSet(InTable); } 102 void setInTable() { return m_sharedBufferAndFlags.setFlag(InTable); } 99 103 100 104 unsigned hash() { if (m_hash == 0) m_hash = computeHash(m_data, m_length); return m_hash; } … … 103 107 inline static unsigned computeHash(const char* data) { return WTF::stringHash(data); } 104 108 105 StringImpl* ref() { m_refCountAndFlags += s_refCountIncrement; return this; }106 ALWAYS_INLINE void deref() { m_refCountAndFlags -= s_refCountIncrement; if (!(m_refCountAndFlags & s_refCountMask)) delete this; }107 ALWAYS_INLINE bool hasOneRef() const { return (m_refCountAndFlags & s_refCountMask) == s_refCountIncrement; }108 109 109 // Returns a StringImpl suitable for use on another thread. 110 110 PassRefPtr<StringImpl> crossThreadString(); … … 176 176 #endif 177 177 178 void operator delete(void*); 179 178 180 private: 179 using Noncopyable::operator new; 180 void* operator new(size_t, void* inPlace) { ASSERT(inPlace); return inPlace; } 181 // Allocation from a custom buffer is only allowed internally to avoid 182 // mismatched allocators. Callers should use create(). 183 void* operator new(size_t size); 184 void* operator new(size_t size, void* address); 181 185 182 186 static PassRefPtr<StringImpl> createStrippingNullCharactersSlowCase(const UChar*, unsigned length); … … 186 190 bool bufferIsInternal() { return m_data == reinterpret_cast<const UChar*>(this + 1); } 187 191 188 static const unsigned s_refCountMask = 0xFFFFFFFE; 189 static const unsigned s_refCountIncrement = 0x2; 190 static const unsigned s_refCountFlagInTable = 0x1; 192 enum StringImplFlags { 193 HasTerminatingNullCharacter, 194 InTable, 195 }; 191 196 192 197 const UChar* m_data; 193 SharedUChar* m_sharedBuffer;194 198 unsigned m_length; 195 unsigned m_refCountAndFlags;196 199 mutable unsigned m_hash; 200 PtrAndFlags<SharedUChar, StringImplFlags> m_sharedBufferAndFlags; 197 201 // There is a fictitious variable-length UChar array at the end, which is used 198 202 // as the internal buffer by the createUninitialized and create methods. -
trunk/WebCore/platform/win/ClipboardUtilitiesWin.cpp
r53417 r53418 115 115 if (cbData) { 116 116 PWSTR buffer = (PWSTR)::GlobalLock(cbData); 117 OwnArrayPtr<const UChar> nullTerminatedURL; 118 mutableURL.copyWithNullTermination(nullTerminatedURL); 119 OwnArrayPtr<const UChar> nullTerminatedTitle; 120 mutableTitle.copyWithNullTermination(nullTerminatedTitle); 121 swprintf_s(buffer, size, L"%s\n%s", nullTerminatedURL.get(), nullTerminatedTitle.get()); 117 swprintf_s(buffer, size, L"%s\n%s", mutableURL.charactersWithNullTermination(), mutableTitle.charactersWithNullTermination()); 122 118 ::GlobalUnlock(cbData); 123 119 } -
trunk/WebCore/storage/OriginUsageRecord.cpp
r53416 r53418 43 43 { 44 44 ASSERT(!m_databaseMap.contains(identifier)); 45 ASSERT_ARG(identifier, identifier.impl()-> hasOneRef());46 ASSERT_ARG(fullPath, fullPath.impl()-> hasOneRef());45 ASSERT_ARG(identifier, identifier.impl()->refCount() == 1); 46 ASSERT_ARG(fullPath, fullPath.impl()->refCount() == 1); 47 47 48 48 m_databaseMap.set(identifier, DatabaseEntry(fullPath)); … … 64 64 { 65 65 ASSERT(m_databaseMap.contains(identifier)); 66 ASSERT_ARG(identifier, identifier.impl()-> hasOneRef());66 ASSERT_ARG(identifier, identifier.impl()->refCount() == 1); 67 67 68 68 m_unknownSet.add(identifier);
Note: See TracChangeset
for help on using the changeset viewer.