| Index: Source/bindings/v8/V8StringResource.cpp
|
| diff --git a/Source/bindings/v8/V8StringResource.cpp b/Source/bindings/v8/V8StringResource.cpp
|
| index bce62d4c2faaf394d35fb3f8dddbb8d931748571..0a6c8555fd91f11869bc6daf5c8a3cc81171c227 100644
|
| --- a/Source/bindings/v8/V8StringResource.cpp
|
| +++ b/Source/bindings/v8/V8StringResource.cpp
|
| @@ -52,7 +52,7 @@ void WebCoreStringResourceBase::visitStrings(ExternalStringVisitor* visitor)
|
|
|
| template<class StringClass> struct StringTraits {
|
| static const StringClass& fromStringResource(WebCoreStringResourceBase*);
|
| - template<bool oneByte>
|
| + template <typename V8StringTrait>
|
| static StringClass fromV8String(v8::Handle<v8::String>, int);
|
| };
|
|
|
| @@ -62,7 +62,7 @@ struct StringTraits<String> {
|
| {
|
| return resource->webcoreString();
|
| }
|
| - template<bool oneByte>
|
| + template <typename V8StringTrait>
|
| static String fromV8String(v8::Handle<v8::String>, int);
|
| };
|
|
|
| @@ -72,59 +72,49 @@ struct StringTraits<AtomicString> {
|
| {
|
| return resource->atomicString();
|
| }
|
| - template<bool oneByte>
|
| + template <typename V8StringTrait>
|
| static AtomicString fromV8String(v8::Handle<v8::String>, int);
|
| };
|
|
|
| -template<>
|
| -String StringTraits<String>::fromV8String<false>(v8::Handle<v8::String> v8String, int length)
|
| -{
|
| - ASSERT(v8String->Length() == length);
|
| - UChar* buffer;
|
| - String result = String::createUninitialized(length, buffer);
|
| - v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
|
| - return result;
|
| -}
|
| +struct V8StringTwoBytesTrait {
|
| + typedef UChar CharType;
|
| + ALWAYS_INLINE static void write(v8::Handle<v8::String> v8String, CharType* buffer, int length)
|
| + {
|
| + v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
|
| + }
|
| +};
|
|
|
| -template<>
|
| -AtomicString StringTraits<AtomicString>::fromV8String<false>(v8::Handle<v8::String> v8String, int length)
|
| -{
|
| - ASSERT(v8String->Length() == length);
|
| - static const int inlineBufferSize = 16;
|
| - if (length <= inlineBufferSize) {
|
| - UChar inlineBuffer[inlineBufferSize];
|
| - v8String->Write(reinterpret_cast<uint16_t*>(inlineBuffer), 0, length);
|
| - return AtomicString(inlineBuffer, length);
|
| +struct V8StringOneByteTrait {
|
| + typedef LChar CharType;
|
| + ALWAYS_INLINE static void write(v8::Handle<v8::String> v8String, CharType* buffer, int length)
|
| + {
|
| + v8String->WriteOneByte(buffer, 0, length);
|
| }
|
| - UChar* buffer;
|
| - String result = String::createUninitialized(length, buffer);
|
| - v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
|
| - return AtomicString(result);
|
| -}
|
| +};
|
|
|
| -template<>
|
| -String StringTraits<String>::fromV8String<true>(v8::Handle<v8::String> v8String, int length)
|
| +template <typename V8StringTrait>
|
| +String StringTraits<String>::fromV8String(v8::Handle<v8::String> v8String, int length)
|
| {
|
| ASSERT(v8String->Length() == length);
|
| - LChar* buffer;
|
| + typename V8StringTrait::CharType* buffer;
|
| String result = String::createUninitialized(length, buffer);
|
| - v8String->WriteOneByte(buffer, 0, length);
|
| + V8StringTrait::write(v8String, buffer, length);
|
| return result;
|
| }
|
|
|
| -template<>
|
| -AtomicString StringTraits<AtomicString>::fromV8String<true>(v8::Handle<v8::String> v8String, int length)
|
| +template <typename V8StringTrait>
|
| +AtomicString StringTraits<AtomicString>::fromV8String(v8::Handle<v8::String> v8String, int length)
|
| {
|
| ASSERT(v8String->Length() == length);
|
| - static const int inlineBufferSize = 32;
|
| + static const int inlineBufferSize = 32 / sizeof(typename V8StringTrait::CharType);
|
| if (length <= inlineBufferSize) {
|
| - LChar inlineBuffer[inlineBufferSize];
|
| - v8String->WriteOneByte(inlineBuffer, 0, length);
|
| + typename V8StringTrait::CharType inlineBuffer[inlineBufferSize];
|
| + V8StringTrait::write(v8String, inlineBuffer, length);
|
| return AtomicString(inlineBuffer, length);
|
| }
|
| - LChar* buffer;
|
| + typename V8StringTrait::CharType* buffer;
|
| String string = String::createUninitialized(length, buffer);
|
| - v8String->WriteOneByte(buffer, 0, length);
|
| + V8StringTrait::write(v8String, buffer, length);
|
| return AtomicString(string);
|
| }
|
|
|
| @@ -151,7 +141,7 @@ StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode
|
| return StringType("");
|
|
|
| bool oneByte = v8String->ContainsOnlyOneByte();
|
| - StringType result(oneByte ? StringTraits<StringType>::template fromV8String<true>(v8String, length) : StringTraits<StringType>::template fromV8String<false>(v8String, length));
|
| + StringType result(oneByte ? StringTraits<StringType>::template fromV8String<V8StringOneByteTrait>(v8String, length) : StringTraits<StringType>::template fromV8String<V8StringTwoBytesTrait>(v8String, length));
|
|
|
| if (external != Externalize || !v8String->CanMakeExternal())
|
| return result;
|
|
|