Changeset 51707 in webkit


Ignore:
Timestamp:
Dec 4, 2009 12:16:02 PM (14 years ago)
Author:
eric@webkit.org
Message:

2009-12-04 Anton Muhin <antonm@chromium.org>

Reviewed by Dmitry Titov.

Do not use WebCore::String::String(const UChar*, int length) to convert
short v8 strings.

Plus added string traits.
https://bugs.webkit.org/show_bug.cgi?id=31415

  • bindings/v8/V8Binding.cpp: (WebCore::): (WebCore::v8StringToWebCoreString):
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r51706 r51707  
     12009-12-04  Anton Muhin  <antonm@chromium.org>
     2
     3        Reviewed by Dmitry Titov.
     4
     5        Do not use WebCore::String::String(const UChar*, int length) to convert
     6        short v8 strings.
     7
     8        Plus added string traits.
     9        https://bugs.webkit.org/show_bug.cgi?id=31415
     10
     11        * bindings/v8/V8Binding.cpp:
     12        (WebCore::):
     13        (WebCore::v8StringToWebCoreString):
     14
    1152009-12-04  Chris Fleizach  <cfleizach@apple.com>
    216
  • trunk/WebCore/bindings/v8/V8Binding.cpp

    r50967 r51707  
    107107    }
    108108
    109     // Returns right string type based on a dummy parameter.
    110     String string(String) { return webcoreString(); }
    111     AtomicString string(AtomicString) { return atomicString(); }
    112 
    113109    static WebCoreStringResource* toStringResource(v8::Handle<v8::String> v8String)
    114110    {
     
    245241
    246242
     243template <class S> struct StringTraits
     244{
     245    static S fromStringResource(WebCoreStringResource* resource);
     246
     247    static S fromV8String(v8::Handle<v8::String> v8String, int length);
     248};
     249
     250template<>
     251struct StringTraits<String>
     252{
     253    static String fromStringResource(WebCoreStringResource* resource)
     254    {
     255        return resource->webcoreString();
     256    }
     257
     258    static String fromV8String(v8::Handle<v8::String> v8String, int length)
     259    {
     260        ASSERT(v8String->Length() == length);
     261        // NOTE: as of now, String(const UChar*, int) performs String::createUninitialized
     262        // anyway, so no need to optimize like we do for AtomicString below.
     263        UChar* buffer;
     264        String result = String::createUninitialized(length, buffer);
     265        v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
     266        return result;
     267    }
     268};
     269
     270template<>
     271struct StringTraits<AtomicString>
     272{
     273    static AtomicString fromStringResource(WebCoreStringResource* resource)
     274    {
     275        return resource->atomicString();
     276    }
     277
     278    static AtomicString fromV8String(v8::Handle<v8::String> v8String, int length)
     279    {
     280        ASSERT(v8String->Length() == length);
     281        static const int inlineBufferSize = 16;
     282        if (length <= inlineBufferSize) {
     283            UChar inlineBuffer[inlineBufferSize];
     284            v8String->Write(reinterpret_cast<uint16_t*>(inlineBuffer), 0, length);
     285            return AtomicString(inlineBuffer, length);
     286        }
     287        UChar* buffer;
     288        String tmp = String::createUninitialized(length, buffer);
     289        v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
     290        return AtomicString(tmp);
     291    }
     292};
     293
    247294template <typename StringType>
    248295StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external)
     
    250297    WebCoreStringResource* stringResource = WebCoreStringResource::toStringResource(v8String);
    251298    if (stringResource)
    252         return stringResource->string(StringType());
     299        return StringTraits<StringType>::fromStringResource(stringResource);
    253300
    254301    int length = v8String->Length();
     
    258305    }
    259306
    260     StringType result;
    261     static const int inlineBufferSize = 16;
    262     if (length <= inlineBufferSize) {
    263         UChar inlineBuffer[inlineBufferSize];
    264         v8String->Write(reinterpret_cast<uint16_t*>(inlineBuffer), 0, length);
    265         result = StringType(inlineBuffer, length);
    266     } else {
    267         UChar* buffer;
    268         String tmp = String::createUninitialized(length, buffer);
    269         v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
    270         result = StringType(tmp);
    271     }
     307    StringType result(StringTraits<StringType>::fromV8String(v8String, length));
    272308
    273309    if (external == Externalize && v8String->CanMakeExternal()) {
Note: See TracChangeset for help on using the changeset viewer.