Example #1
0
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);
    }
}
Example #3
0
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();
    }
}