From d542049596456a0378a6a05a6b0f4289ea380215 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Oct 2020 17:27:38 +0200 Subject: [PATCH] LibJS: Avoid StringImpl refcount churn when hashing StringOrSymbol Add a StringOrSymbol::hash() helper function so we can compute the hash without having to construct a temporary String. --- Libraries/LibJS/Runtime/StringOrSymbol.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Libraries/LibJS/Runtime/StringOrSymbol.h b/Libraries/LibJS/Runtime/StringOrSymbol.h index 01ca65b6ce..b8d031affb 100644 --- a/Libraries/LibJS/Runtime/StringOrSymbol.h +++ b/Libraries/LibJS/Runtime/StringOrSymbol.h @@ -135,6 +135,13 @@ public: return *this; } + unsigned hash() const + { + if (is_string()) + return static_cast(m_ptr)->hash(); + return ptr_hash(as_symbol()); + } + private: ALWAYS_INLINE u64 bits() const { @@ -155,10 +162,6 @@ template<> struct AK::Traits : public GenericTraits { static unsigned hash(const JS::StringOrSymbol& key) { - if (key.is_string()) - return key.as_string().hash(); - if (key.is_symbol()) - return ptr_hash(key.as_symbol()); - return 0; + return key.hash(); } };