summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp55
1 files changed, 35 insertions, 20 deletions
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp
index 0681d0c059b..6d64a56169c 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/V8ValueCache.cpp
@@ -27,11 +27,33 @@
#include "bindings/v8/V8ValueCache.h"
#include "bindings/v8/V8Binding.h"
-#include "bindings/v8/V8Utilities.h"
#include "wtf/text/StringHash.h"
namespace WebCore {
+StringCacheMapTraits::MapType* StringCacheMapTraits::MapFromWeakCallbackData(
+ const v8::WeakCallbackData<v8::String, WeakCallbackDataType>& data)
+{
+ return &(V8PerIsolateData::from(data.GetIsolate())->stringCache()->m_stringCache);
+}
+
+
+void StringCacheMapTraits::Dispose(
+ v8::Isolate* isolate, v8::UniquePersistent<v8::String> value, StringImpl* key)
+{
+ V8PerIsolateData::from(isolate)->stringCache()->InvalidateLastString();
+ key->deref();
+}
+
+
+StringCache::~StringCache()
+{
+ // The MapType::Dispose callback calls StringCache::InvalidateLastString,
+ // which will only work while the destructor has not yet finished. Thus,
+ // we need to clear the map before the destructor has completed.
+ m_stringCache.Clear();
+}
+
static v8::Local<v8::String> makeExternalString(const String& string, v8::Isolate* isolate)
{
if (string.is8Bit()) {
@@ -54,11 +76,11 @@ v8::Handle<v8::String> StringCache::v8ExternalStringSlow(StringImpl* stringImpl,
if (!stringImpl->length())
return v8::String::Empty(isolate);
- UnsafePersistent<v8::String> cachedV8String = m_stringCache.get(stringImpl);
- if (!cachedV8String.isEmpty()) {
+ StringCacheMapTraits::MapType::PersistentValueReference cachedV8String = m_stringCache.GetReference(stringImpl);
+ if (!cachedV8String.IsEmpty()) {
m_lastStringImpl = stringImpl;
m_lastV8String = cachedV8String;
- return cachedV8String.newLocal(isolate);
+ return m_lastV8String.NewLocal(isolate);
}
return createStringAndInsertIntoCache(stringImpl, isolate);
@@ -71,11 +93,11 @@ void StringCache::setReturnValueFromStringSlow(v8::ReturnValue<v8::Value> return
return;
}
- UnsafePersistent<v8::String> cachedV8String = m_stringCache.get(stringImpl);
- if (!cachedV8String.isEmpty()) {
+ StringCacheMapTraits::MapType::PersistentValueReference cachedV8String = m_stringCache.GetReference(stringImpl);
+ if (!cachedV8String.IsEmpty()) {
m_lastStringImpl = stringImpl;
m_lastV8String = cachedV8String;
- returnValue.Set(*cachedV8String.persistent());
+ m_lastV8String.SetReturnValue(returnValue);
return;
}
@@ -84,34 +106,27 @@ void StringCache::setReturnValueFromStringSlow(v8::ReturnValue<v8::Value> return
v8::Local<v8::String> StringCache::createStringAndInsertIntoCache(StringImpl* stringImpl, v8::Isolate* isolate)
{
- ASSERT(!m_stringCache.contains(stringImpl));
+ ASSERT(!m_stringCache.Contains(stringImpl));
ASSERT(stringImpl->length());
v8::Local<v8::String> newString = makeExternalString(String(stringImpl), isolate);
if (newString.IsEmpty())
return newString;
- v8::Persistent<v8::String> wrapper(isolate, newString);
+ v8::UniquePersistent<v8::String> wrapper(isolate, newString);
stringImpl->ref();
wrapper.MarkIndependent();
- wrapper.SetWeak(stringImpl, &setWeakCallback);
- m_lastV8String = UnsafePersistent<v8::String>(wrapper);
+ m_stringCache.Set(stringImpl, wrapper.Pass(), &m_lastV8String);
m_lastStringImpl = stringImpl;
- m_stringCache.set(stringImpl, m_lastV8String);
return newString;
}
-void StringCache::setWeakCallback(const v8::WeakCallbackData<v8::String, StringImpl>& data)
+void StringCache::InvalidateLastString()
{
- StringCache* stringCache = V8PerIsolateData::from(data.GetIsolate())->stringCache();
- stringCache->m_lastStringImpl = 0;
- stringCache->m_lastV8String.clear();
- ASSERT(stringCache->m_stringCache.contains(data.GetParameter()));
- stringCache->m_stringCache.get(data.GetParameter()).dispose();
- stringCache->m_stringCache.remove(data.GetParameter());
- data.GetParameter()->deref();
+ m_lastStringImpl = nullptr;
+ m_lastV8String.Reset();
}
} // namespace WebCore