Optimize constructing JSC::Identifier from AtomicString.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Dec 2014 02:21:16 +0000 (02:21 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Dec 2014 02:21:16 +0000 (02:21 +0000)
<https://webkit.org/b/139157>

Reviewed by Michael Saboff.

Source/JavaScriptCore:

Add constructors for Identifier taking AtomicString and AtomicStringImpl.
This avoids branching on the string's isAtomic flag, which is obviously
always true for AtomicString & AtomicStringImpl.

Had to add a Identifier(const char*) constructor to resolve implicit
ambiguity between String / AtomicString.

Also made PrivateName::uid() return AtomicStringImpl* to take advantage
of the new constructor in a few places.

* runtime/Identifier.h:
(JSC::Identifier::Identifier):
* runtime/IdentifierInlines.h:
(JSC::Identifier::Identifier):
* runtime/PrivateName.h:
(JSC::PrivateName::uid):

Source/WTF:

Make AtomicString::isInAtomicStringTable() public so it can be used
in some Identifier assertions.

* wtf/text/AtomicString.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@176622 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/Identifier.h
Source/JavaScriptCore/runtime/IdentifierInlines.h
Source/JavaScriptCore/runtime/PrivateName.h
Source/WTF/ChangeLog
Source/WTF/wtf/text/AtomicString.h

index d1b9162..06e02bc 100644 (file)
@@ -1,3 +1,27 @@
+2014-12-01  Andreas Kling  <akling@apple.com>
+
+        Optimize constructing JSC::Identifier from AtomicString.
+        <https://webkit.org/b/139157>
+
+        Reviewed by Michael Saboff.
+
+        Add constructors for Identifier taking AtomicString and AtomicStringImpl.
+        This avoids branching on the string's isAtomic flag, which is obviously
+        always true for AtomicString & AtomicStringImpl.
+
+        Had to add a Identifier(const char*) constructor to resolve implicit
+        ambiguity between String / AtomicString.
+
+        Also made PrivateName::uid() return AtomicStringImpl* to take advantage
+        of the new constructor in a few places.
+
+        * runtime/Identifier.h:
+        (JSC::Identifier::Identifier):
+        * runtime/IdentifierInlines.h:
+        (JSC::Identifier::Identifier):
+        * runtime/PrivateName.h:
+        (JSC::PrivateName::uid):
+
 2014-12-01  Alexey Proskuryakov  <ap@apple.com>
 
         Several JavaScriptCore date tests are flaky, because they expect time to be frozen during execution
index 231ab10..d9fe20d 100644 (file)
@@ -44,8 +44,11 @@ public:
     template<unsigned charactersCount>
     Identifier(VM* vm, const char (&characters)[charactersCount]) : m_string(add(vm, characters)) { ASSERT(m_string.impl()->isAtomic()); }
 
+    Identifier(ExecState*, AtomicStringImpl*);
+    Identifier(ExecState*, const AtomicString&);
     Identifier(ExecState* exec, StringImpl* rep) : m_string(add(exec, rep)) { ASSERT(m_string.impl()->isAtomic()); }
     Identifier(ExecState* exec, const String& s) : m_string(add(exec, s.impl())) { ASSERT(m_string.impl()->isAtomic()); }
+    Identifier(ExecState* exec, const char* s) : Identifier(exec, AtomicString(s)) { }
 
     Identifier(VM* vm, const LChar* s, int length) : m_string(add(vm, s, length)) { ASSERT(m_string.impl()->isAtomic()); }
     Identifier(VM* vm, const UChar* s, int length) : m_string(add(vm, s, length)) { ASSERT(m_string.impl()->isAtomic()); }
index 3a7e20b..efc3d3c 100644 (file)
 
 namespace JSC  {
 
+inline Identifier::Identifier(ExecState* exec, AtomicStringImpl* string)
+    : m_string(string)
+{
+#ifndef NDEBUG
+    checkCurrentAtomicStringTable(exec);
+    if (string)
+        ASSERT_WITH_MESSAGE(!string->length() || AtomicString::isInAtomicStringTable(string), "The atomic string comes from an other thread!");
+#else
+    UNUSED_PARAM(exec);
+#endif
+}
+
+inline Identifier::Identifier(ExecState* exec, const AtomicString& string)
+    : m_string(string.string())
+{
+#ifndef NDEBUG
+    checkCurrentAtomicStringTable(exec);
+    if (!string.isNull())
+        ASSERT_WITH_MESSAGE(!string.length() || AtomicString::isInAtomicStringTable(string.impl()), "The atomic string comes from an other thread!");
+#else
+    UNUSED_PARAM(exec);
+#endif
+}
+
 inline PassRef<StringImpl> Identifier::add(ExecState* exec, StringImpl* r)
 {
 #ifndef NDEBUG
index 5d2774a..55ee634 100644 (file)
@@ -42,7 +42,7 @@ public:
         ASSERT(m_impl->isEmptyUnique());
     }
 
-    StringImpl* uid() const { return m_impl.get(); }
+    AtomicStringImpl* uid() const { return static_cast<AtomicStringImpl*>(m_impl.get()); }
 
 private:
     RefPtr<StringImpl> m_impl;
index 56d30ec..50ecfe4 100644 (file)
@@ -1,3 +1,15 @@
+2014-12-01  Andreas Kling  <akling@apple.com>
+
+        Optimize constructing JSC::Identifier from AtomicString.
+        <https://webkit.org/b/139157>
+
+        Reviewed by Michael Saboff.
+
+        Make AtomicString::isInAtomicStringTable() public so it can be used
+        in some Identifier assertions.
+
+        * wtf/text/AtomicString.h:
+
 2014-12-01  Oliver Hunt  <oliver@apple.com>
 
         Fix non-mac builds.
index 5f5d2c0..3862af2 100644 (file)
@@ -204,6 +204,10 @@ public:
         return addSlowCase(*stringTableProvider.atomicStringTable(), *string);
     }
 
+#if !ASSERT_DISABLED
+    WTF_EXPORT_STRING_API static bool isInAtomicStringTable(StringImpl*);
+#endif
+
 private:
     // The explicit constructors with AtomicString::ConstructFromLiteral must be used for literals.
     AtomicString(ASCIILiteral);
@@ -215,10 +219,6 @@ private:
 
     WTF_EXPORT_STRING_API static AtomicStringImpl* findSlowCase(StringImpl&);
     WTF_EXPORT_STRING_API static AtomicString fromUTF8Internal(const char*, const char*);
-
-#if !ASSERT_DISABLED
-    WTF_EXPORT_STRING_API static bool isInAtomicStringTable(StringImpl*);
-#endif
 };
 
 inline bool operator==(const AtomicString& a, const AtomicString& b) { return a.impl() == b.impl(); }