Forráskód Böngészése

LibJS: Avoid creating a temporary String in StringOrSymbol::operator==

Andreas Kling 4 éve
szülő
commit
3d053f244f
1 módosított fájl, 10 hozzáadás és 2 törlés
  1. 10 2
      Libraries/LibJS/Runtime/StringOrSymbol.h

+ 10 - 2
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;