Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2009, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2009, 2012 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 if (!isMainThread()) { | 89 if (!isMainThread()) { |
| 90 internal::callOnMainThread(&deallocateOnMainThread, header); | 90 internal::callOnMainThread(&deallocateOnMainThread, header); |
| 91 } else { | 91 } else { |
| 92 underlyingString->deref(); // Balanced by call to ref in allocate above. | 92 underlyingString->deref(); // Balanced by call to ref in allocate above. |
| 93 WTF::Partitions::fastFree(header); | 93 WTF::Partitions::fastFree(header); |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 static CFIndex preferredSize(CFIndex size, CFOptionFlags, void*) { | 98 static CFIndex preferredSize(CFIndex size, CFOptionFlags, void*) { |
| 99 // FIXME: If FastMalloc provided a "good size" callback, we'd want to use it h ere. | 99 // FIXME: If FastMalloc provided a "good size" callback, we'd want to use it |
| 100 // Note that this optimization would help performance for strings created with the | 100 // here. Note that this optimization would help performance for strings |
| 101 // allocator that are mutable, and those typically are only created by callers who | 101 // created with the allocator that are mutable, and those typically are only |
| 102 // make a new string using the old string's allocator, such as some of the cal l | 102 // created by callers who make a new string using the old string's allocator, |
| 103 // sites in CFURL. | 103 // such as some of the call sites in CFURL. |
| 104 return size; | 104 return size; |
| 105 } | 105 } |
| 106 | 106 |
| 107 static CFAllocatorRef create() { | 107 static CFAllocatorRef create() { |
| 108 CFAllocatorContext context = { | 108 CFAllocatorContext context = { |
| 109 0, 0, retain, release, copyDescription, | 109 0, 0, retain, release, copyDescription, |
| 110 allocate, reallocate, deallocate, preferredSize}; | 110 allocate, reallocate, deallocate, preferredSize}; |
| 111 return CFAllocatorCreate(0, &context); | 111 return CFAllocatorCreate(0, &context); |
| 112 } | 112 } |
| 113 | 113 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 124 if (!m_length || !isMainThread()) { | 124 if (!m_length || !isMainThread()) { |
| 125 if (is8Bit()) | 125 if (is8Bit()) |
| 126 return adoptCF(CFStringCreateWithBytes( | 126 return adoptCF(CFStringCreateWithBytes( |
| 127 0, reinterpret_cast<const UInt8*>(characters8()), m_length, | 127 0, reinterpret_cast<const UInt8*>(characters8()), m_length, |
| 128 kCFStringEncodingISOLatin1, false)); | 128 kCFStringEncodingISOLatin1, false)); |
| 129 return adoptCF(CFStringCreateWithCharacters( | 129 return adoptCF(CFStringCreateWithCharacters( |
| 130 0, reinterpret_cast<const UniChar*>(characters16()), m_length)); | 130 0, reinterpret_cast<const UniChar*>(characters16()), m_length)); |
| 131 } | 131 } |
| 132 CFAllocatorRef allocator = StringWrapperCFAllocator::allocator(); | 132 CFAllocatorRef allocator = StringWrapperCFAllocator::allocator(); |
| 133 | 133 |
| 134 // Put pointer to the StringImpl in a global so the allocator can store it wit h the CFString. | 134 // Put pointer to the StringImpl in a global so the allocator can store it |
| 135 // with the CFString. | |
| 135 ASSERT(!StringWrapperCFAllocator::currentString); | 136 ASSERT(!StringWrapperCFAllocator::currentString); |
| 136 StringWrapperCFAllocator::currentString = this; | 137 StringWrapperCFAllocator::currentString = this; |
| 137 | 138 |
| 138 CFStringRef string; | 139 CFStringRef string; |
| 139 if (is8Bit()) | 140 if (is8Bit()) |
| 140 string = CFStringCreateWithBytesNoCopy( | 141 string = CFStringCreateWithBytesNoCopy( |
| 141 allocator, reinterpret_cast<const UInt8*>(characters8()), m_length, | 142 allocator, reinterpret_cast<const UInt8*>(characters8()), m_length, |
| 142 kCFStringEncodingISOLatin1, false, kCFAllocatorNull); | 143 kCFStringEncodingISOLatin1, false, kCFAllocatorNull); |
| 143 else | 144 else |
| 144 string = CFStringCreateWithCharactersNoCopy( | 145 string = CFStringCreateWithCharactersNoCopy( |
| 145 allocator, reinterpret_cast<const UniChar*>(characters16()), m_length, | 146 allocator, reinterpret_cast<const UniChar*>(characters16()), m_length, |
| 146 kCFAllocatorNull); | 147 kCFAllocatorNull); |
| 147 // CoreFoundation might not have to allocate anything, we clear currentString in case we did not execute allocate(). | 148 // CoreFoundation might not have to allocate anything, we clear currentString |
| 149 // in case we did not execute allocate(). | |
| 148 StringWrapperCFAllocator::currentString = 0; | 150 StringWrapperCFAllocator::currentString = 0; |
| 149 | 151 |
| 150 return adoptCF(string); | 152 return adoptCF(string); |
| 151 } | 153 } |
| 152 | 154 |
| 153 // On StringImpl creation we could check if the allocator is the StringWrapperCF Allocator. | 155 // On StringImpl creation we could check if the allocator is the |
| 154 // If it is, then we could find the original StringImpl and just return that. Bu t to | 156 // StringWrapperCFAllocator. If it is, then we could find the original |
| 155 // do that we'd have to compute the offset from CFStringRef to the allocated blo ck; | 157 // StringImpl and just return that. But to do that we'd have to compute the |
|
dcheng
2016/10/01 03:06:14
Out of curiosity, why are the spaces inconsistent
Nico
2016/10/01 16:42:24
I used vim's gq to reflow comments. The . was at e
| |
| 156 // the CFStringRef is *not* at the start of an allocated block. Testing shows 10 00x | 158 // offset from CFStringRef to the allocated block; the CFStringRef is *not* at |
| 157 // more calls to createCFString than calls to the create functions with the appr opriate | 159 // the start of an allocated block. Testing shows 1000x more calls to |
| 160 // createCFString than calls to the create functions with the appropriate | |
| 158 // allocator, so it's probably not urgent optimize that case. | 161 // allocator, so it's probably not urgent optimize that case. |
| 159 | 162 |
| 160 } // namespace WTF | 163 } // namespace WTF |
| 161 | 164 |
| 162 #endif // OS(MACOSX) | 165 #endif // OS(MACOSX) |
| OLD | NEW |