Diff
Modified: trunk/Source/_javascript_Core/API/JSClassRef.cpp (108009 => 108010)
--- trunk/Source/_javascript_Core/API/JSClassRef.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/API/JSClassRef.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -222,7 +222,7 @@
if (!jsClassData.cachedPrototype) {
// Recursive, but should be good enough for our purposes
- jsClassData.cachedPrototype.set(exec->globalData(), JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
+ jsClassData.cachedPrototype = PassWeak<JSObject>(exec->globalData(), JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
if (parentClass) {
if (JSObject* prototype = parentClass->prototype(exec))
jsClassData.cachedPrototype->setPrototype(exec->globalData(), prototype);
Modified: trunk/Source/_javascript_Core/ChangeLog (108009 => 108010)
--- trunk/Source/_javascript_Core/ChangeLog 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/ChangeLog 2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,51 @@
+2012-02-15 Geoffrey Garen <[email protected]>
+
+ Made Weak<T> single-owner, adding PassWeak<T>
+ https://bugs.webkit.org/show_bug.cgi?id=78740
+
+ Reviewed by Sam Weinig.
+
+ This works basically the same way as OwnPtr<T> and PassOwnPtr<T>.
+
+ This clarifies the semantics of finalizers: It's ambiguous and probably
+ a bug to copy a finalizer (i.e., it's a bug to run a C++ destructor
+ twice), so I've made Weak<T> non-copyable. Anywhere we used to copy a
+ Weak<T>, we now use PassWeak<T>.
+
+ This also makes Weak<T> HashMaps more efficient.
+
+ * API/JSClassRef.cpp:
+ (OpaqueJSClass::prototype): Use PassWeak<T> instead of set(), since
+ set() is gone now.
+
+ * _javascript_Core.xcodeproj/project.pbxproj: Export!
+
+ * heap/PassWeak.h: Added.
+ (JSC):
+ (PassWeak):
+ (JSC::PassWeak::PassWeak):
+ (JSC::PassWeak::~PassWeak):
+ (JSC::PassWeak::get):
+ (JSC::::leakHandle):
+ (JSC::adoptWeak):
+ (JSC::operator==):
+ (JSC::operator!=): This is the Weak<T> version of PassOwnPtr<T>.
+
+ * heap/Weak.h:
+ (Weak):
+ (JSC::Weak::Weak):
+ (JSC::Weak::release):
+ (JSC::Weak::hashTableDeletedValue):
+ (JSC::=):
+ (JSC): Changed to be non-copyable, removing a lot of copying-related
+ APIs. Added hash traits so hash maps still work.
+
+ * jit/JITStubs.cpp:
+ (JSC::JITThunks::hostFunctionStub):
+ * runtime/RegExpCache.cpp:
+ (JSC::RegExpCache::lookupOrCreate): Use PassWeak<T>, as required by
+ our new hash map API.
+
2012-02-16 Mark Hahnenberg <[email protected]>
Fix the broken viewport tests
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (108009 => 108010)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2012-02-17 01:56:13 UTC (rev 108010)
@@ -266,6 +266,7 @@
148F21B7107EC5470042EC2C /* Nodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F692A86D0255597D01FF60F7 /* Nodes.cpp */; };
148F21BC107EC54D0042EC2C /* Parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93F0B3A909BB4DC00068FCE3 /* Parser.cpp */; };
149559EE0DDCDDF700648087 /* DebuggerCallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */; };
+ 1497209114EB831500FEB1B7 /* PassWeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 1497209014EB831500FEB1B7 /* PassWeak.h */; settings = {ATTRIBUTES = (Private, ); }; };
14A1563210966365006FA260 /* DateInstanceCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A1563010966365006FA260 /* DateInstanceCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
14A23D750F4E1ABB0023CDAD /* JITStubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14A23D6C0F4E19CE0023CDAD /* JITStubs.cpp */; };
14A42E3F0F4F60EE00599099 /* TimeoutChecker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14A42E3D0F4F60EE00599099 /* TimeoutChecker.cpp */; };
@@ -1030,6 +1031,7 @@
148A1ECD0D10C23B0069A47C /* RefPtrHashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RefPtrHashMap.h; sourceTree = "<group>"; };
148CD1D7108CF902008163C6 /* JSContextRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSContextRefPrivate.h; sourceTree = "<group>"; };
149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DebuggerCallFrame.cpp; sourceTree = "<group>"; };
+ 1497209014EB831500FEB1B7 /* PassWeak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PassWeak.h; sourceTree = "<group>"; };
149B24FF0D8AF6D1009CB8C7 /* Register.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Register.h; sourceTree = "<group>"; };
149DAAF212EB559D0083B12B /* ConservativeRoots.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConservativeRoots.h; sourceTree = "<group>"; };
14A1563010966365006FA260 /* DateInstanceCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateInstanceCache.h; sourceTree = "<group>"; };
@@ -1856,6 +1858,7 @@
14D2F3D9139F4BE200491031 /* MarkedSpace.h */,
142D6F0E13539A4100B02E86 /* MarkStack.cpp */,
142D6F0F13539A4100B02E86 /* MarkStack.h */,
+ 1497209014EB831500FEB1B7 /* PassWeak.h */,
14BA78F013AAB88F005B7C2C /* SlotVisitor.h */,
142E3132134FF0A600AFADB5 /* Strong.h */,
145722851437E140005FDE26 /* StrongInlines.h */,
@@ -3226,6 +3229,7 @@
0F9FC8C414E1B60000D52AE0 /* PolymorphicPutByIdList.h in Headers */,
0F9FC8C514E1B60400D52AE0 /* PutKind.h in Headers */,
BCBE2CAE14E985AA000593AD /* GCAssertions.h in Headers */,
+ 1497209114EB831500FEB1B7 /* PassWeak.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Added: trunk/Source/_javascript_Core/heap/PassWeak.h (0 => 108010)
--- trunk/Source/_javascript_Core/heap/PassWeak.h (rev 0)
+++ trunk/Source/_javascript_Core/heap/PassWeak.h 2012-02-17 01:56:13 UTC (rev 108010)
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PassWeak_h
+#define PassWeak_h
+
+#include "Assertions.h"
+#include "Handle.h"
+#include "NullPtr.h"
+#include "TypeTraits.h"
+
+namespace JSC {
+
+template<typename T> class Weak;
+template<typename T> class PassWeak;
+template<typename T> PassWeak<T> adoptWeak(HandleSlot);
+
+template<typename T> class PassWeak : public Handle<T> {
+ using Handle<T>::slot;
+ using Handle<T>::setSlot;
+
+public:
+ typedef typename Handle<T>::ExternalType ExternalType;
+
+ PassWeak() : Handle<T>() { }
+ PassWeak(std::nullptr_t) : Handle<T>() { }
+
+ PassWeak(JSGlobalData& globalData, ExternalType externalType = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
+ : Handle<T>(globalData.heap.handleHeap()->allocate())
+ {
+ HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
+ JSValue value = HandleTypes<T>::toJSValue(externalType);
+ HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
+ *slot() = value;
+ }
+
+ // It somewhat breaks the type system to allow transfer of ownership out of
+ // a const PassWeak. However, it makes it much easier to work with PassWeak
+ // temporaries, and we don't have a need to use real const PassWeaks anyway.
+ PassWeak(const PassWeak& o) : Handle<T>(o.leakHandle()) { }
+ template<typename U> PassWeak(const PassWeak<U>& o) : Handle<T>(o.leakHandle()) { }
+
+ ~PassWeak()
+ {
+ if (!slot())
+ return;
+ HandleHeap::heapFor(slot())->deallocate(slot());
+ setSlot(0);
+ }
+
+ ExternalType get() const { return HandleTypes<T>::getFromSlot(slot()); }
+
+ HandleSlot leakHandle() const WARN_UNUSED_RETURN;
+
+private:
+ friend PassWeak adoptWeak<T>(HandleSlot);
+
+ explicit PassWeak(HandleSlot slot) : Handle<T>(slot) { }
+};
+
+template<typename T> inline HandleSlot PassWeak<T>::leakHandle() const
+{
+ HandleSlot slot = this->slot();
+ const_cast<PassWeak<T>*>(this)->setSlot(0);
+ return slot;
+}
+
+template<typename T> PassWeak<T> adoptWeak(HandleSlot slot)
+{
+ return PassWeak<T>(slot);
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, const PassWeak<U>& b)
+{
+ return a.get() == b.get();
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, const Weak<U>& b)
+{
+ return a.get() == b.get();
+}
+
+template<typename T, typename U> inline bool operator==(const Weak<T>& a, const PassWeak<U>& b)
+{
+ return a.get() == b.get();
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, U* b)
+{
+ return a.get() == b;
+}
+
+template<typename T, typename U> inline bool operator==(T* a, const PassWeak<U>& b)
+{
+ return a == b.get();
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, const PassWeak<U>& b)
+{
+ return a.get() != b.get();
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, const Weak<U>& b)
+{
+ return a.get() != b.get();
+}
+
+template<typename T, typename U> inline bool operator!=(const Weak<T>& a, const PassWeak<U>& b)
+{
+ return a.get() != b.get();
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, U* b)
+{
+ return a.get() != b;
+}
+
+template<typename T, typename U> inline bool operator!=(T* a, const PassWeak<U>& b)
+{
+ return a != b.get();
+}
+
+} // namespace JSC
+
+#endif // PassWeak_h
Modified: trunk/Source/_javascript_Core/heap/Weak.h (108009 => 108010)
--- trunk/Source/_javascript_Core/heap/Weak.h 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/heap/Weak.h 2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,11 +30,14 @@
#include "Handle.h"
#include "HandleHeap.h"
#include "JSGlobalData.h"
+#include "PassWeak.h"
namespace JSC {
// A weakly referenced handle that becomes 0 when the value it points to is garbage collected.
template <typename T> class Weak : public Handle<T> {
+ WTF_MAKE_NONCOPYABLE(Weak);
+
using Handle<T>::slot;
using Handle<T>::setSlot;
@@ -46,11 +49,18 @@
{
}
- Weak(JSGlobalData& globalData, ExternalType value = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
+ Weak(std::nullptr_t)
+ : Handle<T>()
+ {
+ }
+
+ Weak(JSGlobalData& globalData, ExternalType externalType = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
: Handle<T>(globalData.heap.handleHeap()->allocate())
{
HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
- set(value);
+ JSValue value = HandleTypes<T>::toJSValue(externalType);
+ HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
+ *slot() = value;
}
enum AdoptTag { Adopt };
@@ -59,23 +69,7 @@
{
validateCell(get());
}
-
- Weak(const Weak& other)
- : Handle<T>()
- {
- if (!other.slot())
- return;
- setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
- }
- template <typename U> Weak(const Weak<U>& other)
- : Handle<T>()
- {
- if (!other.slot())
- return;
- setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
- }
-
enum HashTableDeletedValueTag { HashTableDeletedValue };
bool isHashTableDeletedValue() const { return slot() == hashTableDeletedValue(); }
Weak(HashTableDeletedValueTag)
@@ -83,6 +77,11 @@
{
}
+ template<typename U> Weak(const PassWeak<U>& other)
+ : Handle<T>(other.leakHandle())
+ {
+ }
+
~Weak()
{
clear();
@@ -93,8 +92,12 @@
Handle<T>::swap(other);
}
+ Weak& operator=(const PassWeak<T>&);
+
ExternalType get() const { return HandleTypes<T>::getFromSlot(slot()); }
+ PassWeak<T> release() { PassWeak<T> tmp = adoptWeak<T>(slot()); setSlot(0); return tmp; }
+
void clear()
{
if (!slot())
@@ -103,32 +106,6 @@
setSlot(0);
}
- void set(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner = 0, void* context = 0)
- {
- if (!slot()) {
- setSlot(globalData.heap.handleHeap()->allocate());
- HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
- }
- ASSERT(HandleHeap::heapFor(slot())->hasWeakOwner(slot(), weakOwner));
- set(value);
- }
-
- template <typename U> Weak& operator=(const Weak<U>& other)
- {
- clear();
- if (other.slot())
- setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
- return *this;
- }
-
- Weak& operator=(const Weak& other)
- {
- clear();
- if (other.slot())
- setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
- return *this;
- }
-
HandleSlot leakHandle()
{
ASSERT(HandleHeap::heapFor(slot())->hasFinalizer(slot()));
@@ -139,14 +116,6 @@
private:
static HandleSlot hashTableDeletedValue() { return reinterpret_cast<HandleSlot>(-1); }
-
- void set(ExternalType externalType)
- {
- ASSERT(slot());
- JSValue value = HandleTypes<T>::toJSValue(externalType);
- HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
- *slot() = value;
- }
};
template<class T> inline void swap(Weak<T>& a, Weak<T>& b)
@@ -154,6 +123,13 @@
a.swap(b);
}
+template<typename T> inline Weak<T>& Weak<T>::operator=(const PassWeak<T>& o)
+{
+ clear();
+ setSlot(o.leakHandle());
+ return *this;
+}
+
} // namespace JSC
namespace WTF {
@@ -162,8 +138,24 @@
static const bool canCompareWithMemcmp = false;
};
-template<typename P> struct HashTraits<JSC::Weak<P> > : SimpleClassHashTraits<JSC::Weak<P> > { };
+template<typename T> struct HashTraits<JSC::Weak<T> > : SimpleClassHashTraits<JSC::Weak<T> > {
+ typedef JSC::Weak<T> StorageType;
+ typedef std::nullptr_t EmptyValueType;
+ static EmptyValueType emptyValue() { return EmptyValueType(); }
+
+ typedef JSC::PassWeak<T> PassInType;
+ static void store(PassInType value, StorageType& storage) { storage = value; }
+
+ typedef JSC::PassWeak<T> PassOutType;
+ static PassOutType passOut(StorageType& value) { return value.release(); }
+ static PassOutType passOut(EmptyValueType) { return PassOutType(); }
+
+ typedef typename StorageType::ExternalType PeekType;
+ static PeekType peek(const StorageType& value) { return value.get(); }
+ static PeekType peek(EmptyValueType) { return PeekType(); }
+};
+
}
#endif // Weak_h
Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (108009 => 108010)
--- trunk/Source/_javascript_Core/jit/JITStubs.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -3600,15 +3600,15 @@
NativeExecutable* JITThunks::hostFunctionStub(JSGlobalData* globalData, NativeFunction function, NativeFunction constructor)
{
- std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, Weak<NativeExecutable>());
- if (!*entry.first->second)
- entry.first->second.set(*globalData, NativeExecutable::create(*globalData, JIT::compileCTINativeCall(globalData, function), function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), constructor, NoIntrinsic));
- return entry.first->second.get();
+ std::pair<HostFunctionStubMap::iterator, bool> result = m_hostFunctionStubMap->add(function, PassWeak<NativeExecutable>());
+ if (!result.first->second)
+ result.first->second = PassWeak<NativeExecutable>(*globalData, NativeExecutable::create(*globalData, JIT::compileCTINativeCall(globalData, function), function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), constructor, NoIntrinsic));
+ return result.first->second.get();
}
NativeExecutable* JITThunks::hostFunctionStub(JSGlobalData* globalData, NativeFunction function, ThunkGenerator generator, Intrinsic intrinsic)
{
- std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, Weak<NativeExecutable>());
+ std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, PassWeak<NativeExecutable>());
if (!*entry.first->second) {
MacroAssemblerCodeRef code;
if (generator) {
@@ -3618,7 +3618,7 @@
code = MacroAssemblerCodeRef();
} else
code = JIT::compileCTINativeCall(globalData, function);
- entry.first->second.set(*globalData, NativeExecutable::create(*globalData, code, function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), callHostFunctionAsConstructor, intrinsic));
+ entry.first->second = PassWeak<NativeExecutable>(*globalData, NativeExecutable::create(*globalData, code, function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), callHostFunctionAsConstructor, intrinsic));
}
return entry.first->second.get();
}
Modified: trunk/Source/_javascript_Core/runtime/RegExpCache.cpp (108009 => 108010)
--- trunk/Source/_javascript_Core/runtime/RegExpCache.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/runtime/RegExpCache.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -46,7 +46,7 @@
// We need to do a second lookup to add the RegExp as
// allocating it may have caused a gc cycle, which in
// turn may have removed items from the cache.
- m_weakCache.add(key, Weak<RegExp>(*m_globalData, regExp, this));
+ m_weakCache.add(key, PassWeak<RegExp>(*m_globalData, regExp, this));
return regExp;
}
Modified: trunk/Source/WebCore/ChangeLog (108009 => 108010)
--- trunk/Source/WebCore/ChangeLog 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/ChangeLog 2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,29 @@
+2012-02-15 Geoffrey Garen <[email protected]>
+
+ Made Weak<T> single-owner, adding PassWeak<T>
+ https://bugs.webkit.org/show_bug.cgi?id=78740
+
+ Reviewed by Sam Weinig.
+
+ * bindings/js/JSDOMBinding.cpp:
+ (WebCore::jsStringSlowCase): Use PassWeak<T>, as required by our new
+ hash map API.
+
+ * bindings/js/JSDOMBinding.h:
+ (WebCore::getCachedWrapper):
+ (WebCore::cacheWrapper): Use PassWeak<T> and raw pointer, as required by
+ our new hash map API.
+
+ * bindings/js/JSEventListener.h:
+ (WebCore::JSEventListener::setWrapper):
+ * bindings/js/ScriptWrappable.h:
+ (WebCore::ScriptWrappable::setWrapper):
+ * bridge/jsc/BridgeJSC.cpp:
+ (JSC::Bindings::Instance::createRuntimeObject):
+ * bridge/runtime_root.cpp:
+ (JSC::Bindings::RootObject::addRuntimeObject): Use PassWeak<T>, as
+ required by our new hash map and Weak<T> APIs.
+
2012-02-16 Ryosuke Niwa <[email protected]>
Crash in visiblePositionForIndex
@@ -2119,6 +2145,7 @@
* platform/ScrollView.h:
Move wheelEvent to FrameView.
+>>>>>>> .r108008
2012-02-15 Mark Hahnenberg <[email protected]>
RootObject::finalize can cause a crash in object->invalidate()
@@ -7640,7 +7667,6 @@
(WebCore::RenderStyle::getRoundedBorderFor):
(WebCore::RenderStyle::getRoundedInnerBorderFor):
-<<<<<<< .mine
2012-02-09 Levi Weintraub <[email protected]>
Add pixelSnappedIntRect method
Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp (108009 => 108010)
--- trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -49,7 +49,7 @@
JSValue jsStringSlowCase(ExecState* exec, JSStringCache& stringCache, StringImpl* stringImpl)
{
JSString* wrapper = jsString(exec, UString(stringImpl));
- stringCache.add(stringImpl, Weak<JSString>(exec->globalData(), wrapper, currentWorld(exec)->stringWrapperOwner(), stringImpl));
+ stringCache.add(stringImpl, PassWeak<JSString>(exec->globalData(), wrapper, currentWorld(exec)->stringWrapperOwner(), stringImpl));
return wrapper;
}
Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (108009 => 108010)
--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h 2012-02-17 01:56:13 UTC (rev 108010)
@@ -132,17 +132,16 @@
{
if (JSDOMWrapper* wrapper = getInlineCachedWrapper(world, domObject))
return wrapper;
- return world->m_wrappers.get(domObject).get();
+ return world->m_wrappers.get(domObject);
}
template <typename DOMClass> inline void cacheWrapper(DOMWrapperWorld* world, DOMClass* domObject, JSDOMWrapper* wrapper)
{
if (setInlineCachedWrapper(world, domObject, wrapper))
return;
- pair<DOMObjectWrapperMap::iterator, bool> entry = world->m_wrappers.add(domObject, JSC::Weak<JSDOMWrapper>());
- ASSERT(entry.second);
- JSC::Weak<JSDOMWrapper> handle(*world->globalData(), wrapper, wrapperOwner(world, domObject), wrapperContext(world, domObject));
- entry.first->second.swap(handle);
+ JSC::PassWeak<JSDOMWrapper> passWeak(*world->globalData(), wrapper, wrapperOwner(world, domObject), wrapperContext(world, domObject));
+ pair<DOMObjectWrapperMap::iterator, bool> result = world->m_wrappers.add(domObject, passWeak);
+ ASSERT_UNUSED(result, result.second);
}
template <typename DOMClass> inline void uncacheWrapper(DOMWrapperWorld* world, DOMClass* domObject, JSDOMWrapper* wrapper)
Modified: trunk/Source/WebCore/bindings/js/JSEventListener.h (108009 => 108010)
--- trunk/Source/WebCore/bindings/js/JSEventListener.h 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSEventListener.h 2012-02-17 01:56:13 UTC (rev 108010)
@@ -53,7 +53,7 @@
DOMWrapperWorld* isolatedWorld() const { return m_isolatedWorld.get(); }
JSC::JSObject* wrapper() const { return m_wrapper.get(); }
- void setWrapper(JSC::JSGlobalData& globalData, JSC::JSObject* wrapper) const { m_wrapper.set(globalData, wrapper, 0); }
+ void setWrapper(JSC::JSGlobalData& globalData, JSC::JSObject* wrapper) const { m_wrapper = JSC::PassWeak<JSC::JSObject>(globalData, wrapper, 0); }
private:
virtual JSC::JSObject* initializeJSFunction(ScriptExecutionContext*) const;
Modified: trunk/Source/WebCore/bindings/js/ScriptWrappable.h (108009 => 108010)
--- trunk/Source/WebCore/bindings/js/ScriptWrappable.h 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/ScriptWrappable.h 2012-02-17 01:56:13 UTC (rev 108010)
@@ -45,7 +45,7 @@
void setWrapper(JSC::JSGlobalData& globalData, JSDOMWrapper* wrapper, JSC::WeakHandleOwner* wrapperOwner, void* context)
{
- m_wrapper.set(globalData, wrapper, wrapperOwner, context);
+ m_wrapper = JSC::PassWeak<JSDOMWrapper>(globalData, wrapper, wrapperOwner, context);
}
void clearWrapper()
Modified: trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp (108009 => 108010)
--- trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -95,7 +95,7 @@
JSLock lock(SilenceAssertionsOnly);
RuntimeObject* newObject = newRuntimeObject(exec);
- m_runtimeObject.set(exec->globalData(), newObject, 0);
+ m_runtimeObject = PassWeak<RuntimeObject>(exec->globalData(), newObject);
m_rootObject->addRuntimeObject(exec->globalData(), newObject);
return newObject;
}
Modified: trunk/Source/WebCore/bridge/qt/qt_runtime.cpp (108009 => 108010)
--- trunk/Source/WebCore/bridge/qt/qt_runtime.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/qt/qt_runtime.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -972,7 +972,7 @@
Base::finishCreation(exec->globalData(), identifier);
QW_D(QtRuntimeMethod);
d->m_instance = instance;
- d->m_finalizer.set(exec->globalData(), this, d);
+ d->m_finalizer = PassWeak<QtRuntimeMethod>(exec->globalData(), this, d);
}
QtRuntimeMethod::~QtRuntimeMethod()
Modified: trunk/Source/WebCore/bridge/runtime_root.cpp (108009 => 108010)
--- trunk/Source/WebCore/bridge/runtime_root.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/runtime_root.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -181,7 +181,7 @@
ASSERT(m_isValid);
ASSERT(!m_runtimeObjects.get(object));
- m_runtimeObjects.set(object, JSC::Weak<RuntimeObject>(globalData, object, this));
+ m_runtimeObjects.set(object, JSC::PassWeak<RuntimeObject>(globalData, object, this));
}
void RootObject::removeRuntimeObject(RuntimeObject* object)
Modified: trunk/Source/WebKit2/ChangeLog (108009 => 108010)
--- trunk/Source/WebKit2/ChangeLog 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebKit2/ChangeLog 2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,14 @@
+2012-02-15 Geoffrey Garen <[email protected]>
+
+ Made Weak<T> single-owner, adding PassWeak<T>
+ https://bugs.webkit.org/show_bug.cgi?id=78740
+
+ Reviewed by Sam Weinig.
+
+ * WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
+ (WebKit::NPRuntimeObjectMap::getOrCreateJSObject): Use raw pointer and
+ PassWeak<T>, as required by our new hash map API.
+
2012-02-16 Sergio Villar Senin <[email protected]>
[soup] Move important SoupSession feature initialization to WebCore
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp (108009 => 108010)
--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp 2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp 2012-02-17 01:56:13 UTC (rev 108010)
@@ -98,11 +98,11 @@
if (NPJSObject::isNPJSObject(npObject))
return NPJSObject::toNPJSObject(npObject)->jsObject();
- if (JSC::Weak<JSNPObject> jsNPObject = m_jsNPObjects.get(npObject))
- return jsNPObject.get();
+ if (JSNPObject* jsNPObject = m_jsNPObjects.get(npObject))
+ return jsNPObject;
JSNPObject* jsNPObject = JSNPObject::create(globalObject, this, npObject);
- m_jsNPObjects.set(npObject, JSC::Weak<JSNPObject>(globalObject->globalData(), jsNPObject, this, npObject));
+ m_jsNPObjects.set(npObject, JSC::PassWeak<JSNPObject>(globalObject->globalData(), jsNPObject, this, npObject));
return jsNPObject;
}