Diff
Modified: trunk/Source/WebCore/ChangeLog (116268 => 116269)
--- trunk/Source/WebCore/ChangeLog 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/ChangeLog 2012-05-07 04:39:31 UTC (rev 116269)
@@ -1,3 +1,72 @@
+2012-05-06 Kentaro Hara <[email protected]>
+
+ [V8][Performance] Remove Isolate lookup from the call path
+ to get a cached JS wrapper object by getDOMXXXXMap().
+ https://bugs.webkit.org/show_bug.cgi?id=85205
+
+ Reviewed by Adam Barth.
+
+ The patch improves the performance of getting a cached JS wrapper
+ by getDOMXXXXMap(). For example, it improves the performance
+ of toV8(NodeList*) in getElementsByTagName(), getElementsByName(),
+ getElementsByClassName() by 7 ~ 9%.
+
+ Performance tests: https://bugs.webkit.org/attachment.cgi?id=139468
+
+ The performance test results in my Linux desktop:
+
+ getElementsByTagName : 40.76 ms => 37.52ms (+8.6%)
+ getElementsByName : 41.02 ms => 37.42ms (+9.6%)
+ getElementsByClassName : 40.32 ms => 37.68ms (+7.0%)
+
+ Unfortunately we cannot observe performance improvement in
+ Dromaeo/dom-query.html, which are testing getElementsByTagName(),
+ getElementsByName(), getElementsByClassName(). This is because
+ the bottleneck of these Dromaeo tests is not toV8(NodeList*) but
+ .length and .nodeType accesses. The patch for optimizing them
+ will be coming soon.
+
+ No tests. No change in behavior.
+
+ * bindings/scripts/CodeGeneratorV8.pm: Modified as described above.
+ (GenerateHeader):
+ (GenerateNormalAttrGetter):
+ (GetDomMapFunction):
+ (NativeToJSValue):
+ * bindings/v8/DOMData.cpp:
+ (WebCore::DOMData::getCurrentStore):
+
+ * bindings/scripts/test/V8/V8Float64Array.h: Updated run-bindings-tests results.
+ (WebCore::V8Float64Array::wrap):
+ * bindings/scripts/test/V8/V8TestActiveDOMObject.h:
+ (WebCore::V8TestActiveDOMObject::wrap):
+ * bindings/scripts/test/V8/V8TestCustomNamedGetter.h:
+ (WebCore::V8TestCustomNamedGetter::wrap):
+ * bindings/scripts/test/V8/V8TestEventConstructor.h:
+ (WebCore::V8TestEventConstructor::wrap):
+ * bindings/scripts/test/V8/V8TestEventTarget.cpp:
+ (WebCore::TestEventTargetV8Internal::itemCallback):
+ * bindings/scripts/test/V8/V8TestEventTarget.h:
+ (WebCore::V8TestEventTarget::wrap):
+ * bindings/scripts/test/V8/V8TestInterface.cpp:
+ (WebCore::TestInterfaceV8Internal::supplementalNodeAttrGetter):
+ * bindings/scripts/test/V8/V8TestInterface.h:
+ (WebCore::V8TestInterface::wrap):
+ * bindings/scripts/test/V8/V8TestMediaQueryListListener.h:
+ (WebCore::V8TestMediaQueryListListener::wrap):
+ * bindings/scripts/test/V8/V8TestNamedConstructor.h:
+ (WebCore::V8TestNamedConstructor::wrap):
+ * bindings/scripts/test/V8/V8TestObj.cpp:
+ (WebCore::TestObjV8Internal::readOnlyTestObjAttrAttrGetter):
+ (WebCore::TestObjV8Internal::cachedAttribute1AttrGetter):
+ (WebCore::TestObjV8Internal::cachedAttribute2AttrGetter):
+ (WebCore::TestObjV8Internal::contentDocumentAttrGetter):
+ (WebCore::TestObjV8Internal::getSVGDocumentCallback):
+ * bindings/scripts/test/V8/V8TestObj.h:
+ (WebCore::V8TestObj::wrap):
+ * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h:
+ (WebCore::V8TestSerializedScriptValueInterface::wrap):
+
2012-05-06 Adam Barth <[email protected]>
Content Security Policy reports should be reported with content-type application/json, should contain all required fields
Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm 2012-05-07 04:39:31 UTC (rev 116269)
@@ -314,7 +314,6 @@
push(@headerContent, "false;\n");
}
- my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName);
my $forceNewObjectParameter = IsDOMNodeType($interfaceName) ? ", bool forceNewObject = false" : "";
my $forceNewObjectInput = IsDOMNodeType($interfaceName) ? ", bool forceNewObject" : "";
my $forceNewObjectCall = IsDOMNodeType($interfaceName) ? ", forceNewObject" : "";
@@ -424,6 +423,7 @@
{
END
push(@headerContent, " if (!forceNewObject) {\n") if IsDOMNodeType($interfaceName);
+ my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName, "isolate");
my $getCachedWrapper = IsNodeSubType($dataNode) ? "V8DOMWrapper::getCachedWrapper(impl)" : "${domMapFunction}.get(impl)";
push(@headerContent, <<END);
v8::Handle<v8::Object> wrapper = $getCachedWrapper;
@@ -929,7 +929,7 @@
# Check for a wrapper in the wrapper cache. If there is one, we know that a hidden reference has already
# been created. If we don't find a wrapper, we create both a wrapper and a hidden reference.
push(@implContentDecls, " RefPtr<$returnType> result = ${getterString};\n");
- my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName);
+ my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName, "info.GetIsolate()");
push(@implContentDecls, " v8::Handle<v8::Value> wrapper = result.get() ? ${domMapFunction}.get(result.get()) : v8::Handle<v8::Object>();\n");
push(@implContentDecls, " if (wrapper.IsEmpty()) {\n");
push(@implContentDecls, " wrapper = toV8(result.get(), info.GetIsolate());\n");
@@ -3206,7 +3206,11 @@
sub GetDomMapFunction
{
- return "get" . GetDomMapName(@_) . "Map()";
+ my $dataNode = shift;
+ my $interfaceName = shift;
+ my $getIsolate = shift;
+
+ return "get" . GetDomMapName($dataNode, $interfaceName) . "Map(" . $getIsolate . ")";
}
sub GetDomMapName
@@ -3817,7 +3821,7 @@
# special case for non-DOM node interfaces
if (IsDOMNodeType($type)) {
- return "toV8(${value}" . ($signature->extendedAttributes->{"ReturnNewObject"} ? ", $getIsolate, true)" : ")");
+ return "toV8(${value}" . ($signature->extendedAttributes->{"ReturnNewObject"} ? ", $getIsolate, true)" : ", $getIsolate)");
}
if ($type eq "EventTarget") {
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -52,7 +52,7 @@
v8::Handle<v8::Object> V8Float64Array::wrap(Float64Array* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8Float64Array::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -52,7 +52,7 @@
v8::Handle<v8::Object> V8TestActiveDOMObject::wrap(TestActiveDOMObject* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestActiveDOMObject::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -51,7 +51,7 @@
v8::Handle<v8::Object> V8TestCustomNamedGetter::wrap(TestCustomNamedGetter* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestCustomNamedGetter::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -52,7 +52,7 @@
v8::Handle<v8::Object> V8TestEventConstructor::wrap(TestEventConstructor* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestEventConstructor::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp 2012-05-07 04:39:31 UTC (rev 116269)
@@ -55,7 +55,7 @@
ec = INDEX_SIZE_ERR;
goto fail;
}
- return toV8(imp->item(index));
+ return toV8(imp->item(index), args.GetIsolate());
}
fail:
V8Proxy::setDOMException(ec, args.GetIsolate());
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -53,7 +53,7 @@
v8::Handle<v8::Object> V8TestEventTarget::wrap(TestEventTarget* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestEventTarget::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp 2012-05-07 04:39:31 UTC (rev 116269)
@@ -88,7 +88,7 @@
{
INC_STATS("DOM.TestInterface.supplementalNode._get");
TestInterface* imp = V8TestInterface::toNative(info.Holder());
- return toV8(TestSupplemental::supplementalNode(imp));
+ return toV8(TestSupplemental::supplementalNode(imp), info.GetIsolate());
}
#endif // ENABLE(Condition11) || ENABLE(Condition12)
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -55,7 +55,7 @@
v8::Handle<v8::Object> V8TestInterface::wrap(TestInterface* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestInterface::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -50,7 +50,7 @@
v8::Handle<v8::Object> V8TestMediaQueryListListener::wrap(TestMediaQueryListListener* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestMediaQueryListListener::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -57,7 +57,7 @@
v8::Handle<v8::Object> V8TestNamedConstructor::wrap(TestNamedConstructor* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestNamedConstructor::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp 2012-05-07 04:39:31 UTC (rev 116269)
@@ -98,7 +98,7 @@
INC_STATS("DOM.TestObj.readOnlyTestObjAttr._get");
TestObj* imp = V8TestObj::toNative(info.Holder());
RefPtr<TestObj> result = imp->readOnlyTestObjAttr();
- v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap().get(result.get()) : v8::Handle<v8::Object>();
+ v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap(info.GetIsolate()).get(result.get()) : v8::Handle<v8::Object>();
if (wrapper.IsEmpty()) {
wrapper = toV8(result.get(), info.GetIsolate());
if (!wrapper.IsEmpty())
@@ -1019,7 +1019,7 @@
INC_STATS("DOM.TestObj.cachedAttribute1._get");
TestObj* imp = V8TestObj::toNative(info.Holder());
RefPtr<any> result = imp->cachedAttribute1();
- v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap().get(result.get()) : v8::Handle<v8::Object>();
+ v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap(info.GetIsolate()).get(result.get()) : v8::Handle<v8::Object>();
if (wrapper.IsEmpty()) {
wrapper = toV8(result.get(), info.GetIsolate());
if (!wrapper.IsEmpty())
@@ -1033,7 +1033,7 @@
INC_STATS("DOM.TestObj.cachedAttribute2._get");
TestObj* imp = V8TestObj::toNative(info.Holder());
RefPtr<any> result = imp->cachedAttribute2();
- v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap().get(result.get()) : v8::Handle<v8::Object>();
+ v8::Handle<v8::Value> wrapper = result.get() ? getDOMObjectMap(info.GetIsolate()).get(result.get()) : v8::Handle<v8::Object>();
if (wrapper.IsEmpty()) {
wrapper = toV8(result.get(), info.GetIsolate());
if (!wrapper.IsEmpty())
@@ -1113,7 +1113,7 @@
if (!V8BindingSecurity::shouldAllowAccessToNode(V8BindingState::Only(), imp->contentDocument()))
return v8::Handle<v8::Value>(v8::Null());
- return toV8(imp->contentDocument());
+ return toV8(imp->contentDocument(), info.GetIsolate());
}
static v8::Handle<v8::Value> mutablePointAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
@@ -1892,7 +1892,7 @@
RefPtr<SVGDocument> result = imp->getSVGDocument(ec);
if (UNLIKELY(ec))
goto fail;
- return toV8(result.release());
+ return toV8(result.release(), args.GetIsolate());
}
fail:
V8Proxy::setDOMException(ec, args.GetIsolate());
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -56,7 +56,7 @@
v8::Handle<v8::Object> V8TestObj::wrap(TestObj* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestObj::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h (116268 => 116269)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h 2012-05-07 04:39:31 UTC (rev 116269)
@@ -53,7 +53,7 @@
v8::Handle<v8::Object> V8TestSerializedScriptValueInterface::wrap(TestSerializedScriptValueInterface* impl, v8::Isolate* isolate)
{
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl);
+ v8::Handle<v8::Object> wrapper = getDOMObjectMap(isolate).get(impl);
if (!wrapper.IsEmpty())
return wrapper;
return V8TestSerializedScriptValueInterface::wrapSlow(impl, isolate);
Modified: trunk/Source/WebCore/bindings/v8/DOMData.cpp (116268 => 116269)
--- trunk/Source/WebCore/bindings/v8/DOMData.cpp 2012-05-07 04:34:30 UTC (rev 116268)
+++ trunk/Source/WebCore/bindings/v8/DOMData.cpp 2012-05-07 04:39:31 UTC (rev 116269)
@@ -40,7 +40,7 @@
DOMDataStore& DOMData::getCurrentStore(v8::Isolate* isolate)
{
DEFINE_STATIC_LOCAL(StaticDOMDataStore, defaultStore, ());
- V8BindingPerIsolateData* data = ""
+ V8BindingPerIsolateData* data = ""
if (UNLIKELY(data->domDataStore() != 0))
return *data->domDataStore();
V8IsolatedContext* context = V8IsolatedContext::getEntered();