Home | History | Annotate | Download | only in profiler
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      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.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 
     27 #ifndef CallIdentifier_h
     28 #define CallIdentifier_h
     29 
     30 #include <runtime/UString.h>
     31 #include <wtf/text/CString.h>
     32 #include <wtf/text/StringHash.h>
     33 
     34 namespace JSC {
     35 
     36     struct CallIdentifier {
     37         WTF_MAKE_FAST_ALLOCATED;
     38     public:
     39         UString m_name;
     40         UString m_url;
     41         unsigned m_lineNumber;
     42 
     43         CallIdentifier()
     44             : m_lineNumber(0)
     45         {
     46         }
     47 
     48         CallIdentifier(const UString& name, const UString& url, int lineNumber)
     49             : m_name(name)
     50             , m_url(!url.isNull() ? url : "")
     51             , m_lineNumber(lineNumber)
     52         {
     53         }
     54 
     55         inline bool operator==(const CallIdentifier& ci) const { return ci.m_lineNumber == m_lineNumber && ci.m_name == m_name && ci.m_url == m_url; }
     56         inline bool operator!=(const CallIdentifier& ci) const { return !(*this == ci); }
     57 
     58         struct Hash {
     59             static unsigned hash(const CallIdentifier& key)
     60             {
     61                 unsigned hashCodes[3] = {
     62                     key.m_name.impl()->hash(),
     63                     key.m_url.impl()->hash(),
     64                     key.m_lineNumber
     65                 };
     66                 return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
     67             }
     68 
     69             static bool equal(const CallIdentifier& a, const CallIdentifier& b) { return a == b; }
     70             static const bool safeToCompareToEmptyOrDeleted = true;
     71         };
     72 
     73         unsigned hash() const { return Hash::hash(*this); }
     74 
     75 #ifndef NDEBUG
     76         operator const char*() const { return c_str(); }
     77         const char* c_str() const { return m_name.utf8().data(); }
     78 #endif
     79     };
     80 
     81 } // namespace JSC
     82 
     83 namespace WTF {
     84 
     85     template<> struct DefaultHash<JSC::CallIdentifier> { typedef JSC::CallIdentifier::Hash Hash; };
     86 
     87     template<> struct HashTraits<JSC::CallIdentifier> : GenericHashTraits<JSC::CallIdentifier> {
     88         static void constructDeletedValue(JSC::CallIdentifier& slot)
     89         {
     90             new (&slot) JSC::CallIdentifier(JSC::UString(), JSC::UString(), std::numeric_limits<unsigned>::max());
     91         }
     92         static bool isDeletedValue(const JSC::CallIdentifier& value)
     93         {
     94             return value.m_name.isNull() && value.m_url.isNull() && value.m_lineNumber == std::numeric_limits<unsigned>::max();
     95         }
     96     };
     97 
     98 } // namespace WTF
     99 
    100 #endif  // CallIdentifier_h
    101 
    102