X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..HEAD:/heap/Weak.h diff --git a/heap/Weak.h b/heap/Weak.h index 0938249..80cdbd8 100644 --- a/heap/Weak.h +++ b/heap/Weak.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2012 Apple Inc. All rights reserved. + * Copyright (C) 2009, 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,41 +26,65 @@ #ifndef Weak_h #define Weak_h -#include -#include "PassWeak.h" -#include "WeakSetInlines.h" +#include +#include namespace JSC { -template class Weak : public WeakImplAccessor, T> { +class WeakImpl; +class WeakHandleOwner; + +// This is a free function rather than a Weak member function so we can put it in Weak.cpp. +JS_EXPORT_PRIVATE void weakClearSlowCase(WeakImpl*&); + +template class Weak { WTF_MAKE_NONCOPYABLE(Weak); public: - friend class WeakImplAccessor, T>; - typedef typename WeakImplAccessor, T>::GetType GetType; + Weak() + : m_impl(0) + { + } + + Weak(std::nullptr_t) + : m_impl(0) + { + } - Weak(); - Weak(std::nullptr_t); - Weak(GetType, WeakHandleOwner* = 0, void* context = 0); + Weak(T*, WeakHandleOwner* = 0, void* context = 0); enum HashTableDeletedValueTag { HashTableDeletedValue }; bool isHashTableDeletedValue() const; Weak(HashTableDeletedValueTag); - template Weak(const PassWeak&); + Weak(Weak&&); - ~Weak(); + ~Weak() + { + clear(); + } void swap(Weak&); - Weak& operator=(const PassWeak&); - + + Weak& operator=(Weak&&); + bool operator!() const; + T* operator->() const; + T& operator*() const; + T* get() const; + + bool was(T*) const; // This conversion operator allows implicit conversion to bool but not to other integer types. - typedef JSValue (HandleBase::*UnspecifiedBoolType); + typedef void* (Weak::*UnspecifiedBoolType); operator UnspecifiedBoolType*() const; - PassWeak release(); - void clear(); + WeakImpl* leakImpl() WARN_UNUSED_RETURN; + void clear() + { + if (!m_impl) + return; + weakClearSlowCase(m_impl); + } private: static WeakImpl* hashTableDeletedValue(); @@ -68,114 +92,6 @@ private: WeakImpl* m_impl; }; -template inline Weak::Weak() - : m_impl(0) -{ -} - -template inline Weak::Weak(std::nullptr_t) - : m_impl(0) -{ -} - -template inline Weak::Weak(typename Weak::GetType getType, WeakHandleOwner* weakOwner, void* context) - : m_impl(getType ? WeakSet::allocate(getType, weakOwner, context) : 0) -{ -} - -template inline bool Weak::isHashTableDeletedValue() const -{ - return m_impl == hashTableDeletedValue(); -} - -template inline Weak::Weak(typename Weak::HashTableDeletedValueTag) - : m_impl(hashTableDeletedValue()) -{ -} - -template template inline Weak::Weak(const PassWeak& other) - : m_impl(other.leakImpl()) -{ -} - -template inline Weak::~Weak() -{ - clear(); -} - -template inline void swap(Weak& a, Weak& b) -{ - a.swap(b); -} - -template inline void Weak::swap(Weak& other) -{ - std::swap(m_impl, other.m_impl); -} - -template inline Weak& Weak::operator=(const PassWeak& o) -{ - clear(); - m_impl = o.leakImpl(); - return *this; -} - -template inline bool Weak::operator!() const -{ - return !m_impl || !m_impl->jsValue() || m_impl->state() != WeakImpl::Live; -} - -template inline Weak::operator UnspecifiedBoolType*() const -{ - return reinterpret_cast(!!*this); -} - -template inline PassWeak Weak::release() -{ - PassWeak tmp = adoptWeak(m_impl); - m_impl = 0; - return tmp; -} - -template inline void Weak::clear() -{ - if (!m_impl) - return; - WeakSet::deallocate(m_impl); - m_impl = 0; -} - -template inline WeakImpl* Weak::hashTableDeletedValue() -{ - return reinterpret_cast(-1); -} - } // namespace JSC -namespace WTF { - -template struct VectorTraits > : SimpleClassVectorTraits { - static const bool canCompareWithMemcmp = false; -}; - -template struct HashTraits > : SimpleClassHashTraits > { - typedef JSC::Weak StorageType; - - typedef std::nullptr_t EmptyValueType; - static EmptyValueType emptyValue() { return nullptr; } - - typedef JSC::PassWeak PassInType; - static void store(PassInType value, StorageType& storage) { storage = value; } - - typedef JSC::PassWeak PassOutType; - static PassOutType passOut(StorageType& value) { return value.release(); } - static PassOutType passOut(EmptyValueType) { return PassOutType(); } - - typedef typename StorageType::GetType PeekType; - static PeekType peek(const StorageType& value) { return value.get(); } - static PeekType peek(EmptyValueType) { return PeekType(); } -}; - -} - #endif // Weak_h