summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8StringResource.cpp85
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;