Changeset 89390 in webkit
- Timestamp:
- Jun 21, 2011 4:09:15 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r89388 r89390 1 2011-06-21 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 * bindings/v8/WorkerContextExecutionProxy.cpp: 22 (WebCore::WorkerContextExecutionProxy::initV8IfNeeded): 23 24 1 25 2011-06-21 Alexey Proskuryakov <ap@apple.com> 2 26 -
trunk/Source/WebCore/bindings/v8/V8Binding.cpp
r89353 r89390 464 464 } 465 465 466 static bool stringImplCacheEnabled = false;467 468 void enableStringImplCache()469 {470 stringImplCacheEnabled = true;471 }472 473 466 static v8::Local<v8::String> makeExternalString(const String& string) 474 467 { … … 481 474 } 482 475 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 492 476 static void cachedStringCallback(v8::Persistent<v8::Value> wrapper, void* parameter) 493 477 { 494 ASSERT(WTF::isMainThread());495 478 StringImpl* stringImpl = static_cast<StringImpl*>(parameter); 496 ASSERT(getStringCache().contains(stringImpl)); 497 getStringCache().remove(stringImpl); 479 V8BindingPerIsolateData::current()->stringCache()->remove(stringImpl); 498 480 wrapper.Dispose(); 499 481 stringImpl->deref(); 500 482 } 501 483 502 RefPtr<StringImpl> lastStringImpl = 0; 503 v8::Persistent<v8::String> lastV8String; 504 505 v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl) 484 void StringCache::remove(StringImpl* stringImpl) 485 { 486 ASSERT(m_stringCache.contains(stringImpl)); 487 m_stringCache.remove(stringImpl); 488 } 489 490 491 v8::Local<v8::String> StringCache::v8ExternalStringSlow(StringImpl* stringImpl) 506 492 { 507 493 if (!stringImpl->length()) 508 494 return v8::String::Empty(); 509 495 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); 515 497 if (cachedV8String) { 516 498 v8::Persistent<v8::String> handle(cachedV8String); 517 499 if (!handle.IsNearDeath() && !handle.IsEmpty()) { 518 lastStringImpl = stringImpl;519 lastV8String = handle;500 m_lastStringImpl = stringImpl; 501 m_lastV8String = handle; 520 502 return v8::Local<v8::String>::New(handle); 521 503 } … … 532 514 stringImpl->ref(); 533 515 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; 538 520 539 521 return newString; -
trunk/Source/WebCore/bindings/v8/V8Binding.h
r89353 r89390 51 51 typedef BindingSecurity<V8Binding> V8BindingSecurity; 52 52 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 53 87 class V8BindingPerIsolateData { 54 88 public: … … 73 107 v8::Persistent<v8::String>& toStringName() { return m_toStringName; } 74 108 v8::Persistent<v8::FunctionTemplate>& toStringTemplate() { return m_toStringTemplate; } 109 StringCache* stringCache() { return &m_stringCache; } 75 110 76 111 private: … … 82 117 v8::Persistent<v8::String> m_toStringName; 83 118 v8::Persistent<v8::FunctionTemplate> m_toStringTemplate; 119 StringCache m_stringCache; 84 120 }; 85 121 … … 111 147 AtomicString v8ValueToAtomicWebCoreString(v8::Handle<v8::Value> value); 112 148 113 // Note: RefPtr is a must as we cache by StringImpl* equality, not identity114 // 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 120 149 // Return a V8 external string that shares the underlying buffer with the given 121 150 // WebCore string. The reference counting mechanism is used to keep the … … 127 156 return v8::String::Empty(); 128 157 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); 136 160 } 137 161 -
trunk/Source/WebCore/bindings/v8/V8GCController.cpp
r89353 r89390 468 468 469 469 // Clean single element cache for string conversions. 470 lastStringImpl = 0;471 lastV8String.Clear();470 V8BindingPerIsolateData* data = V8BindingPerIsolateData::current(); 471 data->stringCache()->clearOnGC(); 472 472 } 473 473 -
trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp
r88729 r89390 125 125 v8::SetResourceConstraints(&resource_constraints); 126 126 127 V8BindingPerIsolateData:: create(v8::Isolate::GetCurrent());127 V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent()); 128 128 129 129 v8Initialized = true; -
trunk/Source/WebKit/chromium/ChangeLog
r89376 r89390 1 2011-06-21 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 8 * src/WebKit.cpp: 9 (WebKit::initialize): Initialize V8PerIsolateBindingData eagerly 10 * src/WebScriptController.cpp: 11 (WebKit::WebScriptController::enableV8SingleThreadMode): StringCache is now per-isolate, so ok in multithreaded contexts. 12 1 13 2011-06-21 Chris Evans <cevans@chromium.org> 2 14 -
trunk/Source/WebKit/chromium/src/WebKit.cpp
r79456 r89390 37 37 #include "Settings.h" 38 38 #include "TextEncoding.h" 39 #include "V8Binding.h" 39 40 #include "WebMediaPlayerClientImpl.h" 40 41 #include "WebSocket.h" 41 42 #include "WorkerContextExecutionProxy.h" 43 #include "v8.h" 42 44 43 45 #include <wtf/Assertions.h> … … 75 77 // this, initializing this lazily probably doesn't buy us much. 76 78 WebCore::UTF8Encoding(); 79 80 v8::V8::Initialize(); 81 WebCore::V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent()); 77 82 } 78 83 -
trunk/Source/WebKit/chromium/src/WebScriptController.cpp
r89353 r89390 49 49 void WebScriptController::enableV8SingleThreadMode() 50 50 { 51 enableStringImplCache();52 51 enableFasterDOMStoreAccess(); 53 52 }
Note: See TracChangeset
for help on using the changeset viewer.