Changeset 89185 in webkit
- Timestamp:
- Jun 17, 2011 9:41:55 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r89183 r89185 1 2011-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 1 22 2011-06-17 Julien Chaffraix <jchaffraix@webkit.org> 2 23 -
trunk/Source/WebCore/bindings/v8/V8Binding.cpp
r88729 r89185 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
r88729 r89185 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
r88357 r89185 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/WebKit/chromium/ChangeLog
r89180 r89185 1 2011-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 1 12 2011-06-17 Ryosuke Niwa <rniwa@webkit.org> 2 13 -
trunk/Source/WebKit/chromium/src/WebScriptController.cpp
r76224 r89185 49 49 void WebScriptController::enableV8SingleThreadMode() 50 50 { 51 enableStringImplCache();52 51 enableFasterDOMStoreAccess(); 53 52 }
Note: See TracChangeset
for help on using the changeset viewer.