summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-10-04 17:33:58 +0200
committerAndreas Kling <kling@serenityos.org>2020-10-04 19:25:49 +0200
commit3d053f244f0cb16be187a8935e8120e221e1c716 (patch)
tree5681bd9a65bfd3866e5a2613585cf8514383a90b
parentd542049596456a0378a6a05a6b0f4289ea380215 (diff)
downloadserenity-3d053f244f0cb16be187a8935e8120e221e1c716.zip
LibJS: Avoid creating a temporary String in StringOrSymbol::operator==
-rw-r--r--Libraries/LibJS/Runtime/StringOrSymbol.h12
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;