Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1157)

Unified Diff: third_party/WebKit/Source/bindings/core/v8/V8StringResource.h

Issue 1389383003: WIP: Introduce CompressibleString Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: haraken's review Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698