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 CallIdentifierCallIdentifier43 CallIdentifier() 44 : m_lineNumber(0) 45 { 46 } 47 CallIdentifierCallIdentifier48 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 { hashCallIdentifier::Hash59 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 equalCallIdentifier::Hash69 static bool equal(const CallIdentifier& a, const CallIdentifier& b) { return a == b; } 70 static const bool safeToCompareToEmptyOrDeleted = true; 71 }; 72 hashCallIdentifier73 unsigned hash() const { return Hash::hash(*this); } 74 75 #ifndef NDEBUG 76 operator const char*() const { return c_str(); } c_strCallIdentifier77 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