Get rid of IsInlinedCodeTag and its associated methods since it's unused
https://bugs.webkit.org/show_bug.cgi?id=121737

Source/JavaScriptCore: 

Reviewed by Sam Weinig.
        
This was meant to be easy, but I kept wondering if it was safe to remove the
inline call frame check in Arguments::tearOff(). The check was clearly dead
since the bit wasn't being set anywhere.
        
It turns out that the unwindCallFrame() function was relying on tearOff()
doing the right thing for inlined code, but it wasn't even passing it an
inline call frame. I fixed this by having unwindCallFrame() inlining check,
while also making sure that the code uses the right operand index for the
arguments register.

* interpreter/CallFrame.h:
* interpreter/CallFrameInlines.h:
* interpreter/Interpreter.cpp:
(JSC::unwindCallFrame):
* interpreter/StackVisitor.cpp:
(JSC::StackVisitor::Frame::r):
* interpreter/StackVisitor.h:
* runtime/Arguments.cpp:
(JSC::Arguments::tearOff):

LayoutTests: 

Reviewed by Sam Weinig.

* js/dfg-inline-arguments-capture-throw-exception-expected.txt: Added.
* js/dfg-inline-arguments-capture-throw-exception.html: Added.
* js/script-tests/dfg-inline-arguments-capture-throw-exception.js: Added.
(foo):
(bar):
(makeF):
(recurse):



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@156229 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 7bae569..a3b314b 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,30 @@
+2013-09-21  Filip Pizlo  <fpizlo@apple.com>
+
+        Get rid of IsInlinedCodeTag and its associated methods since it's unused
+        https://bugs.webkit.org/show_bug.cgi?id=121737
+
+        Reviewed by Sam Weinig.
+        
+        This was meant to be easy, but I kept wondering if it was safe to remove the
+        inline call frame check in Arguments::tearOff(). The check was clearly dead
+        since the bit wasn't being set anywhere.
+        
+        It turns out that the unwindCallFrame() function was relying on tearOff()
+        doing the right thing for inlined code, but it wasn't even passing it an
+        inline call frame. I fixed this by having unwindCallFrame() inlining check,
+        while also making sure that the code uses the right operand index for the
+        arguments register.
+
+        * interpreter/CallFrame.h:
+        * interpreter/CallFrameInlines.h:
+        * interpreter/Interpreter.cpp:
+        (JSC::unwindCallFrame):
+        * interpreter/StackVisitor.cpp:
+        (JSC::StackVisitor::Frame::r):
+        * interpreter/StackVisitor.h:
+        * runtime/Arguments.cpp:
+        (JSC::Arguments::tearOff):
+
 2013-09-20  Mark Hahnenberg  <mhahnenberg@apple.com>
 
         (un)shiftCountWithAnyIndexingType will start over in the middle of copying if it sees a hole
diff --git a/Source/JavaScriptCore/interpreter/CallFrame.h b/Source/JavaScriptCore/interpreter/CallFrame.h
index c40a0dd..1106106 100644
--- a/Source/JavaScriptCore/interpreter/CallFrame.h
+++ b/Source/JavaScriptCore/interpreter/CallFrame.h
@@ -134,30 +134,23 @@
             static inline bool isCodeOriginIndex(uint32_t bits);
             static inline uint32_t encodeAsCodeOriginIndex(uint32_t bits);
 
-            static inline bool isInlinedCode(uint32_t bits);
-            static inline uint32_t encodeAsInlinedCode(uint32_t bits);
-
         private:
             enum TypeTag {
                 BytecodeLocationTag = 0,
                 CodeOriginIndexTag = 1,
-                IsInlinedCodeTag = 2,
             };
 
             static inline uint32_t encode(TypeTag, uint32_t bits);
 
-            static const uint32_t s_mask = 0x3;
+            static const uint32_t s_mask = 0x1;
 #if USE(JSVALUE64)
-            static const uint32_t s_shift = 30;
+            static const uint32_t s_shift = 31;
             static const uint32_t s_shiftedMask = s_mask << s_shift;
 #else
-            static const uint32_t s_shift = 2;
+            static const uint32_t s_shift = 1;
 #endif
         };
 
-        bool isInlinedFrame() const;
-        void setIsInlinedFrame();
-
         bool hasLocationAsBytecodeOffset() const;
         bool hasLocationAsCodeOriginIndex() const;
 
diff --git a/Source/JavaScriptCore/interpreter/CallFrameInlines.h b/Source/JavaScriptCore/interpreter/CallFrameInlines.h
index 4807198..51d751a5 100644
--- a/Source/JavaScriptCore/interpreter/CallFrameInlines.h
+++ b/Source/JavaScriptCore/interpreter/CallFrameInlines.h
@@ -80,13 +80,6 @@
     return encodedBits;
 }
 
-inline uint32_t CallFrame::Location::encodeAsInlinedCode(uint32_t bits)
-{
-    uint32_t encodedBits = encode(IsInlinedCodeTag, bits);
-    ASSERT(isInlinedCode(encodedBits));
-    return encodedBits;
-}
-
 inline bool CallFrame::Location::isBytecodeLocation(uint32_t bits)
 {
     return !isCodeOriginIndex(bits);
@@ -102,29 +95,6 @@
 #endif
 }
 
-inline bool CallFrame::Location::isInlinedCode(uint32_t bits)
-{
-#if USE(JSVALUE64)
-    TypeTag tag = static_cast<TypeTag>(bits >> s_shift);
-    return !!(tag & IsInlinedCodeTag);
-#else
-    return !!(bits & IsInlinedCodeTag);
-#endif
-}
-
-inline bool CallFrame::isInlinedFrame() const
-{
-    return Location::isInlinedCode(locationAsRawBits());
-}
-
-inline void CallFrame::setIsInlinedFrame()
-{
-    ASSERT(codeBlock());
-    uint32_t bits = Location::encodeAsInlinedCode(locationAsRawBits());
-    setLocationAsRawBits(bits);
-    ASSERT(isInlinedFrame());
-}
-
 inline bool CallFrame::hasLocationAsBytecodeOffset() const
 {
     return Location::isBytecodeLocation(locationAsRawBits());
diff --git a/Source/JavaScriptCore/interpreter/Interpreter.cpp b/Source/JavaScriptCore/interpreter/Interpreter.cpp
index d9fc7f3..1b19632 100644
--- a/Source/JavaScriptCore/interpreter/Interpreter.cpp
+++ b/Source/JavaScriptCore/interpreter/Interpreter.cpp
@@ -407,15 +407,18 @@
 
     JSValue activation;
     if (oldCodeBlock->codeType() == FunctionCode && oldCodeBlock->needsActivation()) {
+        RELEASE_ASSERT(!visitor->isInlinedFrame());
         activation = callFrame->uncheckedR(oldCodeBlock->activationRegister()).jsValue();
         if (activation)
             jsCast<JSActivation*>(activation)->tearOff(*scope->vm());
     }
 
     if (oldCodeBlock->codeType() == FunctionCode && oldCodeBlock->usesArguments()) {
-        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
+        if (JSValue arguments = visitor->r(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
             if (activation)
                 jsCast<Arguments*>(arguments)->didTearOffActivation(callFrame, jsCast<JSActivation*>(activation));
+            else if (visitor->isInlinedFrame())
+                jsCast<Arguments*>(arguments)->tearOff(callFrame, visitor->inlineCallFrame());
             else
                 jsCast<Arguments*>(arguments)->tearOff(callFrame);
         }
diff --git a/Source/JavaScriptCore/interpreter/StackVisitor.cpp b/Source/JavaScriptCore/interpreter/StackVisitor.cpp
index 53a7071..37947be 100644
--- a/Source/JavaScriptCore/interpreter/StackVisitor.cpp
+++ b/Source/JavaScriptCore/interpreter/StackVisitor.cpp
@@ -287,6 +287,16 @@
     column = divotColumn + (divotLine ? 1 : codeBlock->firstLineColumnOffset());
 }
 
+Register& StackVisitor::Frame::r(int index)
+{
+    int offset;
+    if (isInlinedFrame())
+        offset = inlineCallFrame()->stackOffset;
+    else
+        offset = 0;
+    return callFrame()->r(offset + index);
+}
+
 void StackVisitor::Frame::retrieveExpressionInfo(int& divot, int& startOffset, int& endOffset, unsigned& line, unsigned& column)
 {
     CodeBlock* codeBlock = this->codeBlock();
diff --git a/Source/JavaScriptCore/interpreter/StackVisitor.h b/Source/JavaScriptCore/interpreter/StackVisitor.h
index d68a0d8..9299013 100644
--- a/Source/JavaScriptCore/interpreter/StackVisitor.h
+++ b/Source/JavaScriptCore/interpreter/StackVisitor.h
@@ -39,6 +39,7 @@
 class JSFunction;
 class JSObject;
 class JSScope;
+class Register;
 
 typedef ExecState CallFrame;
 
@@ -78,6 +79,8 @@
 
         Arguments* arguments();
         CallFrame* callFrame() const { return m_callFrame; }
+        
+        Register& r(int index);
     
 #ifndef NDEBUG
         JS_EXPORT_PRIVATE void print(int indentLevel);
diff --git a/Source/JavaScriptCore/runtime/Arguments.cpp b/Source/JavaScriptCore/runtime/Arguments.cpp
index 7071376..9b208bc 100644
--- a/Source/JavaScriptCore/runtime/Arguments.cpp
+++ b/Source/JavaScriptCore/runtime/Arguments.cpp
@@ -326,14 +326,8 @@
         }
     }
 
-    if (!callFrame->isInlinedFrame()) {
-        for (size_t i = 0; i < m_numArguments; ++i)
-            trySetArgument(callFrame->vm(), i, callFrame->argumentAfterCapture(i));
-        return;
-    }
-
-    tearOffForInlineCallFrame(
-        callFrame->vm(), callFrame->registers(), callFrame->inlineCallFrame());
+    for (size_t i = 0; i < m_numArguments; ++i)
+        trySetArgument(callFrame->vm(), i, callFrame->argumentAfterCapture(i));
 }
 
 void Arguments::didTearOffActivation(ExecState* exec, JSActivation* activation)