diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp | 85 |
1 files changed, 28 insertions, 57 deletions
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp index bce62d4c2fa..3b76e8243f9 100644 --- a/chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp +++ b/chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp @@ -32,27 +32,9 @@ namespace WebCore { -WebCoreStringResourceBase* WebCoreStringResourceBase::toWebCoreStringResourceBase(v8::Handle<v8::String> string) -{ - v8::String::Encoding encoding; - v8::String::ExternalStringResourceBase* resource = string->GetExternalStringResourceBase(&encoding); - if (!resource) - return 0; - if (encoding == v8::String::ONE_BYTE_ENCODING) - return static_cast<WebCoreStringResource8*>(resource); - return static_cast<WebCoreStringResource16*>(resource); -} - -void WebCoreStringResourceBase::visitStrings(ExternalStringVisitor* visitor) -{ - visitor->visitJSExternalString(m_plainString.impl()); - if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isNull()) - visitor->visitJSExternalString(m_atomicString.impl()); -} - 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 +44,7 @@ struct StringTraits<String> { { return resource->webcoreString(); } - template<bool oneByte> + template <typename V8StringTrait> static String fromV8String(v8::Handle<v8::String>, int); }; @@ -72,59 +54,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); } @@ -132,7 +104,6 @@ template<typename StringType> StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external) { { - // A lot of WebCoreStringResourceBase::toWebCoreStringResourceBase is copied here by hand for performance reasons. // This portion of this function is very hot in certain Dromeao benchmarks. v8::String::Encoding encoding; v8::String::ExternalStringResourceBase* resource = v8String->GetExternalStringResourceBase(&encoding); @@ -151,7 +122,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; |