Changeset 89185 in webkit


Ignore:
Timestamp:
Jun 17, 2011 9:41:55 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2011-06-17 Dmitry Lomov <dslomov@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):

2011-06-17 Dmitry Lomov <dslomov@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.

  • src/WebScriptController.cpp: (WebKit::WebScriptController::enableV8SingleThreadMode): StringCache is now per-isolate, so ok in multithreaded contexts.
Location:
trunk/Source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r89183 r89185  
     12011-06-17  Dmitry Lomov  <dslomov@google.com>
     2
     3        Reviewed by Adam Barth.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=62653
     6        [V8][Chromium] Make StringCache in V8 bindings per-isolate
     7        This moves StringCache into V8BindingPerIsolateData.
     8
     9        * bindings/v8/V8Binding.cpp:
     10        (WebCore::cachedStringCallback):
     11        (WebCore::StringCache::remove):
     12        (WebCore::StringCache::v8ExternalStringSlow):
     13        * bindings/v8/V8Binding.h:
     14        (WebCore::StringCache::StringCache):
     15        (WebCore::StringCache::v8ExternalString):
     16        (WebCore::StringCache::clearOnGC):
     17        (WebCore::V8BindingPerIsolateData::stringCache):
     18        (WebCore::v8ExternalString):
     19        * bindings/v8/V8GCController.cpp:
     20        (WebCore::V8GCController::gcPrologue):
     21
    1222011-06-17  Julien Chaffraix  <jchaffraix@webkit.org>
    223
  • trunk/Source/WebCore/bindings/v8/V8Binding.cpp

    r88729 r89185  
    464464}
    465465
    466 static bool stringImplCacheEnabled = false;
    467 
    468 void enableStringImplCache()
    469 {
    470     stringImplCacheEnabled = true;
    471 }
    472 
    473466static v8::Local<v8::String> makeExternalString(const String& string)
    474467{
     
    481474}
    482475
    483 typedef HashMap<StringImpl*, v8::String*> StringCache;
    484 
    485 static StringCache& getStringCache()
    486 {
    487     ASSERT(WTF::isMainThread());
    488     DEFINE_STATIC_LOCAL(StringCache, mainThreadStringCache, ());
    489     return mainThreadStringCache;
    490 }
    491 
    492476static void cachedStringCallback(v8::Persistent<v8::Value> wrapper, void* parameter)
    493477{
    494     ASSERT(WTF::isMainThread());
    495478    StringImpl* stringImpl = static_cast<StringImpl*>(parameter);
    496     ASSERT(getStringCache().contains(stringImpl));
    497     getStringCache().remove(stringImpl);
     479    V8BindingPerIsolateData::current()->stringCache()->remove(stringImpl);
    498480    wrapper.Dispose();
    499481    stringImpl->deref();
    500482}
    501483
    502 RefPtr<StringImpl> lastStringImpl = 0;
    503 v8::Persistent<v8::String> lastV8String;
    504 
    505 v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl)
     484void StringCache::remove(StringImpl* stringImpl)
     485{
     486    ASSERT(m_stringCache.contains(stringImpl));
     487    m_stringCache.remove(stringImpl);
     488}
     489
     490
     491v8::Local<v8::String> StringCache::v8ExternalStringSlow(StringImpl* stringImpl)
    506492{
    507493    if (!stringImpl->length())
    508494        return v8::String::Empty();
    509495
    510     if (!stringImplCacheEnabled)
    511         return makeExternalString(String(stringImpl));
    512 
    513     StringCache& stringCache = getStringCache();
    514     v8::String* cachedV8String = stringCache.get(stringImpl);
     496    v8::String* cachedV8String = m_stringCache.get(stringImpl);
    515497    if (cachedV8String) {
    516498        v8::Persistent<v8::String> handle(cachedV8String);
    517499        if (!handle.IsNearDeath() && !handle.IsEmpty()) {
    518             lastStringImpl = stringImpl;
    519             lastV8String = handle;
     500            m_lastStringImpl = stringImpl;
     501            m_lastV8String = handle;
    520502            return v8::Local<v8::String>::New(handle);
    521503        }
     
    532514    stringImpl->ref();
    533515    wrapper.MakeWeak(stringImpl, cachedStringCallback);
    534     stringCache.set(stringImpl, *wrapper);
    535 
    536     lastStringImpl = stringImpl;
    537     lastV8String = wrapper;
     516    m_stringCache.set(stringImpl, *wrapper);
     517
     518    m_lastStringImpl = stringImpl;
     519    m_lastV8String = wrapper;
    538520
    539521    return newString;
  • trunk/Source/WebCore/bindings/v8/V8Binding.h

    r88729 r89185  
    5151    typedef BindingSecurity<V8Binding> V8BindingSecurity;
    5252
     53    class StringCache {
     54    public:
     55        StringCache() { }
     56
     57        v8::Local<v8::String> v8ExternalString(StringImpl* stringImpl)
     58        {
     59            if (m_lastStringImpl.get() == stringImpl) {
     60                ASSERT(!m_lastV8String.IsNearDeath());
     61                ASSERT(!m_lastV8String.IsEmpty());
     62                return v8::Local<v8::String>::New(m_lastV8String);
     63            }
     64
     65            return v8ExternalStringSlow(stringImpl);
     66        }
     67
     68        void clearOnGC()
     69        {
     70            m_lastStringImpl = 0;
     71            m_lastV8String.Clear();
     72        }
     73
     74        void remove(StringImpl*);
     75
     76    private:
     77        v8::Local<v8::String> v8ExternalStringSlow(StringImpl*);
     78
     79        HashMap<StringImpl*, v8::String*> m_stringCache;
     80        v8::Persistent<v8::String> m_lastV8String;
     81        // Note: RefPtr is a must as we cache by StringImpl* equality, not identity
     82        // hence lastStringImpl might be not a key of the cache (in sense of identity)
     83        // and hence it's not refed on addition.
     84        RefPtr<StringImpl> m_lastStringImpl;
     85    };
     86
    5387    class V8BindingPerIsolateData {
    5488    public:
     
    73107        v8::Persistent<v8::String>& toStringName() { return m_toStringName; }
    74108        v8::Persistent<v8::FunctionTemplate>& toStringTemplate() { return m_toStringTemplate; }
     109        StringCache* stringCache() { return &m_stringCache; }
    75110
    76111    private:
     
    82117        v8::Persistent<v8::String> m_toStringName;
    83118        v8::Persistent<v8::FunctionTemplate> m_toStringTemplate;
     119        StringCache m_stringCache;
    84120    };
    85121
     
    111147    AtomicString v8ValueToAtomicWebCoreString(v8::Handle<v8::Value> value);
    112148
    113     // Note: RefPtr is a must as we cache by StringImpl* equality, not identity
    114     // hence lastStringImpl might be not a key of the cache (in sense of identity)
    115     // and hence it's not refed on addition.
    116     extern RefPtr<StringImpl> lastStringImpl;
    117     extern v8::Persistent<v8::String> lastV8String;
    118     v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl);
    119 
    120149    // Return a V8 external string that shares the underlying buffer with the given
    121150    // WebCore string. The reference counting mechanism is used to keep the
     
    127156            return v8::String::Empty();
    128157
    129         if (lastStringImpl.get() == stringImpl) {
    130             ASSERT(!lastV8String.IsNearDeath());
    131             ASSERT(!lastV8String.IsEmpty());
    132             return v8::Local<v8::String>::New(lastV8String);
    133         }
    134 
    135         return v8ExternalStringSlow(stringImpl);
     158        V8BindingPerIsolateData* data = V8BindingPerIsolateData::current();
     159        return data->stringCache()->v8ExternalString(stringImpl);
    136160    }
    137161
  • trunk/Source/WebCore/bindings/v8/V8GCController.cpp

    r88357 r89185  
    468468
    469469    // Clean single element cache for string conversions.
    470     lastStringImpl = 0;
    471     lastV8String.Clear();
     470    V8BindingPerIsolateData* data = V8BindingPerIsolateData::current();
     471    data->stringCache()->clearOnGC();
    472472}
    473473
  • trunk/Source/WebKit/chromium/ChangeLog

    r89180 r89185  
     12011-06-17  Dmitry Lomov  <dslomov@google.com>
     2
     3        Reviewed by Adam Barth.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=62653
     6        [V8][Chromium] Make StringCache in V8 bindings per-isolate
     7        This moves StringCache into V8BindingPerIsolateData.
     8
     9        * src/WebScriptController.cpp:
     10        (WebKit::WebScriptController::enableV8SingleThreadMode): StringCache is now per-isolate, so ok in multithreaded contexts.
     11
    1122011-06-17  Ryosuke Niwa  <rniwa@webkit.org>
    213
  • trunk/Source/WebKit/chromium/src/WebScriptController.cpp

    r76224 r89185  
    4949void WebScriptController::enableV8SingleThreadMode()
    5050{
    51     enableStringImplCache();
    5251    enableFasterDOMStoreAccess();
    5352}
Note: See TracChangeset for help on using the changeset viewer.