Title: [176035] trunk/Source/_javascript_Core
Revision
176035
Author
[email protected]
Date
2014-11-12 13:13:13 -0800 (Wed, 12 Nov 2014)

Log Message

Generate get_by_id for bracket access with constant string subscript.
<https://webkit.org/b/138663>

Reviewed by Michael Saboff.

Transform o["f"] into o.f when generating bytecode. This allows our JIT
to inline-cache those accesses instead of always dropping out to C++.

This is surprisingly common in real-web content, less so in benchmarks.
Interestingly, Speedometer does hit the optimization quite a bit.

* bytecompiler/NodesCodegen.cpp:
(JSC::BracketAccessorNode::emitBytecode):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (176034 => 176035)


--- trunk/Source/_javascript_Core/ChangeLog	2014-11-12 21:09:36 UTC (rev 176034)
+++ trunk/Source/_javascript_Core/ChangeLog	2014-11-12 21:13:13 UTC (rev 176035)
@@ -1,3 +1,19 @@
+2014-11-12  Andreas Kling  <[email protected]>
+
+        Generate get_by_id for bracket access with constant string subscript.
+        <https://webkit.org/b/138663>
+
+        Reviewed by Michael Saboff.
+
+        Transform o["f"] into o.f when generating bytecode. This allows our JIT
+        to inline-cache those accesses instead of always dropping out to C++.
+
+        This is surprisingly common in real-web content, less so in benchmarks.
+        Interestingly, Speedometer does hit the optimization quite a bit.
+
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::BracketAccessorNode::emitBytecode):
+
 2014-11-12  Mark Lam  <[email protected]>
 
         Rename USE(MASM_PROBE) to ENABLE(MASM_PROBE).

Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (176034 => 176035)


--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2014-11-12 21:09:36 UTC (rev 176034)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2014-11-12 21:13:13 UTC (rev 176035)
@@ -389,11 +389,20 @@
         return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister(), property);
     }
 
-    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
-    RegisterID* property = generator.emitNode(m_subscript);
+    RegisterID* ret;
+    RegisterID* finalDest = generator.finalDestination(dst);
+
+    if (m_subscript->isString()) {
+        RefPtr<RegisterID> base = generator.emitNode(m_base);
+        ret = generator.emitGetById(finalDest, base.get(), static_cast<StringNode*>(m_subscript)->value());
+    } else {
+        RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
+        RegisterID* property = generator.emitNode(m_subscript);
+        ret = generator.emitGetByVal(finalDest, base.get(), property);
+    }
+
     generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
-    RegisterID* finalDest = generator.finalDestination(dst);
-    RegisterID* ret = generator.emitGetByVal(finalDest, base.get(), property);
+
     if (generator.vm()->typeProfiler()) {
         generator.emitProfileType(finalDest, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to