Index: third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp |
index afb0dde5a7098e3586512891f6b6fafd91578856..50c7c042c30fd093d8165e68f06c8cbf3cecd767 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp |
@@ -84,6 +84,27 @@ static v8::Local<v8::String> makeExternalString(v8::Isolate* isolate, const Stri |
return newString; |
} |
+static v8::Local<v8::String> makeExternalString(v8::Isolate* isolate, PassRefPtr<CompressableString> string) |
+{ |
+ if (string->is8Bit()) { |
+ WebCoreCompressableStringResource8* stringResource = new WebCoreCompressableStringResource8(string); |
+ v8::Local<v8::String> newString; |
+ if (!v8::String::NewExternalOneByte(isolate, stringResource).ToLocal(&newString)) { |
+ delete stringResource; |
+ return v8::String::Empty(isolate); |
+ } |
+ return newString; |
+ } |
+ |
+ WebCoreCompressableStringResource16* stringResource = new WebCoreCompressableStringResource16(string); |
+ v8::Local<v8::String> newString; |
+ if (!v8::String::NewExternalTwoByte(isolate, stringResource).ToLocal(&newString)) { |
+ delete stringResource; |
+ return v8::String::Empty(isolate); |
+ } |
+ return newString; |
+} |
+ |
v8::Local<v8::String> StringCache::v8ExternalStringSlow(v8::Isolate* isolate, StringImpl* stringImpl) |
{ |
if (!stringImpl->length()) |
@@ -99,6 +120,14 @@ v8::Local<v8::String> StringCache::v8ExternalStringSlow(v8::Isolate* isolate, St |
return createStringAndInsertIntoCache(isolate, stringImpl); |
} |
+v8::Local<v8::String> StringCache::v8ExternalStringSlow(v8::Isolate* isolate, PassRefPtr<CompressableString> string) |
+{ |
+ if (!string->length()) |
+ return v8::String::Empty(isolate); |
+ |
+ return createStringAndInsertIntoCache(isolate, string); |
+} |
+ |
void StringCache::setReturnValueFromStringSlow(v8::ReturnValue<v8::Value> returnValue, StringImpl* stringImpl) |
{ |
if (!stringImpl->length()) { |
@@ -136,6 +165,26 @@ v8::Local<v8::String> StringCache::createStringAndInsertIntoCache(v8::Isolate* i |
return newString; |
} |
+v8::Local<v8::String> StringCache::createStringAndInsertIntoCache(v8::Isolate* isolate, PassRefPtr<CompressableString> string) |
+{ |
+ // ASSERT(!m_stringCache.Contains(stringImpl)); |
+ ASSERT(string->length()); |
+ |
+ v8::Local<v8::String> newString = makeExternalString(isolate, string); |
+ ASSERT(!newString.IsEmpty()); |
+ ASSERT(newString->Length()); |
+ |
+ v8::UniquePersistent<v8::String> wrapper(isolate, newString); |
+ |
+ // TODO(hajimehoshi): I'm not sure this ref is needed. |
+ // string->ref(); |
+ wrapper.MarkIndependent(); |
+ // m_stringCache.Set(stringImpl, wrapper.Pass(), &m_lastV8String); |
+ // m_lastStringImpl = stringImpl; |
+ |
+ return newString; |
+} |
+ |
void StringCache::InvalidateLastString() |
{ |
m_lastStringImpl = nullptr; |