]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/WeakGCPtr.h
2 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
29 #include "Collector.h"
30 #include <wtf/Noncopyable.h>
34 // A smart pointer whose get() function returns 0 for cells awaiting destruction.
35 template <typename T
> class WeakGCPtr
: Noncopyable
{
37 WeakGCPtr() : m_ptr(0) { }
38 WeakGCPtr(T
* ptr
) { assign(ptr
); }
42 if (!m_ptr
|| !Heap::isCellMarked(m_ptr
))
47 bool clear(JSCell
* ptr
)
56 T
& operator*() const { return *get(); }
57 T
* operator->() const { return get(); }
59 bool operator!() const { return !get(); }
61 // This conversion operator allows implicit conversion to bool but not to other integer types.
63 operator bool() const { return m_ptr
; }
65 typedef T
* WeakGCPtr::*UnspecifiedBoolType
;
66 operator UnspecifiedBoolType() const { return get() ? &WeakGCPtr::m_ptr
: 0; }
69 WeakGCPtr
& operator=(T
*);
72 bool hasDeadObject() const { return !!m_ptr
; }
86 template <typename T
> inline WeakGCPtr
<T
>& WeakGCPtr
<T
>::operator=(T
* optr
)
92 template <typename T
, typename U
> inline bool operator==(const WeakGCPtr
<T
>& a
, const WeakGCPtr
<U
>& b
)
94 return a
.get() == b
.get();
97 template <typename T
, typename U
> inline bool operator==(const WeakGCPtr
<T
>& a
, U
* b
)
102 template <typename T
, typename U
> inline bool operator==(T
* a
, const WeakGCPtr
<U
>& b
)
107 template <typename T
, typename U
> inline bool operator!=(const WeakGCPtr
<T
>& a
, const WeakGCPtr
<U
>& b
)
109 return a
.get() != b
.get();
112 template <typename T
, typename U
> inline bool operator!=(const WeakGCPtr
<T
>& a
, U
* b
)
117 template <typename T
, typename U
> inline bool operator!=(T
* a
, const WeakGCPtr
<U
>& b
)
122 template <typename T
, typename U
> inline WeakGCPtr
<T
> static_pointer_cast(const WeakGCPtr
<U
>& p
)
124 return WeakGCPtr
<T
>(static_cast<T
*>(p
.get()));
127 template <typename T
, typename U
> inline WeakGCPtr
<T
> const_pointer_cast(const WeakGCPtr
<U
>& p
)
129 return WeakGCPtr
<T
>(const_cast<T
*>(p
.get()));
132 template <typename T
> inline T
* getPtr(const WeakGCPtr
<T
>& p
)
139 #endif // WeakGCPtr_h