| 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;
|
|
|