2  * Copyright (C) 2007, 2008 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 
   8  * 1.  Redistributions of source code must retain the above copyright 
   9  *     notice, this list of conditions and the following disclaimer. 
  10  * 2.  Redistributions in binary form must reproduce the above copyright 
  11  *     notice, this list of conditions and the following disclaimer in the 
  12  *     documentation and/or other materials provided with the distribution. 
  13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of 
  14  *     its contributors may be used to endorse or promote products derived 
  15  *     from this software without specific prior written permission. 
  17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 
  18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 
  21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
  23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
  26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  34 #include <wtf/AlwaysInline.h> 
  38     static ALWAYS_INLINE 
int missingSymbolMarker() { return std::numeric_limits
<int>::max(); } 
  40     // The bit twiddling in this class assumes that every register index is a 
  41     // reasonably small positive or negative number, and therefore has its high 
  42     // four bits all set or all unset. 
  44     struct SymbolTableEntry 
{ 
  50         SymbolTableEntry(int index
) 
  52             ASSERT(isValidIndex(index
)); 
  53             pack(index
, false, false); 
  56         SymbolTableEntry(int index
, unsigned attributes
) 
  58             ASSERT(isValidIndex(index
)); 
  59             pack(index
, attributes 
& ReadOnly
, attributes 
& DontEnum
); 
  69             return m_bits 
>> FlagBits
; 
  72         unsigned getAttributes() const 
  74             unsigned attributes 
= 0; 
  75             if (m_bits 
& ReadOnlyFlag
) 
  76                 attributes 
|= ReadOnly
; 
  77             if (m_bits 
& DontEnumFlag
) 
  78                 attributes 
|= DontEnum
; 
  82         void setAttributes(unsigned attributes
) 
  84             pack(getIndex(), attributes 
& ReadOnly
, attributes 
& DontEnum
); 
  87         bool isReadOnly() const 
  89             return m_bits 
& ReadOnlyFlag
; 
  93         static const unsigned ReadOnlyFlag 
= 0x1; 
  94         static const unsigned DontEnumFlag 
= 0x2; 
  95         static const unsigned NotNullFlag 
= 0x4; 
  96         static const unsigned FlagBits 
= 3; 
  98         void pack(int index
, bool readOnly
, bool dontEnum
) 
 100             m_bits 
= (index 
<< FlagBits
) | NotNullFlag
; 
 102                 m_bits 
|= ReadOnlyFlag
; 
 104                 m_bits 
|= DontEnumFlag
; 
 107         bool isValidIndex(int index
) 
 109             return ((index 
<< FlagBits
) >> FlagBits
) == index
; 
 115     struct SymbolTableIndexHashTraits 
{ 
 116         typedef SymbolTableEntry TraitType
; 
 117         static SymbolTableEntry 
emptyValue() { return SymbolTableEntry(); } 
 118         static const bool emptyValueIsZero 
= true; 
 119         static const bool needsDestruction 
= false; 
 122     typedef HashMap
<RefPtr
<UString::Rep
>, SymbolTableEntry
, IdentifierRepHash
, HashTraits
<RefPtr
<UString::Rep
> >, SymbolTableIndexHashTraits
> SymbolTable
; 
 124     class SharedSymbolTable 
: public SymbolTable
, public RefCounted
<SharedSymbolTable
> 
 130 #endif // SymbolTable_h