JSStringRef JSStringCreateWithCFString(CFStringRef string) { JSC::initializeThreading(); // We cannot use CFIndex here since CFStringGetLength can return values larger than // it can hold. (<rdar://problem/6806478>) size_t length = CFStringGetLength(string); if (!length) return &OpaqueJSString::create(reinterpret_cast<const LChar*>(""), 0).leakRef(); Vector<LChar, 1024> lcharBuffer(length); CFIndex usedBufferLength; CFIndex convertedSize = CFStringGetBytes(string, CFRangeMake(0, length), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), length, &usedBufferLength); if (static_cast<size_t>(convertedSize) == length && static_cast<size_t>(usedBufferLength) == length) return &OpaqueJSString::create(lcharBuffer.data(), length).leakRef(); auto buffer = std::make_unique<UniChar[]>(length); CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get()); static_assert(sizeof(UniChar) == sizeof(UChar), "UniChar and UChar must be same size"); return &OpaqueJSString::create(reinterpret_cast<UChar*>(buffer.get()), length).leakRef(); }
String::String(CFStringRef str) { if (!str) return; CFIndex size = CFStringGetLength(str); if (size == 0) m_impl = StringImpl::empty(); else { Vector<LChar, 1024> lcharBuffer(size); CFIndex usedBufLen; CFIndex convertedsize = CFStringGetBytes(str, CFRangeMake(0, size), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), size, &usedBufLen); if ((convertedsize == size) && (usedBufLen == size)) { m_impl = StringImpl::create(lcharBuffer.data(), size); return; } Vector<UChar, 1024> buffer(size); CFStringGetCharacters(str, CFRangeMake(0, size), (UniChar*)buffer.data()); m_impl = StringImpl::create(buffer.data(), size); } }
JSStringRef JSStringCreateWithCFString(CFStringRef string) { JSC::initializeThreading(); // We cannot use CFIndex here since CFStringGetLength can return values larger than // it can hold. (<rdar://problem/6806478>) size_t length = CFStringGetLength(string); if (length) { Vector<LChar, 1024> lcharBuffer(length); CFIndex usedBufferLength; CFIndex convertedSize = CFStringGetBytes(string, CFRangeMake(0, length), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), length, &usedBufferLength); if (static_cast<size_t>(convertedSize) == length && static_cast<size_t>(usedBufferLength) == length) return OpaqueJSString::create(lcharBuffer.data(), length).leakRef(); OwnArrayPtr<UniChar> buffer = adoptArrayPtr(new UniChar[length]); CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get()); COMPILE_ASSERT(sizeof(UniChar) == sizeof(UChar), unichar_and_uchar_must_be_same_size); return OpaqueJSString::create(reinterpret_cast<UChar*>(buffer.get()), length).leakRef(); } else { return OpaqueJSString::create(static_cast<const LChar*>(0), 0).leakRef(); } }