2  * Copyright (C) 2011 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 <wtf/Assertions.h> 
  31 #include "HandleSet.h" 
  37 // A strongly referenced handle that prevents the object it points to from being garbage collected. 
  38 template <typename T
> class Strong 
: public Handle
<T
> { 
  39     using Handle
<T
>::slot
; 
  40     using Handle
<T
>::setSlot
; 
  43     typedef typename Handle
<T
>::ExternalType ExternalType
; 
  50     Strong(JSGlobalData
&, ExternalType 
= ExternalType()); 
  52     Strong(JSGlobalData
&, Handle
<T
>); 
  54     Strong(const Strong
& other
) 
  59         setSlot(HandleSet::heapFor(other
.slot())->allocate()); 
  63     template <typename U
> Strong(const Strong
<U
>& other
) 
  68         setSlot(HandleSet::heapFor(other
.slot())->allocate()); 
  72     enum HashTableDeletedValueTag 
{ HashTableDeletedValue 
}; 
  73     bool isHashTableDeletedValue() const { return slot() == hashTableDeletedValue(); } 
  74     Strong(HashTableDeletedValueTag
) 
  75         : Handle
<T
>(hashTableDeletedValue()) 
  84     bool operator!() const { return !slot() || !*slot(); } 
  86     // This conversion operator allows implicit conversion to bool but not to other integer types. 
  87     typedef JSValue (HandleBase::*UnspecifiedBoolType
); 
  88     operator UnspecifiedBoolType
*() const { return !!*this ? reinterpret_cast<UnspecifiedBoolType
*>(1) : 0; } 
  90     void swap(Strong
& other
) 
  92         Handle
<T
>::swap(other
); 
  95     ExternalType 
get() const { return HandleTypes
<T
>::getFromSlot(this->slot()); } 
  97     void set(JSGlobalData
&, ExternalType
); 
  99     template <typename U
> Strong
& operator=(const Strong
<U
>& other
) 
 106         set(*HandleSet::heapFor(other
.slot())->globalData(), other
.get()); 
 110     Strong
& operator=(const Strong
& other
) 
 117         set(*HandleSet::heapFor(other
.slot())->globalData(), other
.get()); 
 125         HandleSet::heapFor(slot())->deallocate(slot()); 
 130     static HandleSlot 
hashTableDeletedValue() { return reinterpret_cast<HandleSlot
>(-1); } 
 132     void set(ExternalType externalType
) 
 135         JSValue value 
= HandleTypes
<T
>::toJSValue(externalType
); 
 136         HandleSet::heapFor(slot())->writeBarrier(slot(), value
); 
 141 template<class T
> inline void swap(Strong
<T
>& a
, Strong
<T
>& b
) 
 150 template<typename T
> struct VectorTraits
<JSC::Strong
<T
> > : SimpleClassVectorTraits 
{ 
 151     static const bool canCompareWithMemcmp 
= false; 
 154 template<typename P
> struct HashTraits
<JSC::Strong
<P
> > : SimpleClassHashTraits
<JSC::Strong
<P
> > { };