Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/V8StringResource.h |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h |
| index 83316f8f6e49a5432c9895c4287c5c0264872e83..06adddc52ac841492194dbf150f6b68f47d2aeab 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h |
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h |
| @@ -28,6 +28,7 @@ |
| #include "bindings/core/v8/ExceptionState.h" |
| #include "core/CoreExport.h" |
| +#include "platform/text/CompressibleString.h" |
| #include "wtf/Allocator.h" |
| #include "wtf/Threading.h" |
| #include "wtf/text/AtomicString.h" |
| @@ -62,24 +63,54 @@ public: |
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryConsumption(string)); |
| } |
| + explicit WebCoreStringResourceBase(const CompressibleString& string) |
| + : m_compressibleString(string) |
| + { |
| +#if ENABLE(ASSERT) |
| + m_threadId = WTF::currentThread(); |
| +#endif |
| + ASSERT(!string.isNull()); |
| + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryConsumption(string)); |
| + } |
| + |
| virtual ~WebCoreStringResourceBase() |
| { |
| #if ENABLE(ASSERT) |
| ASSERT(m_threadId == WTF::currentThread()); |
| #endif |
| - int reducedExternalMemory = -memoryConsumption(m_plainString); |
| - if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isNull()) |
| - reducedExternalMemory -= memoryConsumption(m_atomicString.string()); |
| + int reducedExternalMemory = 0; |
| + if (LIKELY(m_compressibleString.isNull())) { |
| + reducedExternalMemory = -memoryConsumption(m_plainString); |
| + if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isNull()) |
| + reducedExternalMemory -= memoryConsumption(m_atomicString.string()); |
| + } else { |
| + reducedExternalMemory = -memoryConsumption(m_compressibleString); |
| + } |
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(reducedExternalMemory); |
| + |
| + // FIX this! |
| } |
| - const String& webcoreString() { return m_plainString; } |
| + String webcoreString() |
| + { |
| + if (!m_compressibleString.isNull()) { |
| + ASSERT(m_plainString.isNull()); |
| + ASSERT(m_atomicString.isNull()); |
| + return m_compressibleString.toString(); |
| + } |
| + return m_plainString; |
| + } |
| - const AtomicString& atomicString() |
| + AtomicString atomicString() |
| { |
| #if ENABLE(ASSERT) |
| ASSERT(m_threadId == WTF::currentThread()); |
| #endif |
| + if (!m_compressibleString.isNull()) { |
| + ASSERT(m_plainString.isNull()); |
| + ASSERT(m_atomicString.isNull()); |
| + return AtomicString(m_compressibleString.toString()); |
| + } |
| if (m_atomicString.isNull()) { |
| m_atomicString = AtomicString(m_plainString); |
| ASSERT(!m_atomicString.isNull()); |
| @@ -89,6 +120,8 @@ public: |
| return m_atomicString; |
| } |
| + const CompressibleString& compressibleString() { return m_compressibleString; } |
| + |
| protected: |
| // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it. |
| String m_plainString; |
| @@ -99,11 +132,21 @@ protected: |
| // into that string. |
| AtomicString m_atomicString; |
| + CompressibleString m_compressibleString; |
| + |
| private: |
| static int memoryConsumption(const String& string) |
| { |
| return string.length() * (string.is8Bit() ? sizeof(LChar) : sizeof(UChar)); |
| } |
| + |
| + // TODO(hajimehoshi): This returns the size of |string| not compressed so |
| + // far. Is this really OK? |
| + static int memoryConsumption(const CompressibleString& string) |
| + { |
| + return string.contentSizeInBytes(); |
| + } |
| + |
| #if ENABLE(ASSERT) |
| WTF::ThreadIdentifier m_threadId; |
| #endif |
| @@ -153,6 +196,51 @@ public: |
| } |
| }; |
| +class WebCoreCompressibleStringResource16 final : public WebCoreStringResourceBase, public v8::String::ExternalStringResource { |
| + WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource16); |
| +public: |
| + explicit WebCoreCompressibleStringResource16(const CompressibleString& string) |
| + : WebCoreStringResourceBase(string) |
| + { |
| + // ASSERT(m_string); |
| + ASSERT(!m_compressibleString.is8Bit()); |
| + } |
| + |
| + bool isCompressible() override { return true; } |
| + |
| + size_t length() const override |
| + { |
| + return m_compressibleString.length(); |
| + } |
| + |
| + const uint16_t* data() const override |
| + { |
| + return reinterpret_cast<const uint16_t*>(m_compressibleString.characters16()); |
| + } |
| +}; |
| + |
| +class WebCoreCompressibleStringResource8 final : public WebCoreStringResourceBase, public v8::String::ExternalOneByteStringResource { |
| + WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource8); |
| +public: |
| + explicit WebCoreCompressibleStringResource8(const CompressibleString& string) |
| + : WebCoreStringResourceBase(string) |
| + { |
| + ASSERT(m_compressibleString.is8Bit()); |
| + } |
| + |
| + bool isCompressible() override { return true; } |
| + |
| + size_t length() const override |
| + { |
| + return m_compressibleString.length(); |
| + } |
| + |
| + const char* data() const override |
| + { |
| + return reinterpret_cast<const char*>(m_compressibleString.characters8()); |
| + } |
| +}; |
| + |
| enum ExternalMode { |
| Externalize, |
| DoNotExternalize |
| @@ -162,6 +250,9 @@ template <typename StringType> |
| CORE_EXPORT StringType v8StringToWebCoreString(v8::Local<v8::String>, ExternalMode); |
| CORE_EXPORT String int32ToWebCoreString(int value); |
| +template <typename StringType> |
| +CORE_EXPORT StringType v8StringToWebCoreString2(v8::Local<v8::String>, ExternalMode); |
|
haraken
2015/11/26 11:50:03
Remove this.
hajimehoshi
2015/11/27 11:03:58
Oops, done.
|
| + |
| // V8StringResource is an adapter class that converts V8 values to Strings |
| // or AtomicStrings as appropriate, using multiple typecast operators. |
| enum V8StringResourceMode { |