aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/debugger/vcpudebug.cpp
blob: 94087956d74ad20252db3168e36258d3af8fa05d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#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);
}