Changeset 162192 in webkit
- Timestamp:
- Jan 17, 2014 12:16:50 AM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSStringRef.cpp
r162185 r162192 84 84 const JSChar* JSStringGetCharactersPtr(JSStringRef string) 85 85 { 86 return string-> characters();86 return string->deprecatedCharacters(); 87 87 } 88 88 … … 98 98 return 0; 99 99 100 char* destination = buffer; 101 ConversionResult result; 102 if (string->is8Bit()) { 103 const LChar* source = string->characters8(); 104 result = convertLatin1ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1); 105 } else { 106 const UChar* source = string->characters16(); 107 result = convertUTF16ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1, true); 108 } 109 110 *destination++ = '\0'; 100 char* p = buffer; 101 const UChar* d = string->deprecatedCharacters(); 102 ConversionResult result = convertUTF16ToUTF8(&d, d + string->length(), &p, p + bufferSize - 1, true); 103 *p++ = '\0'; 111 104 if (result != conversionOK && result != targetExhausted) 112 105 return 0; 113 106 114 return destination- buffer;107 return p - buffer; 115 108 } 116 109 117 110 bool JSStringIsEqual(JSStringRef a, JSStringRef b) 118 111 { 119 return OpaqueJSString::equal(a, b); 112 unsigned len = a->length(); 113 return len == b->length() && 0 == memcmp(a->deprecatedCharacters(), b->deprecatedCharacters(), len * sizeof(UChar)); 120 114 } 121 115 -
trunk/Source/JavaScriptCore/API/JSStringRefCF.cpp
r162185 r162192 41 41 // it can hold. (<rdar://problem/6806478>) 42 42 size_t length = CFStringGetLength(string); 43 if (!length) 44 return OpaqueJSString::create(reinterpret_cast<const LChar*>(""), 0).leakRef(); 43 if (length) { 44 Vector<LChar, 1024> lcharBuffer(length); 45 CFIndex usedBufferLength; 46 CFIndex convertedSize = CFStringGetBytes(string, CFRangeMake(0, length), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), length, &usedBufferLength); 47 if (static_cast<size_t>(convertedSize) == length && static_cast<size_t>(usedBufferLength) == length) 48 return OpaqueJSString::create(lcharBuffer.data(), length).leakRef(); 45 49 46 Vector<LChar, 1024> lcharBuffer(length); 47 CFIndex usedBufferLength; 48 CFIndex convertedSize = CFStringGetBytes(string, CFRangeMake(0, length), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), length, &usedBufferLength); 49 if (static_cast<size_t>(convertedSize) == length && static_cast<size_t>(usedBufferLength) == length) 50 return OpaqueJSString::create(lcharBuffer.data(), length).leakRef(); 51 52 auto buffer = std::make_unique<UniChar[]>(length); 53 CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get()); 54 static_assert(sizeof(UniChar) == sizeof(UChar), "UniChar and UChar must be same size"); 55 return OpaqueJSString::create(reinterpret_cast<UChar*>(buffer.get()), length).leakRef(); 50 auto buffer = std::make_unique<UniChar[]>(length); 51 CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get()); 52 COMPILE_ASSERT(sizeof(UniChar) == sizeof(UChar), unichar_and_uchar_must_be_same_size); 53 return OpaqueJSString::create(reinterpret_cast<UChar*>(buffer.get()), length).leakRef(); 54 } 55 56 return OpaqueJSString::create(reinterpret_cast<const LChar*>(""), 0).leakRef(); 56 57 } 57 58 58 CFStringRef JSStringCopyCFString(CFAllocatorRef alloc ator, JSStringRef string)59 CFStringRef JSStringCopyCFString(CFAllocatorRef alloc, JSStringRef string) 59 60 { 60 61 if (!string->length()) 61 62 return CFSTR(""); 62 63 63 if (string->is8Bit()) 64 return CFStringCreateWithBytes(allocator, reinterpret_cast<const UInt8*>(string->characters8()), string->length(), kCFStringEncodingISOLatin1, false); 65 66 return CFStringCreateWithCharacters(allocator, reinterpret_cast<const UniChar*>(string->characters16()), string->length()); 64 return CFStringCreateWithCharacters(alloc, reinterpret_cast<const UniChar*>(string->deprecatedCharacters()), string->length()); 67 65 } -
trunk/Source/JavaScriptCore/API/OpaqueJSString.cpp
r162185 r162192 37 37 if (!string.isNull()) 38 38 return adoptRef(new OpaqueJSString(string)); 39 return nullptr; 40 } 41 42 OpaqueJSString::~OpaqueJSString() 43 { 44 if (UChar* characters = m_characters) { 45 // m_characters is put in a local here to avoid an extra atomic load. 46 fastFree(static_cast<void*>(characters)); 47 } 39 return 0; 48 40 } 49 41 … … 70 62 return Identifier(vm, m_string.characters16(), m_string.length()); 71 63 } 72 73 const UChar* OpaqueJSString::characters()74 {75 if (!this)76 return nullptr;77 78 // m_characters is put in a local here to avoid an extra atomic load.79 UChar* characters = m_characters;80 if (characters)81 return characters;82 83 unsigned length = m_string.length();84 UChar* newCharacters = static_cast<UChar*>(fastMalloc(length * sizeof(UChar)));85 86 if (m_string.is8Bit()) {87 for (size_t i = 0; i < length; ++i)88 newCharacters[i] = m_string.characters8()[i];89 } else90 memcpy(newCharacters, m_string.characters16(), length * sizeof(UChar));91 92 if (!m_characters.compare_exchange_strong(characters, newCharacters)) {93 fastFree(newCharacters);94 return characters;95 }96 97 return newCharacters;98 }99 100 bool OpaqueJSString::equal(const OpaqueJSString* a, const OpaqueJSString* b)101 {102 if (a == b)103 return true;104 105 if (!a || !b)106 return false;107 108 return a->m_string == b->m_string;109 }110 111 -
trunk/Source/JavaScriptCore/API/OpaqueJSString.h
r162187 r162192 27 27 #define OpaqueJSString_h 28 28 29 #include <atomic>30 29 #include <wtf/ThreadSafeRefCounted.h> 31 30 #include <wtf/text/WTFString.h> … … 37 36 38 37 struct OpaqueJSString : public ThreadSafeRefCounted<OpaqueJSString> { 39 static PassRefPtr<OpaqueJSString> create() 38 39 static PassRefPtr<OpaqueJSString> create() // null 40 40 { 41 41 return adoptRef(new OpaqueJSString); … … 53 53 54 54 JS_EXPORT_PRIVATE static PassRefPtr<OpaqueJSString> create(const String&); 55 JS_EXPORT_PRIVATE ~OpaqueJSString();56 55 57 bool is8Bit() { return this ? m_string.is8Bit() : false; } 58 const LChar* characters8() { return this ? m_string.characters8() : nullptr; } 59 const UChar* characters16() { return this ? m_string.characters16() : nullptr; } 56 const UChar* characters() { return deprecatedCharacters(); } // FIXME: Delete this. 57 const UChar* deprecatedCharacters() { return this ? m_string.deprecatedCharacters() : nullptr; } 60 58 unsigned length() { return this ? m_string.length() : 0; } 61 62 const UChar* characters();63 59 64 60 JS_EXPORT_PRIVATE String string() const; 65 61 JSC::Identifier identifier(JSC::VM*) const; 66 67 static bool equal(const OpaqueJSString*, const OpaqueJSString*);68 62 69 63 private: … … 76 70 OpaqueJSString(const String& string) 77 71 : m_string(string.isolatedCopy()) 78 , m_characters(nullptr)79 72 { 80 73 } … … 82 75 OpaqueJSString(const LChar* characters, unsigned length) 83 76 : m_string(characters, length) 84 , m_characters(nullptr)85 77 { 86 78 } … … 88 80 OpaqueJSString(const UChar* characters, unsigned length) 89 81 : m_string(characters, length) 90 , m_characters(nullptr)91 82 { 92 83 } 93 84 94 85 String m_string; 95 96 // This will be initialized on demand when characters() is called.97 std::atomic<UChar*> m_characters;98 86 }; 99 87 -
trunk/Source/JavaScriptCore/ChangeLog
r162187 r162192 1 2014-01-17 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r162185, r162186, and r162187. 4 http://trac.webkit.org/changeset/162185 5 http://trac.webkit.org/changeset/162186 6 http://trac.webkit.org/changeset/162187 7 https://bugs.webkit.org/show_bug.cgi?id=127164 8 9 Broke JSStringCreateWithCharactersNoCopy, as evidenced by a 10 JSC API test (Requested by ap on #webkit). 11 12 * API/JSStringRef.cpp: 13 (JSStringGetCharactersPtr): 14 (JSStringGetUTF8CString): 15 (JSStringIsEqual): 16 * API/JSStringRefCF.cpp: 17 (JSStringCreateWithCFString): 18 (JSStringCopyCFString): 19 * API/OpaqueJSString.cpp: 20 (OpaqueJSString::create): 21 (OpaqueJSString::identifier): 22 * API/OpaqueJSString.h: 23 (OpaqueJSString::create): 24 (OpaqueJSString::characters): 25 (OpaqueJSString::deprecatedCharacters): 26 (OpaqueJSString::OpaqueJSString): 27 1 28 2014-01-16 Anders Carlsson <andersca@apple.com> 2 29
Note: See TracChangeset
for help on using the changeset viewer.