100 lines
2.2 KiB
C++
100 lines
2.2 KiB
C++
|
#include <precomp.h>
|
||
|
#include <wasabicfg.h>
|
||
|
#include "vcpudebug.h"
|
||
|
#include <api/script/debugger/jitd.h>
|
||
|
|
||
|
VCPUDebugger::VCPUDebugger() {
|
||
|
filter.setFilterObject(&reentryfilter);
|
||
|
}
|
||
|
|
||
|
VCPUDebugger::~VCPUDebugger() {
|
||
|
}
|
||
|
|
||
|
// ------------------------------------------------------------------------
|
||
|
|
||
|
// instruction pointer
|
||
|
int VCPUDebugger::getVIP() {
|
||
|
return WASABI_API_MAKIDEBUG->debugger_getVIP();
|
||
|
}
|
||
|
|
||
|
// script descriptor (vcpuid)
|
||
|
int VCPUDebugger::getVSD() {
|
||
|
return WASABI_API_MAKIDEBUG->debugger_getVSD();
|
||
|
}
|
||
|
|
||
|
// variables stack pointer
|
||
|
int VCPUDebugger::getVSP() {
|
||
|
return WASABI_API_MAKIDEBUG->debugger_getVSP();
|
||
|
}
|
||
|
|
||
|
// call stack pointer
|
||
|
int VCPUDebugger::getVCC() {
|
||
|
return WASABI_API_MAKIDEBUG->debugger_getVCC();
|
||
|
}
|
||
|
|
||
|
// ------------------------------------------------------------------------
|
||
|
void VCPUDebugger::trace() {
|
||
|
int i;
|
||
|
for (i=0;i<jitds.getNumItems();i++) {
|
||
|
MakiJITD *jitd = jitds.enumItem(i);
|
||
|
if (jitd->getVCPUId() == getVSD()) {
|
||
|
jitd->trace();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MakiJITD *VCPUDebugger::getJITD(int vcpuid) {
|
||
|
int i;
|
||
|
for (i=0;i<jitds.getNumItems();i++) {
|
||
|
MakiJITD *jitd = jitds.enumItem(i);
|
||
|
if (jitd->getVCPUId() == vcpuid)
|
||
|
return jitd;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
// if this returns 1, you should not call eventComplete!
|
||
|
int VCPUDebugger::filterEvent(int vcpuid, int eventid) {
|
||
|
MakiJITD *jitd = getJITD(vcpuid);
|
||
|
if (!jitd || !jitd->isOnHold()) {
|
||
|
WASABI_API_WND->pushModalWnd();
|
||
|
scopestack.push(0);
|
||
|
return 0;
|
||
|
}
|
||
|
filter.enterScope((vcpuid<<16) + eventid); // (vcpuid<<16) + eventid
|
||
|
if (filter.mustLeave()) {
|
||
|
filter.leaveScope();
|
||
|
return 1;
|
||
|
}
|
||
|
WASABI_API_WND->pushModalWnd();
|
||
|
scopestack.push(1);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void VCPUDebugger::eventComplete() {
|
||
|
int n;
|
||
|
scopestack.pop(&n);
|
||
|
WASABI_API_WND->popModalWnd();
|
||
|
if (n) {
|
||
|
filter.leaveScope();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int VCPUDebugger::isActive() {
|
||
|
foreach(jitds)
|
||
|
if (jitds.getfor()->isActive())
|
||
|
return 1;
|
||
|
endfor;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
MakiJITD *VCPUDebugger::createJITD(int vcpuid) {
|
||
|
MakiJITD *jitd = new MakiJITD(this, vcpuid);
|
||
|
jitds.addItem(jitd);
|
||
|
return jitd;
|
||
|
}
|
||
|
|
||
|
const char *VCPUDebugger::getCodeBlock(int vcpuid) {
|
||
|
return WASABI_API_MAKIDEBUG->debugger_getCodeBlock(vcpuid);
|
||
|
}
|