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);
}