[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.21-584-g1e41756
japhet at chromium.org
japhet at chromium.org
Fri Feb 26 22:18:08 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 29ff0b3894511daf5a04884fe27110635d974f53
Author: japhet at chromium.org <japhet at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Feb 11 22:26:39 2010 +0000
2010-02-11 Nate Chapin <japhet at chromium.org>
Reviewed by Dimitri Glazkov.
[V8] Add back in a fast path for v8 object wrapping
when it's not possible we're in a WorkerContext (the fast
path is important for performance).
https://bugs.webkit.org/show_bug.cgi?id=34805
* bindings/scripts/CodeGeneratorV8.pm:
* bindings/v8/V8DOMWrapper.cpp:
(WebCore::V8DOMWrapper::instantiateV8ObjectInWorkerContext):
(WebCore::V8DOMWrapper::instantiateV8Object):
* bindings/v8/V8DOMWrapper.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54680 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f2a4885..86724ab 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,19 @@
+2010-02-11 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ [V8] Add back in a fast path for v8 object wrapping
+ when it's not possible we're in a WorkerContext (the fast
+ path is important for performance).
+
+ https://bugs.webkit.org/show_bug.cgi?id=34805
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::instantiateV8ObjectInWorkerContext):
+ (WebCore::V8DOMWrapper::instantiateV8Object):
+ * bindings/v8/V8DOMWrapper.h:
+
2010-02-11 Nikolas Zimmermann <nzimmermann at rim.com>
Reviewed by Dirk Schulze.
diff --git a/WebCore/bindings/scripts/CodeGeneratorV8.pm b/WebCore/bindings/scripts/CodeGeneratorV8.pm
index 0146094..269687f 100644
--- a/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -513,17 +513,30 @@ sub GenerateSetDOMException
return $result;
}
-sub IsNodeSubType
+sub IsSubType
{
my $dataNode = shift;
- return 1 if ($dataNode->name eq "Node");
+ my $parentType = shift;
+ return 1 if ($dataNode->name eq $parentType);
foreach (@allParents) {
my $parent = $codeGenerator->StripModule($_);
- return 1 if $parent eq "Node";
+ return 1 if $parent eq $parentType;
}
return 0;
}
+sub IsNodeSubType
+{
+ my $dataNode = shift;
+ return IsSubType($dataNode, "Node");
+}
+
+sub IsEventSubType
+{
+ my $dataNode = shift;
+ return IsSubType($dataNode, "Event");
+}
+
sub GenerateDomainSafeFunctionGetter
{
my $function = shift;
@@ -1936,8 +1949,12 @@ sub GenerateToV8Converters
v8::Handle<v8::Object> ${className}::wrap(${nativeType}* impl${forceNewObjectInput}) {
v8::Handle<v8::Object> wrapper;
+END
+ if (!MayBeInWorkerContext($dataNode, $interfaceName)) {
+ push(@implContent, <<END);
V8Proxy* proxy = 0;
END
+ }
if (IsNodeSubType($dataNode)) {
push(@implContent, <<END);
@@ -1975,10 +1992,16 @@ END
context->Enter();
END
}
-
- push(@implContent, <<END);
+
+ if (MayBeInWorkerContext($dataNode, $interfaceName)) {
+ push(@implContent, <<END);
+ wrapper = V8DOMWrapper::instantiateV8ObjectInWorkerContext(${wrapperType}, impl);
+END
+ } else {
+ push(@implContent, <<END);
wrapper = V8DOMWrapper::instantiateV8Object(proxy, ${wrapperType}, impl);
END
+ }
if (IsNodeSubType($dataNode)) {
push(@implContent, <<END);
@@ -2026,6 +2049,35 @@ END
}
}
+sub MayBeInWorkerContext {
+ # These objects can be constructed under WorkerContextExecutionProxy. They need special
+ # handling, since if we call V8Proxy::retrieve(), we will crash.
+ # FIXME: websocket?
+ my $dataNode = shift;
+ my $interfaceName = shift;
+ # FIXME: Doing the extra work to handle the WorkerContext case for all Event
+ # types is sad. We can probably be cleverer and only do the extra work for certain types.
+ return 1 if IsEventSubType($dataNode);
+ return 1 if $interfaceName eq "DOMCoreException";
+ return 1 if $interfaceName eq "EventException";
+ return 1 if $interfaceName eq "RangeException";
+ return 1 if $interfaceName eq "XMLHttpRequestException";
+ return 1 if $interfaceName eq "MessagePort";
+ return 1 if $interfaceName eq "DedicatedWorkerContext";
+ return 1 if $interfaceName eq "WorkerContext";
+ return 1 if $interfaceName eq "SharedWorkerContext";
+ return 1 if $interfaceName eq "WorkerLocation";
+ return 1 if $interfaceName eq "WorkerNavigator";
+ return 1 if $interfaceName eq "Notification";
+ return 1 if $interfaceName eq "NotificationCenter";
+ return 1 if $interfaceName eq "XMLHttpRequest";
+ return 1 if $interfaceName eq "WebSocket";
+ return 1 if $interfaceName eq "Worker";
+ return 1 if $interfaceName eq "SharedWorker";
+ return 1 if $interfaceName eq "EventSource";
+ return 0;
+}
+
sub HasCustomToV8Implementation {
# FIXME: This subroutine is lame. Probably should be an .idl attribute (CustomToV8)?
$dataNode = shift;
@@ -2310,17 +2362,6 @@ sub IsRefPtrType
return 1;
}
-sub IsWorkerClassName
-{
- my $class = shift;
- return 1 if $class eq "V8Worker";
- return 1 if $class eq "V8WorkerContext";
- return 1 if $class eq "V8WorkerLocation";
- return 1 if $class eq "V8WorkerNavigator";
-
- return 0;
-}
-
sub GetNativeType
{
my $type = shift;
diff --git a/WebCore/bindings/v8/V8DOMWrapper.cpp b/WebCore/bindings/v8/V8DOMWrapper.cpp
index 92f5c89..1605417 100644
--- a/WebCore/bindings/v8/V8DOMWrapper.cpp
+++ b/WebCore/bindings/v8/V8DOMWrapper.cpp
@@ -267,32 +267,36 @@ PassRefPtr<NodeFilter> V8DOMWrapper::wrapNativeNodeFilter(v8::Handle<v8::Value>
return NodeFilter::create(condition);
}
-v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(V8Proxy* proxy, V8ClassIndex::V8WrapperType type, void* impl)
+v8::Local<v8::Object> V8DOMWrapper::instantiateV8ObjectInWorkerContext(V8ClassIndex::V8WrapperType type, void* impl)
{
- // Get the WorkerContextExecutionProxy first. If we are in a WorkerContext and we try to call V8Proxy::retrieve(),
- // we crash trying to retrieve a DOMWindow.
WorkerContextExecutionProxy* workerContextProxy = WorkerContextExecutionProxy::retrieve();
+ if (!workerContextProxy)
+ return instantiateV8Object(0, type, impl);
+ v8::Local<v8::Object> instance = SafeAllocation::newInstance(getConstructor(type, workerContextProxy->workerContext()));
+ if (!instance.IsEmpty()) {
+ // Avoid setting the DOM wrapper for failed allocations.
+ setDOMWrapper(instance, V8ClassIndex::ToInt(type), impl);
+ }
+ return instance;
+}
+
+v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(V8Proxy* proxy, V8ClassIndex::V8WrapperType type, void* impl)
+{
if (V8IsolatedContext::getEntered()) {
// This effectively disables the wrapper cache for isolated worlds.
proxy = 0;
// FIXME: Do we need a wrapper cache for the isolated world? We should
// see if the performance gains are worth while.
// We'll get one once we give the isolated context a proper window shell.
- } else if (!proxy && !workerContextProxy)
+ } else if (!proxy)
proxy = V8Proxy::retrieve();
v8::Local<v8::Object> instance;
if (proxy)
// FIXME: Fix this to work properly with isolated worlds (see above).
instance = proxy->windowShell()->createWrapperFromCache(type);
- else {
- v8::Local<v8::Function> function;
- if (workerContextProxy)
- function = getConstructor(type, workerContextProxy->workerContext());
- else
- function = V8ClassIndex::getTemplate(type)->GetFunction();
- instance = SafeAllocation::newInstance(function);
- }
+ else
+ instance = SafeAllocation::newInstance(V8ClassIndex::getTemplate(type)->GetFunction());
if (!instance.IsEmpty()) {
// Avoid setting the DOM wrapper for failed allocations.
setDOMWrapper(instance, V8ClassIndex::ToInt(type), impl);
diff --git a/WebCore/bindings/v8/V8DOMWrapper.h b/WebCore/bindings/v8/V8DOMWrapper.h
index afac577..78e9ae2 100644
--- a/WebCore/bindings/v8/V8DOMWrapper.h
+++ b/WebCore/bindings/v8/V8DOMWrapper.h
@@ -192,6 +192,7 @@ namespace WebCore {
static void setHiddenWindowReference(Frame*, const int internalIndex, v8::Handle<v8::Object>);
static v8::Local<v8::Object> instantiateV8Object(V8Proxy* proxy, V8ClassIndex::V8WrapperType type, void* impl);
+ static v8::Local<v8::Object> instantiateV8ObjectInWorkerContext(V8ClassIndex::V8WrapperType type, void* impl);
static v8::Handle<v8::Object> getWrapper(Node*);
};
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list