[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373
dglazkov at chromium.org
dglazkov at chromium.org
Wed Apr 7 23:14:58 UTC 2010
The following commit has been merged in the webkit-1.2 branch:
commit 484a08cd210fc2a5cbc61e9f186ab9d22434eb7f
Author: dglazkov at chromium.org <dglazkov at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Oct 29 20:01:12 2009 +0000
2009-10-29 Dimitri Glazkov <dglazkov at chromium.org>
Reviewed by Adam Barth.
[V8] Remove random crashes by removing retrieval of V8 context during garbage collection.
https://bugs.webkit.org/show_bug.cgi?id=30919
Unfortunately, I haven't been able to trigger this crash explicitly, so no test :(.
* bindings/v8/V8DOMWrapper.cpp:
(WebCore::V8DOMWrapper::jsWrapperForDOMObject): Added new "assume-it's-there" getter.
* bindings/v8/V8DOMWrapper.h: Added getter decl.
* bindings/v8/V8GCController.cpp:
(WebCore::GCPrologueVisitor::visitDOMWrapper): Changed to use explicit getter.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@50293 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index e7c83cb..d2165e9 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,5 +1,21 @@
2009-10-29 Dimitri Glazkov <dglazkov at chromium.org>
+ Reviewed by Adam Barth.
+
+ [V8] Remove random crashes by removing retrieval of V8 context during garbage collection.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30919
+
+ Unfortunately, I haven't been able to trigger this crash explicitly, so no test :(.
+
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::jsWrapperForDOMObject): Added new "assume-it's-there" getter.
+ * bindings/v8/V8DOMWrapper.h: Added getter decl.
+ * bindings/v8/V8GCController.cpp:
+ (WebCore::GCPrologueVisitor::visitDOMWrapper): Changed to use explicit getter.
+
+2009-10-29 Dimitri Glazkov <dglazkov at chromium.org>
+
Unreviewed, build fix.
[Chromium] Adjust the project files to sync up with
diff --git a/WebCore/bindings/v8/V8DOMWrapper.cpp b/WebCore/bindings/v8/V8DOMWrapper.cpp
index 321153d..cf05f53 100644
--- a/WebCore/bindings/v8/V8DOMWrapper.cpp
+++ b/WebCore/bindings/v8/V8DOMWrapper.cpp
@@ -154,6 +154,20 @@ bool V8DOMWrapper::domObjectHasJSWrapper(void* object)
return getDOMObjectMap().contains(object) || getActiveDOMObjectMap().contains(object);
}
+v8::Persistent<v8::Object> V8DOMWrapper::jsWrapperForDOMObject(void* object)
+{
+ v8::Persistent<v8::Object> wrapper = getDOMObjectMap().get(object);
+ ASSERT(!wrapper.IsEmpty());
+ return wrapper;
+}
+
+v8::Persistent<v8::Object> V8DOMWrapper::jsWrapperForActiveDOMObject(void* object)
+{
+ v8::Persistent<v8::Object> wrapper = getActiveDOMObjectMap().get(object);
+ ASSERT(!wrapper.IsEmpty());
+ return wrapper;
+}
+
// The caller must have increased obj's ref count.
void V8DOMWrapper::setJSWrapperForDOMObject(void* object, v8::Persistent<v8::Object> wrapper)
{
diff --git a/WebCore/bindings/v8/V8DOMWrapper.h b/WebCore/bindings/v8/V8DOMWrapper.h
index 227c9ff..2b939c8 100644
--- a/WebCore/bindings/v8/V8DOMWrapper.h
+++ b/WebCore/bindings/v8/V8DOMWrapper.h
@@ -279,6 +279,10 @@ namespace WebCore {
// Checks whether a DOM object has a JS wrapper.
static bool domObjectHasJSWrapper(void*);
+ // Get JS wrapper of an existing DOM object, assuming that the wrapper
+ // exists.
+ static v8::Persistent<v8::Object> jsWrapperForDOMObject(void*);
+ static v8::Persistent<v8::Object> jsWrapperForActiveDOMObject(void*);
// Set JS wrapper of a DOM object, the caller in charge of increase ref.
static void setJSWrapperForDOMObject(void*, v8::Persistent<v8::Object>);
static void setJSWrapperForActiveDOMObject(void*, v8::Persistent<v8::Object>);
diff --git a/WebCore/bindings/v8/V8GCController.cpp b/WebCore/bindings/v8/V8GCController.cpp
index 8fe4be1..a1dc819 100644
--- a/WebCore/bindings/v8/V8GCController.cpp
+++ b/WebCore/bindings/v8/V8GCController.cpp
@@ -218,8 +218,8 @@ public:
// As ports are always entangled in pairs only perform the entanglement
// once for each pair (see ASSERT in MessagePort::unentangle()).
if (port1 < port2) {
- v8::Handle<v8::Value> port1Wrapper = V8DOMWrapper::convertToV8Object(V8ClassIndex::MESSAGEPORT, port1);
- v8::Handle<v8::Value> port2Wrapper = V8DOMWrapper::convertToV8Object(V8ClassIndex::MESSAGEPORT, port2);
+ v8::Handle<v8::Value> port1Wrapper = V8DOMWrapper::jsWrapperForActiveDOMObject(port1);
+ v8::Handle<v8::Value> port2Wrapper = V8DOMWrapper::jsWrapperForActiveDOMObject(port2);
ASSERT(port1Wrapper->IsObject());
v8::Handle<v8::Object>::Cast(port1Wrapper)->SetInternalField(V8Custom::kMessagePortEntangledPortIndex, port2Wrapper);
ASSERT(port2Wrapper->IsObject());
@@ -228,7 +228,7 @@ public:
} else {
// Remove the wrapper entanglement when a port is not entangled.
if (V8DOMWrapper::domObjectHasJSWrapper(port1)) {
- v8::Handle<v8::Value> wrapper = V8DOMWrapper::convertToV8Object(V8ClassIndex::MESSAGEPORT, port1);
+ v8::Handle<v8::Value> wrapper = V8DOMWrapper::jsWrapperForActiveDOMObject(port1);
ASSERT(wrapper->IsObject());
v8::Handle<v8::Object>::Cast(wrapper)->SetInternalField(V8Custom::kMessagePortEntangledPortIndex, v8::Undefined());
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list