[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