Add an ability to find the extent of a callframe
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Apr 2012 00:12:04 +0000 (00:12 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Apr 2012 00:12:04 +0000 (00:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=84513

Reviewed by Filip Pizlo.

Add a function to get the extent of a callframe and
use that function for a new assertion to make sure the
RegisterFile makes sense using that information.

* interpreter/CallFrame.cpp:
(JSC::CallFrame::frameExtentInternal):
(JSC):
* interpreter/CallFrame.h:
(JSC::ExecState::frameExtent):
(ExecState):
* interpreter/Interpreter.cpp:
(JSC::Interpreter::executeCall):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/CallFrame.cpp
Source/JavaScriptCore/interpreter/CallFrame.h
Source/JavaScriptCore/interpreter/Interpreter.cpp

index d216e37..308caec 100644 (file)
@@ -1,3 +1,23 @@
+2012-04-20  Oliver Hunt  <oliver@apple.com>
+
+        Add an ability to find the extent of a callframe
+        https://bugs.webkit.org/show_bug.cgi?id=84513
+
+        Reviewed by Filip Pizlo.
+
+        Add a function to get the extent of a callframe and
+        use that function for a new assertion to make sure the
+        RegisterFile makes sense using that information.
+
+        * interpreter/CallFrame.cpp:
+        (JSC::CallFrame::frameExtentInternal):
+        (JSC):
+        * interpreter/CallFrame.h:
+        (JSC::ExecState::frameExtent):
+        (ExecState):
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::executeCall):
+
 2012-04-20  Benjamin Poulain  <bpoulain@apple.com>
 
         Inline the JSArray constructor
index 18eaab2..a5ffaee 100644 (file)
@@ -183,4 +183,11 @@ CallFrame* CallFrame::trueCallerFrame()
 }
 #endif
 
+Register* CallFrame::frameExtentInternal()
+{
+    CodeBlock* codeBlock = this->codeBlock();
+    ASSERT(codeBlock);
+    return registers() + codeBlock->m_numCalleeRegisters;
+}
+
 }
index 5bf2b94..4ec3de7 100644 (file)
@@ -125,6 +125,15 @@ namespace JSC  {
         }
 #endif
 
+        Register* frameExtent()
+        {
+            if (!codeBlock())
+                return registers();
+            return frameExtentInternal();
+        }
+    
+        Register* frameExtentInternal();
+    
 #if ENABLE(DFG_JIT)
         InlineCallFrame* inlineCallFrame() const { return this[RegisterFile::ReturnPC].asInlineCallFrame(); }
         unsigned codeOriginIndexForDFG() const { return this[RegisterFile::ArgumentCount].tag(); }
index 046056c..fa63cfb 100644 (file)
@@ -1252,6 +1252,8 @@ JSValue Interpreter::executeCall(CallFrame* callFrame, JSObject* function, CallT
         return checkedReturn(throwStackOverflowError(callFrame));
 
     Register* oldEnd = m_registerFile.end();
+    ASSERT(callFrame->frameExtent() <= oldEnd || callFrame == callFrame->scopeChain()->globalObject->globalExec());
+    ASSERT(callFrame == callFrame->globalData().topCallFrame || callFrame == callFrame->scopeChain()->globalObject->globalExec());
     int argCount = 1 + args.size(); // implicit "this" parameter
     size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;