Optimize PutByVal when subscript is a rope string.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 May 2014 18:08:25 +0000 (18:08 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 May 2014 18:08:25 +0000 (18:08 +0000)
<https://webkit.org/b/132572>

Add a JSString::toIdentifier() that is smarter when the JSString is
really a rope string. Use this in baseline & DFG's PutByVal to avoid
allocating new StringImpls that we immediately deduplicate anyway.

Reviewed by Antti Koivisto.

* dfg/DFGOperations.cpp:
(JSC::DFG::operationPutByValInternal):
* jit/JITOperations.cpp:
* runtime/JSString.h:
(JSC::JSString::toIdentifier):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGOperations.cpp
Source/JavaScriptCore/jit/JITOperations.cpp
Source/JavaScriptCore/runtime/JSString.h

index 01288c0..e42e792 100644 (file)
@@ -1,5 +1,22 @@
 2014-05-05  Andreas Kling  <akling@apple.com>
 
+        Optimize PutByVal when subscript is a rope string.
+        <https://webkit.org/b/132572>
+
+        Add a JSString::toIdentifier() that is smarter when the JSString is
+        really a rope string. Use this in baseline & DFG's PutByVal to avoid
+        allocating new StringImpls that we immediately deduplicate anyway.
+
+        Reviewed by Antti Koivisto.
+
+        * dfg/DFGOperations.cpp:
+        (JSC::DFG::operationPutByValInternal):
+        * jit/JITOperations.cpp:
+        * runtime/JSString.h:
+        (JSC::JSString::toIdentifier):
+
+2014-05-05  Andreas Kling  <akling@apple.com>
+
         Remove two now-incorrect assertions after r168256.
 
         * runtime/JSString.cpp:
index 86996a3..8c9ab40 100644 (file)
@@ -120,7 +120,7 @@ ALWAYS_INLINE static void JIT_OPERATION operationPutByValInternal(ExecState* exe
     }
 
     // Don't put to an object if toString throws an exception.
-    Identifier ident(exec, property.toString(exec)->value(exec));
+    Identifier ident = property.toString(exec)->toIdentifier(exec);
     if (!vm->exception()) {
         PutPropertySlot slot(baseValue, strict);
         if (direct) {
index 8b205f6..ace32d2 100644 (file)
@@ -462,7 +462,7 @@ static void putByVal(CallFrame* callFrame, JSValue baseValue, JSValue subscript,
         PutPropertySlot slot(baseValue, callFrame->codeBlock()->isStrictMode());
         baseValue.put(callFrame, jsCast<NameInstance*>(subscript.asCell())->privateName(), value, slot);
     } else {
-        Identifier property(callFrame, subscript.toString(callFrame)->value(callFrame));
+        Identifier property = subscript.toString(callFrame)->toIdentifier(callFrame);
         if (!callFrame->vm().exception()) { // Don't put to an object if toString threw an exception.
             PutPropertySlot slot(baseValue, callFrame->codeBlock()->isStrictMode());
             baseValue.put(callFrame, property, value, slot);
index fc5170f..e76c80a 100644 (file)
@@ -139,6 +139,7 @@ namespace JSC {
             return newString;
         }
 
+        Identifier toIdentifier(ExecState*) const;
         const AtomicString& toAtomicString(ExecState*) const;
         AtomicStringImpl* toExistingAtomicString(ExecState*) const;
         const String& value(ExecState*) const;
@@ -387,6 +388,11 @@ namespace JSC {
         return JSString::create(*vm, s.impl());
     }
 
+    ALWAYS_INLINE Identifier JSString::toIdentifier(ExecState* exec) const
+    {
+        return Identifier(exec, toAtomicString(exec));
+    }
+
     ALWAYS_INLINE const AtomicString& JSString::toAtomicString(ExecState* exec) const
     {
         if (isRope())