Support inline caching of RegExpMatchesArray.length
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 May 2014 22:13:50 +0000 (22:13 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 May 2014 22:13:50 +0000 (22:13 +0000)
<https://webkit.org/b/133234>

Give RegExpMatchesArray.length the same treatment as JSArray in
repatch so we don't have to go out of line on every access.

~13% speed-up on Octane/regexp.

Reviewed by Geoffrey Garen.

* jit/Repatch.cpp:
(JSC::tryCacheGetByID):
* runtime/RegExpMatchesArray.h:
(JSC::isRegExpMatchesArray):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jit/Repatch.cpp
Source/JavaScriptCore/runtime/RegExpMatchesArray.h

index 4671b50..27cea0c 100644 (file)
@@ -1,3 +1,20 @@
+2014-05-23  Andreas Kling  <akling@apple.com>
+
+        Support inline caching of RegExpMatchesArray.length
+        <https://webkit.org/b/133234>
+
+        Give RegExpMatchesArray.length the same treatment as JSArray in
+        repatch so we don't have to go out of line on every access.
+
+        ~13% speed-up on Octane/regexp.
+
+        Reviewed by Geoffrey Garen.
+
+        * jit/Repatch.cpp:
+        (JSC::tryCacheGetByID):
+        * runtime/RegExpMatchesArray.h:
+        (JSC::isRegExpMatchesArray):
+
 2014-05-22  Mark Lam  <mark.lam@apple.com>
 
         REGRESSION(r154797): Debugger crashes when stepping over an uncaught exception.
index 5f0cbf2..168e1e7 100644 (file)
@@ -41,6 +41,7 @@
 #include "JSCInlines.h"
 #include "PolymorphicGetByIdList.h"
 #include "PolymorphicPutByIdList.h"
+#include "RegExpMatchesArray.h"
 #include "RepatchBuffer.h"
 #include "ScratchRegisterAllocator.h"
 #include "StackAlignment.h"
@@ -603,8 +604,8 @@ static bool tryCacheGetByID(ExecState* exec, JSValue baseValue, const Identifier
 
     CodeBlock* codeBlock = exec->codeBlock();
     VM* vm = &exec->vm();
-    
-    if ((isJSArray(baseValue) || isJSString(baseValue)) && propertyName == exec->propertyNames().length) {
+
+    if ((isJSArray(baseValue) || isRegExpMatchesArray(baseValue) || isJSString(baseValue)) && propertyName == exec->propertyNames().length) {
         GPRReg baseGPR = static_cast<GPRReg>(stubInfo.patch.baseGPR);
 #if USE(JSVALUE32_64)
         GPRReg resultTagGPR = static_cast<GPRReg>(stubInfo.patch.valueTagGPR);
@@ -613,7 +614,7 @@ static bool tryCacheGetByID(ExecState* exec, JSValue baseValue, const Identifier
 
         MacroAssembler stubJit;
 
-        if (isJSArray(baseValue)) {
+        if (isJSArray(baseValue) || isRegExpMatchesArray(baseValue)) {
             GPRReg scratchGPR = TempRegisterSet(stubInfo.patch.usedRegisters).getFreeGPR();
             bool needToRestoreScratch = false;
 
index 67fdcb6..8997d8e 100644 (file)
@@ -135,6 +135,11 @@ namespace JSC {
         ReifiedState m_state;
 };
 
+inline bool isRegExpMatchesArray(JSValue value)
+{
+    return value.isCell() && value.asCell()->classInfo() == RegExpMatchesArray::info();
+}
+
 }
 
 #endif // RegExpMatchesArray_h