74
74
#include " Symbol.h"
75
75
#include " VMEntryScope.h"
76
76
#include " VMInlines.h"
77
+ #include " VMInspector.h"
77
78
#include " VirtualRegister.h"
78
79
79
80
#include < limits.h>
@@ -395,7 +396,6 @@ class DumpReturnVirtualPCFunctor {
395
396
unsigned unusedColumn = 0 ;
396
397
visitor->computeLineAndColumn (line, unusedColumn);
397
398
dataLogF (" [ReturnVPC] | %10p | %d (line %d)\n " , m_it, visitor->bytecodeOffset (), line);
398
- --m_it;
399
399
return StackVisitor::Done;
400
400
}
401
401
@@ -406,12 +406,18 @@ class DumpReturnVirtualPCFunctor {
406
406
407
407
void Interpreter::dumpRegisters (CallFrame* callFrame)
408
408
{
409
+ CodeBlock* codeBlock = callFrame->codeBlock ();
410
+ if (!codeBlock) {
411
+ dataLog (" Dumping host frame registers not supported.\n " );
412
+ return ;
413
+ }
414
+ VM& vm = *codeBlock->vm ();
415
+
409
416
dataLogF (" Register frame: \n\n " );
410
417
dataLogF (" -----------------------------------------------------------------------------\n " );
411
418
dataLogF (" use | address | value \n " );
412
419
dataLogF (" -----------------------------------------------------------------------------\n " );
413
420
414
- CodeBlock* codeBlock = callFrame->codeBlock ();
415
421
const Register* it;
416
422
const Register* end;
417
423
@@ -427,33 +433,36 @@ void Interpreter::dumpRegisters(CallFrame* callFrame)
427
433
428
434
dataLogF (" -----------------------------------------------------------------------------\n " );
429
435
dataLogF (" [ArgumentCount] | %10p | %lu \n " , it, (unsigned long ) callFrame->argumentCount ());
430
- --it ;
431
- dataLogF ( " [CallerFrame] | %10p | %p \n " , it, callFrame->callerFrame () );
436
+ DumpReturnVirtualPCFunctor functor (it) ;
437
+ callFrame->iterate(functor );
432
438
--it;
433
439
dataLogF (" [Callee] | %10p | %p \n " , it, callFrame->jsCallee ());
434
440
--it;
435
- // FIXME: Remove the next decrement when the ScopeChain slot is removed from the call header
441
+ dataLogF ( " [CodeBlock] | %10p | %p \n " , it, callFrame-> codeBlock ());
436
442
--it;
437
443
#if ENABLE(JIT)
438
444
AbstractPC pc = callFrame->abstractReturnPC (callFrame->vm ());
439
445
if (pc.hasJITReturnAddress ())
440
- dataLogF (" [ReturnJITPC] | %10p | %p \n " , it, pc.jitReturnAddress ().value ());
446
+ dataLogF (" [ReturnPC] | %10p | %p \n " , it, pc.jitReturnAddress ().value ());
447
+ --it;
441
448
#endif
442
-
443
- DumpReturnVirtualPCFunctor functor (it);
444
- callFrame->iterate(functor);
445
-
446
- dataLogF (" [CodeBlock] | %10p | %p \n " , it, callFrame->codeBlock ());
449
+ dataLogF (" [CallerFrame] | %10p | %p \n " , it, callFrame->callerFrame ());
447
450
--it;
448
451
dataLogF (" -----------------------------------------------------------------------------\n " );
449
452
453
+ size_t numberOfCalleeSaveSlots = codeBlock->calleeSaveSpaceAsVirtualRegisters ();
454
+ const Register* endOfCalleeSaves = it - numberOfCalleeSaveSlots;
455
+
450
456
end = it - codeBlock->m_numVars ;
451
457
if (it != end) {
452
458
do {
453
459
JSValue v = it->jsValue ();
454
460
int registerNumber = it - callFrame->registers ();
455
- String name = codeBlock->nameForRegister (VirtualRegister (registerNumber));
456
- dataLogF (" [r% 3d %14s] | %10p | %-16s 0x%lld \n " , registerNumber, name.ascii ().data (), it, toCString (v).data (), (long long )JSValue::encode (v));
461
+ String name = (it > endOfCalleeSaves)
462
+ ? " CalleeSaveReg"
463
+ : codeBlock->nameForRegister (VirtualRegister (registerNumber));
464
+ CString valueString = (it > endOfCalleeSaves) ? " " : toCString (v);
465
+ dataLogF (" [r% 3d %14s] | %10p | %-16s 0x%lld \n " , registerNumber, name.ascii ().data (), it, valueString.data (), (long long )JSValue::encode (v));
457
466
--it;
458
467
} while (it != end);
459
468
}
@@ -464,7 +473,11 @@ void Interpreter::dumpRegisters(CallFrame* callFrame)
464
473
do {
465
474
JSValue v = (*it).jsValue ();
466
475
int registerNumber = it - callFrame->registers ();
467
- dataLogF (" [r% 3d] | %10p | %-16s 0x%lld \n " , registerNumber, it, toCString (v).data (), (long long )JSValue::encode (v));
476
+ CString valueString =
477
+ (v.isCell () && !VMInspector::isValidCell (&vm.heap , reinterpret_cast <JSCell*>(JSValue::encode (v))))
478
+ ? " INVALID"
479
+ : toCString (v);
480
+ dataLogF (" [r% 3d] | %10p | %-16s 0x%lld \n " , registerNumber, it, valueString.data (), (long long )JSValue::encode (v));
468
481
--it;
469
482
} while (it != end);
470
483
}
0 commit comments