Changeset 162192 in webkit


Ignore:
Timestamp:
Jan 17, 2014 12:16:50 AM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Unreviewed, rolling out r162185, r162186, and r162187.
http://trac.webkit.org/changeset/162185
http://trac.webkit.org/changeset/162186
http://trac.webkit.org/changeset/162187
https://bugs.webkit.org/show_bug.cgi?id=127164

Broke JSStringCreateWithCharactersNoCopy, as evidenced by a
JSC API test (Requested by ap on #webkit).

  • API/JSStringRef.cpp:

(JSStringGetCharactersPtr):
(JSStringGetUTF8CString):
(JSStringIsEqual):

  • API/JSStringRefCF.cpp:

(JSStringCreateWithCFString):
(JSStringCopyCFString):

  • API/OpaqueJSString.cpp:

(OpaqueJSString::create):
(OpaqueJSString::identifier):

  • API/OpaqueJSString.h:

(OpaqueJSString::create):
(OpaqueJSString::characters):
(OpaqueJSString::deprecatedCharacters):
(OpaqueJSString::OpaqueJSString):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSStringRef.cpp

    r162185 r162192  
    8484const JSChar* JSStringGetCharactersPtr(JSStringRef string)
    8585{
    86     return string->characters();
     86    return string->deprecatedCharacters();
    8787}
    8888
     
    9898        return 0;
    9999
    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';
    111104    if (result != conversionOK && result != targetExhausted)
    112105        return 0;
    113106
    114     return destination - buffer;
     107    return p - buffer;
    115108}
    116109
    117110bool JSStringIsEqual(JSStringRef a, JSStringRef b)
    118111{
    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));
    120114}
    121115
  • trunk/Source/JavaScriptCore/API/JSStringRefCF.cpp

    r162185 r162192  
    4141    // it can hold.  (<rdar://problem/6806478>)
    4242    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();
    4549
    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();
    5657}
    5758
    58 CFStringRef JSStringCopyCFString(CFAllocatorRef allocator, JSStringRef string)
     59CFStringRef JSStringCopyCFString(CFAllocatorRef alloc, JSStringRef string)
    5960{
    6061    if (!string->length())
    6162        return CFSTR("");
    6263
    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());
    6765}
  • trunk/Source/JavaScriptCore/API/OpaqueJSString.cpp

    r162185 r162192  
    3737    if (!string.isNull())
    3838        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;
    4840}
    4941
     
    7062    return Identifier(vm, m_string.characters16(), m_string.length());
    7163}
    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     } else
    90         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  
    2727#define OpaqueJSString_h
    2828
    29 #include <atomic>
    3029#include <wtf/ThreadSafeRefCounted.h>
    3130#include <wtf/text/WTFString.h>
     
    3736
    3837struct OpaqueJSString : public ThreadSafeRefCounted<OpaqueJSString> {
    39     static PassRefPtr<OpaqueJSString> create()
     38
     39    static PassRefPtr<OpaqueJSString> create() // null
    4040    {
    4141        return adoptRef(new OpaqueJSString);
     
    5353
    5454    JS_EXPORT_PRIVATE static PassRefPtr<OpaqueJSString> create(const String&);
    55     JS_EXPORT_PRIVATE ~OpaqueJSString();
    5655
    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; }
    6058    unsigned length() { return this ? m_string.length() : 0; }
    61 
    62     const UChar* characters();
    6359
    6460    JS_EXPORT_PRIVATE String string() const;
    6561    JSC::Identifier identifier(JSC::VM*) const;
    66 
    67     static bool equal(const OpaqueJSString*, const OpaqueJSString*);
    6862
    6963private:
     
    7670    OpaqueJSString(const String& string)
    7771        : m_string(string.isolatedCopy())
    78         , m_characters(nullptr)
    7972    {
    8073    }
     
    8275    OpaqueJSString(const LChar* characters, unsigned length)
    8376        : m_string(characters, length)
    84         , m_characters(nullptr)
    8577    {
    8678    }
     
    8880    OpaqueJSString(const UChar* characters, unsigned length)
    8981        : m_string(characters, length)
    90         , m_characters(nullptr)
    9182    {
    9283    }
    9384
    9485    String m_string;
    95 
    96     // This will be initialized on demand when characters() is called.
    97     std::atomic<UChar*> m_characters;
    9886};
    9987
  • trunk/Source/JavaScriptCore/ChangeLog

    r162187 r162192  
     12014-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
    1282014-01-16  Anders Carlsson  <andersca@apple.com>
    229
Note: See TracChangeset for help on using the changeset viewer.