diff -r 000000000000 -r 4f2f89ce4247 JavaScriptCore/runtime/WeakGCPtr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/JavaScriptCore/runtime/WeakGCPtr.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2009 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. AND ITS CONTRIBUTORS ``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 ITS 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 WeakGCPtr_h +#define WeakGCPtr_h + +#include "Collector.h" +#include + +namespace JSC { + +// A smart pointer whose get() function returns 0 for cells awaiting destruction. +template class WeakGCPtr : Noncopyable { +public: + WeakGCPtr() : m_ptr(0) { } + WeakGCPtr(T* ptr) { assign(ptr); } + + T* get() const + { + if (!m_ptr || !Heap::isCellMarked(m_ptr)) + return 0; + return m_ptr; + } + + bool clear(JSCell* ptr) + { + if (ptr == m_ptr) { + m_ptr = 0; + return true; + } + return false; + } + + T& operator*() const { return *get(); } + T* operator->() const { return get(); } + + bool operator!() const { return !get(); } + + // This conversion operator allows implicit conversion to bool but not to other integer types. +#if COMPILER(WINSCW) + operator bool() const { return m_ptr; } +#else + typedef T* WeakGCPtr::*UnspecifiedBoolType; + operator UnspecifiedBoolType() const { return get() ? &WeakGCPtr::m_ptr : 0; } +#endif + + WeakGCPtr& operator=(T*); + +#if !ASSERT_DISABLED + bool hasDeadObject() const { return !!m_ptr; } +#endif + +private: + void assign(T* ptr) + { + ASSERT(ptr); + Heap::markCell(ptr); + m_ptr = ptr; + } + + T* m_ptr; +}; + +template inline WeakGCPtr& WeakGCPtr::operator=(T* optr) +{ + assign(optr); + return *this; +} + +template inline bool operator==(const WeakGCPtr& a, const WeakGCPtr& b) +{ + return a.get() == b.get(); +} + +template inline bool operator==(const WeakGCPtr& a, U* b) +{ + return a.get() == b; +} + +template inline bool operator==(T* a, const WeakGCPtr& b) +{ + return a == b.get(); +} + +template inline bool operator!=(const WeakGCPtr& a, const WeakGCPtr& b) +{ + return a.get() != b.get(); +} + +template inline bool operator!=(const WeakGCPtr& a, U* b) +{ + return a.get() != b; +} + +template inline bool operator!=(T* a, const WeakGCPtr& b) +{ + return a != b.get(); +} + +template inline WeakGCPtr static_pointer_cast(const WeakGCPtr& p) +{ + return WeakGCPtr(static_cast(p.get())); +} + +template inline WeakGCPtr const_pointer_cast(const WeakGCPtr& p) +{ + return WeakGCPtr(const_cast(p.get())); +} + +template inline T* getPtr(const WeakGCPtr& p) +{ + return p.get(); +} + +} // namespace JSC + +#endif // WeakGCPtr_h