Title: [224862] trunk/Source/_javascript_Core
Revision
224862
Author
mark....@apple.com
Date
2017-11-14 16:40:09 -0800 (Tue, 14 Nov 2017)

Log Message

Fix a bit-rotted Interpreter::dumpRegisters() and make it more robust.
https://bugs.webkit.org/show_bug.cgi?id=179699
<rdar://problem/35462346>

Reviewed by Michael Saboff.

* interpreter/Interpreter.cpp:
(JSC::Interpreter::dumpRegisters):
- Need to skip the callee saved registers

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (224861 => 224862)


--- trunk/Source/_javascript_Core/ChangeLog	2017-11-15 00:30:37 UTC (rev 224861)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-11-15 00:40:09 UTC (rev 224862)
@@ -1,3 +1,15 @@
+2017-11-14  Mark Lam  <mark....@apple.com>
+
+        Fix a bit-rotted Interpreter::dumpRegisters() and make it more robust.
+        https://bugs.webkit.org/show_bug.cgi?id=179699
+        <rdar://problem/35462346>
+
+        Reviewed by Michael Saboff.
+
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::dumpRegisters):
+        - Need to skip the callee saved registers
+
 2017-11-14  Guillaume Emont  <guijem...@igalia.com>
 
         REGRESSION(r224623) [MIPS] branchTruncateDoubleToInt32() doesn't set return register when branching

Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (224861 => 224862)


--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2017-11-15 00:30:37 UTC (rev 224861)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2017-11-15 00:40:09 UTC (rev 224862)
@@ -74,6 +74,7 @@
 #include "Symbol.h"
 #include "VMEntryScope.h"
 #include "VMInlines.h"
+#include "VMInspector.h"
 #include "VirtualRegister.h"
 
 #include <limits.h>
@@ -395,7 +396,6 @@
         unsigned unusedColumn = 0;
         visitor->computeLineAndColumn(line, unusedColumn);
         dataLogF("[ReturnVPC]                | %10p | %d (line %d)\n", m_it, visitor->bytecodeOffset(), line);
-        --m_it;
         return StackVisitor::Done;
     }
 
@@ -406,12 +406,18 @@
 
 void Interpreter::dumpRegisters(CallFrame* callFrame)
 {
+    CodeBlock* codeBlock = callFrame->codeBlock();
+    if (!codeBlock) {
+        dataLog("Dumping host frame registers not supported.\n");
+        return;
+    }
+    VM& vm = *codeBlock->vm();
+
     dataLogF("Register frame: \n\n");
     dataLogF("-----------------------------------------------------------------------------\n");
     dataLogF("            use            |   address  |                value               \n");
     dataLogF("-----------------------------------------------------------------------------\n");
 
-    CodeBlock* codeBlock = callFrame->codeBlock();
     const Register* it;
     const Register* end;
 
@@ -427,33 +433,36 @@
     
     dataLogF("-----------------------------------------------------------------------------\n");
     dataLogF("[ArgumentCount]            | %10p | %lu \n", it, (unsigned long) callFrame->argumentCount());
+    DumpReturnVirtualPCFunctor functor(it);
+    callFrame->iterate(functor);
     --it;
-    dataLogF("[CallerFrame]              | %10p | %p \n", it, callFrame->callerFrame());
-    --it;
     dataLogF("[Callee]                   | %10p | %p \n", it, callFrame->jsCallee());
     --it;
-    // FIXME: Remove the next decrement when the ScopeChain slot is removed from the call header
+    dataLogF("[CodeBlock]                | %10p | %p \n", it, callFrame->codeBlock());
     --it;
 #if ENABLE(JIT)
     AbstractPC pc = callFrame->abstractReturnPC(callFrame->vm());
     if (pc.hasJITReturnAddress())
-        dataLogF("[ReturnJITPC]              | %10p | %p \n", it, pc.jitReturnAddress().value());
+        dataLogF("[ReturnPC]                 | %10p | %p \n", it, pc.jitReturnAddress().value());
+    --it;
 #endif
-
-    DumpReturnVirtualPCFunctor functor(it);
-    callFrame->iterate(functor);
-
-    dataLogF("[CodeBlock]                | %10p | %p \n", it, callFrame->codeBlock());
+    dataLogF("[CallerFrame]              | %10p | %p \n", it, callFrame->callerFrame());
     --it;
     dataLogF("-----------------------------------------------------------------------------\n");
 
+    size_t numberOfCalleeSaveSlots = codeBlock->calleeSaveSpaceAsVirtualRegisters();
+    const Register* endOfCalleeSaves = it - numberOfCalleeSaveSlots;
+
     end = it - codeBlock->m_numVars;
     if (it != end) {
         do {
             JSValue v = it->jsValue();
             int registerNumber = it - callFrame->registers();
-            String name = codeBlock->nameForRegister(VirtualRegister(registerNumber));
-            dataLogF("[r% 3d %14s]      | %10p | %-16s 0x%lld \n", registerNumber, name.ascii().data(), it, toCString(v).data(), (long long)JSValue::encode(v));
+            String name = (it > endOfCalleeSaves)
+                ? "CalleeSaveReg"
+                : codeBlock->nameForRegister(VirtualRegister(registerNumber));
+            CString valueString = (it > endOfCalleeSaves) ? "" : toCString(v);
+            dataLogF("[r% 3d %14s]      | %10p | %-16s 0x%lld \n", registerNumber, name.ascii().data(), it, valueString.data(), (long long)JSValue::encode(v));
             --it;
         } while (it != end);
     }
@@ -464,7 +473,11 @@
         do {
             JSValue v = (*it).jsValue();
             int registerNumber = it - callFrame->registers();
-            dataLogF("[r% 3d]                     | %10p | %-16s 0x%lld \n", registerNumber, it, toCString(v).data(), (long long)JSValue::encode(v));
+            CString valueString =
+                (v.isCell() && !VMInspector::isValidCell(&vm.heap, reinterpret_cast<JSCell*>(JSValue::encode(v))))
+                ? "INVALID"
+                : toCString(v);
+            dataLogF("[r% 3d]                     | %10p | %-16s 0x%lld \n", registerNumber, it, valueString.data(), (long long)JSValue::encode(v));
             --it;
         } while (it != end);
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to