diff options
author | Andreas Kling <kling@serenityos.org> | 2020-10-04 17:33:58 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-10-04 19:25:49 +0200 |
commit | 3d053f244f0cb16be187a8935e8120e221e1c716 (patch) | |
tree | 5681bd9a65bfd3866e5a2613585cf8514383a90b | |
parent | d542049596456a0378a6a05a6b0f4289ea380215 (diff) | |
download | serenity-3d053f244f0cb16be187a8935e8120e221e1c716.zip |
LibJS: Avoid creating a temporary String in StringOrSymbol::operator==
-rw-r--r-- | Libraries/LibJS/Runtime/StringOrSymbol.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/Libraries/LibJS/Runtime/StringOrSymbol.h b/Libraries/LibJS/Runtime/StringOrSymbol.h index b8d031affb..6939194183 100644 --- a/Libraries/LibJS/Runtime/StringOrSymbol.h +++ b/Libraries/LibJS/Runtime/StringOrSymbol.h @@ -29,6 +29,7 @@ #include <LibJS/Runtime/PrimitiveString.h> #include <LibJS/Runtime/Symbol.h> #include <LibJS/Runtime/Value.h> +#include <string.h> namespace JS { @@ -118,8 +119,15 @@ public: ALWAYS_INLINE bool operator==(const StringOrSymbol& other) const { - if (is_string()) - return other.is_string() && as_string() == other.as_string(); + if (is_string()) { + if (!other.is_string()) + return false; + auto* this_impl = static_cast<const StringImpl*>(m_ptr); + auto* other_impl = static_cast<const StringImpl*>(other.m_ptr); + if (this_impl->length() != other_impl->length()) + return false; + return !memcmp(this_impl->characters(), other_impl->characters(), this_impl->length()); + } if (is_symbol()) return other.is_symbol() && as_symbol() == other.as_symbol(); return true; |