Title: [89390] trunk/Source
Revision
89390
Author
commit-qu...@webkit.org
Date
2011-06-21 16:09:15 -0700 (Tue, 21 Jun 2011)

Log Message

2011-06-21  Dmitry Lomov  <dslo...@google.com>

        Reviewed by Adam Barth.

        https://bugs.webkit.org/show_bug.cgi?id=62653
        [V8][Chromium] Make StringCache in V8 bindings per-isolate
        This moves StringCache into V8BindingPerIsolateData.

        * bindings/v8/V8Binding.cpp:
        (WebCore::cachedStringCallback):
        (WebCore::StringCache::remove):
        (WebCore::StringCache::v8ExternalStringSlow):
        * bindings/v8/V8Binding.h:
        (WebCore::StringCache::StringCache):
        (WebCore::StringCache::v8ExternalString):
        (WebCore::StringCache::clearOnGC):
        (WebCore::V8BindingPerIsolateData::stringCache):
        (WebCore::v8ExternalString):
        * bindings/v8/V8GCController.cpp:
        (WebCore::V8GCController::gcPrologue):
        * bindings/v8/WorkerContextExecutionProxy.cpp:
        (WebCore::WorkerContextExecutionProxy::initV8IfNeeded):

2011-06-21  Dmitry Lomov  <dslo...@google.com>

        Reviewed by Adam Barth.

        https://bugs.webkit.org/show_bug.cgi?id=62653
        [V8][Chromium] Make StringCache in V8 bindings per-isolate

        * src/WebKit.cpp:
        (WebKit::initialize): Initialize V8PerIsolateBindingData eagerly
        * src/WebScriptController.cpp:
        (WebKit::WebScriptController::enableV8SingleThreadMode): StringCache is now per-isolate, so ok in multithreaded contexts.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (89389 => 89390)


--- trunk/Source/WebCore/ChangeLog	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebCore/ChangeLog	2011-06-21 23:09:15 UTC (rev 89390)
@@ -1,3 +1,27 @@
+2011-06-21  Dmitry Lomov  <dslo...@google.com>
+
+        Reviewed by Adam Barth.
+
+        https://bugs.webkit.org/show_bug.cgi?id=62653
+        [V8][Chromium] Make StringCache in V8 bindings per-isolate
+        This moves StringCache into V8BindingPerIsolateData.
+
+        * bindings/v8/V8Binding.cpp:
+        (WebCore::cachedStringCallback):
+        (WebCore::StringCache::remove):
+        (WebCore::StringCache::v8ExternalStringSlow):
+        * bindings/v8/V8Binding.h:
+        (WebCore::StringCache::StringCache):
+        (WebCore::StringCache::v8ExternalString):
+        (WebCore::StringCache::clearOnGC):
+        (WebCore::V8BindingPerIsolateData::stringCache):
+        (WebCore::v8ExternalString):
+        * bindings/v8/V8GCController.cpp:
+        (WebCore::V8GCController::gcPrologue):
+        * bindings/v8/WorkerContextExecutionProxy.cpp:
+        (WebCore::WorkerContextExecutionProxy::initV8IfNeeded):
+
+
 2011-06-21  Alexey Proskuryakov  <a...@apple.com>
 
         Clang build fix.

Modified: trunk/Source/WebCore/bindings/v8/V8Binding.cpp (89389 => 89390)


--- trunk/Source/WebCore/bindings/v8/V8Binding.cpp	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.cpp	2011-06-21 23:09:15 UTC (rev 89390)
@@ -463,13 +463,6 @@
     return AtomicString(v8NonStringValueToWebCoreString(object));
 }
 
-static bool stringImplCacheEnabled = false;
-
-void enableStringImplCache()
-{
-    stringImplCacheEnabled = true;
-}
-
 static v8::Local<v8::String> makeExternalString(const String& string)
 {
     WebCoreStringResource* stringResource = new WebCoreStringResource(string);
@@ -480,43 +473,32 @@
     return newString;
 }
 
-typedef HashMap<StringImpl*, v8::String*> StringCache;
-
-static StringCache& getStringCache()
-{
-    ASSERT(WTF::isMainThread());
-    DEFINE_STATIC_LOCAL(StringCache, mainThreadStringCache, ());
-    return mainThreadStringCache;
-}
-
 static void cachedStringCallback(v8::Persistent<v8::Value> wrapper, void* parameter)
 {
-    ASSERT(WTF::isMainThread());
     StringImpl* stringImpl = static_cast<StringImpl*>(parameter);
-    ASSERT(getStringCache().contains(stringImpl));
-    getStringCache().remove(stringImpl);
+    V8BindingPerIsolateData::current()->stringCache()->remove(stringImpl);
     wrapper.Dispose();
     stringImpl->deref();
 }
 
-RefPtr<StringImpl> lastStringImpl = 0;
-v8::Persistent<v8::String> lastV8String;
+void StringCache::remove(StringImpl* stringImpl) 
+{
+    ASSERT(m_stringCache.contains(stringImpl));
+    m_stringCache.remove(stringImpl);
+}
 
-v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl)
+
+v8::Local<v8::String> StringCache::v8ExternalStringSlow(StringImpl* stringImpl)
 {
     if (!stringImpl->length())
         return v8::String::Empty();
 
-    if (!stringImplCacheEnabled)
-        return makeExternalString(String(stringImpl));
-
-    StringCache& stringCache = getStringCache();
-    v8::String* cachedV8String = stringCache.get(stringImpl);
+    v8::String* cachedV8String = m_stringCache.get(stringImpl);
     if (cachedV8String) {
         v8::Persistent<v8::String> handle(cachedV8String);
         if (!handle.IsNearDeath() && !handle.IsEmpty()) {
-            lastStringImpl = stringImpl;
-            lastV8String = handle;
+            m_lastStringImpl = stringImpl;
+            m_lastV8String = handle;
             return v8::Local<v8::String>::New(handle);
         }
     }
@@ -531,10 +513,10 @@
 
     stringImpl->ref();
     wrapper.MakeWeak(stringImpl, cachedStringCallback);
-    stringCache.set(stringImpl, *wrapper);
+    m_stringCache.set(stringImpl, *wrapper);
 
-    lastStringImpl = stringImpl;
-    lastV8String = wrapper;
+    m_lastStringImpl = stringImpl;
+    m_lastV8String = wrapper;
 
     return newString;
 }

Modified: trunk/Source/WebCore/bindings/v8/V8Binding.h (89389 => 89390)


--- trunk/Source/WebCore/bindings/v8/V8Binding.h	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.h	2011-06-21 23:09:15 UTC (rev 89390)
@@ -50,6 +50,40 @@
     };
     typedef BindingSecurity<V8Binding> V8BindingSecurity;
 
+    class StringCache {
+    public:
+        StringCache() { }
+
+        v8::Local<v8::String> v8ExternalString(StringImpl* stringImpl) 
+        {
+            if (m_lastStringImpl.get() == stringImpl) {
+                ASSERT(!m_lastV8String.IsNearDeath());
+                ASSERT(!m_lastV8String.IsEmpty());
+                return v8::Local<v8::String>::New(m_lastV8String);
+            }
+
+            return v8ExternalStringSlow(stringImpl);
+        }
+
+        void clearOnGC() 
+        {
+            m_lastStringImpl = 0;
+            m_lastV8String.Clear();
+        }
+
+        void remove(StringImpl*);
+
+    private:
+        v8::Local<v8::String> v8ExternalStringSlow(StringImpl*);
+
+        HashMap<StringImpl*, v8::String*> m_stringCache;
+        v8::Persistent<v8::String> m_lastV8String;
+        // Note: RefPtr is a must as we cache by StringImpl* equality, not identity
+        // hence lastStringImpl might be not a key of the cache (in sense of identity)
+        // and hence it's not refed on addition.
+        RefPtr<StringImpl> m_lastStringImpl;
+    };
+
     class V8BindingPerIsolateData {
     public:
         static V8BindingPerIsolateData* create(v8::Isolate*);
@@ -72,6 +106,7 @@
         TemplateMap& templateMap() { return m_templates; }
         v8::Persistent<v8::String>& toStringName() { return m_toStringName; }
         v8::Persistent<v8::FunctionTemplate>& toStringTemplate() { return m_toStringTemplate; }
+        StringCache* stringCache() { return &m_stringCache; }
 
     private:
         explicit V8BindingPerIsolateData(v8::Isolate*);
@@ -81,6 +116,7 @@
         TemplateMap m_templates;
         v8::Persistent<v8::String> m_toStringName;
         v8::Persistent<v8::FunctionTemplate> m_toStringTemplate;
+        StringCache m_stringCache;
     };
 
 
@@ -110,13 +146,6 @@
     AtomicString v8NonStringValueToAtomicWebCoreString(v8::Handle<v8::Value>);
     AtomicString v8ValueToAtomicWebCoreString(v8::Handle<v8::Value> value);
 
-    // Note: RefPtr is a must as we cache by StringImpl* equality, not identity
-    // hence lastStringImpl might be not a key of the cache (in sense of identity)
-    // and hence it's not refed on addition.
-    extern RefPtr<StringImpl> lastStringImpl;
-    extern v8::Persistent<v8::String> lastV8String;
-    v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl);
-
     // Return a V8 external string that shares the underlying buffer with the given
     // WebCore string. The reference counting mechanism is used to keep the
     // underlying buffer alive while the string is still live in the V8 engine.
@@ -126,13 +155,8 @@
         if (!stringImpl)
             return v8::String::Empty();
 
-        if (lastStringImpl.get() == stringImpl) {
-            ASSERT(!lastV8String.IsNearDeath());
-            ASSERT(!lastV8String.IsEmpty());
-            return v8::Local<v8::String>::New(lastV8String);
-        }
-
-        return v8ExternalStringSlow(stringImpl);
+        V8BindingPerIsolateData* data = ""
+        return data->stringCache()->v8ExternalString(stringImpl);
     }
 
     // Convert a string to a V8 string.

Modified: trunk/Source/WebCore/bindings/v8/V8GCController.cpp (89389 => 89390)


--- trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2011-06-21 23:09:15 UTC (rev 89390)
@@ -467,8 +467,8 @@
     grouperVisitor.applyGrouping();
 
     // Clean single element cache for string conversions.
-    lastStringImpl = 0;
-    lastV8String.Clear();
+    V8BindingPerIsolateData* data = ""
+    data->stringCache()->clearOnGC();
 }
 
 class GCEpilogueVisitor : public DOMWrapperMap<void>::Visitor {

Modified: trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp (89389 => 89390)


--- trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp	2011-06-21 23:09:15 UTC (rev 89390)
@@ -124,7 +124,7 @@
     resource_constraints.set_stack_limit(&here - kWorkerMaxStackSize / sizeof(uint32_t*));
     v8::SetResourceConstraints(&resource_constraints);
 
-    V8BindingPerIsolateData::create(v8::Isolate::GetCurrent());
+    V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent());
 
     v8Initialized = true;
 }

Modified: trunk/Source/WebKit/chromium/ChangeLog (89389 => 89390)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-06-21 23:09:15 UTC (rev 89390)
@@ -1,3 +1,15 @@
+2011-06-21  Dmitry Lomov  <dslo...@google.com>
+
+        Reviewed by Adam Barth.
+
+        https://bugs.webkit.org/show_bug.cgi?id=62653
+        [V8][Chromium] Make StringCache in V8 bindings per-isolate
+
+        * src/WebKit.cpp:
+        (WebKit::initialize): Initialize V8PerIsolateBindingData eagerly
+        * src/WebScriptController.cpp:
+        (WebKit::WebScriptController::enableV8SingleThreadMode): StringCache is now per-isolate, so ok in multithreaded contexts.
+
 2011-06-21  Chris Evans  <cev...@chromium.org>
 
         Reviewed by Darin Fisher.

Modified: trunk/Source/WebKit/chromium/src/WebKit.cpp (89389 => 89390)


--- trunk/Source/WebKit/chromium/src/WebKit.cpp	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebKit/chromium/src/WebKit.cpp	2011-06-21 23:09:15 UTC (rev 89390)
@@ -36,9 +36,11 @@
 #include "RuntimeEnabledFeatures.h"
 #include "Settings.h"
 #include "TextEncoding.h"
+#include "V8Binding.h"
 #include "WebMediaPlayerClientImpl.h"
 #include "WebSocket.h"
 #include "WorkerContextExecutionProxy.h"
+#include "v8.h"
 
 #include <wtf/Assertions.h>
 #include <wtf/Threading.h>
@@ -74,6 +76,9 @@
     // the initialization thread-safe, but given that so many code paths use
     // this, initializing this lazily probably doesn't buy us much.
     WebCore::UTF8Encoding();
+
+    v8::V8::Initialize();
+    WebCore::V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent());
 }
 
 void shutdown()

Modified: trunk/Source/WebKit/chromium/src/WebScriptController.cpp (89389 => 89390)


--- trunk/Source/WebKit/chromium/src/WebScriptController.cpp	2011-06-21 22:51:13 UTC (rev 89389)
+++ trunk/Source/WebKit/chromium/src/WebScriptController.cpp	2011-06-21 23:09:15 UTC (rev 89390)
@@ -48,7 +48,6 @@
 
 void WebScriptController::enableV8SingleThreadMode()
 {
-    enableStringImplCache();
     enableFasterDOMStoreAccess();
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to