winamp/Src/Wasabi/api/script/debugger/debugsymbols.cpp

76 lines
2.0 KiB
C++

#include <precomp.h>
#include "debugsymbols.h"
#include <api/script/debugger/disasm.h>
#include <api/script/scriptmgr.h>
#include <api/script/debugger/sourcecodeline.h>
#include <api/script/vcpu.h>
DebugSymbols::DebugSymbols(int _vcpuid) : disasm(_vcpuid)
{
gotsymbols = 0;
SystemObject *so = SOM::getSystemObjectByScriptId(_vcpuid);
if (so != NULL)
binaryfilename = so->getFilename();
VCPUcodeBlock *cb = VCPU::getCodeBlockEntry(_vcpuid);
if (cb->debugsize != 0) {
gotsymbols = 1;
char *p = cb->debugsymbols;
int n = *(int *)p; p += 4;
while (n--) {
int s = *(int *)p; p += 4;
wchar_t *m = WMALLOC(s+1);
MEMCPY(m, p, s*sizeof(wchar_t));
m[s] = 0;
StringW *temp = new StringW;
temp->own(m);
//files.addItem(new String(m));
files.addItem(temp);
//FREE(m);
p+=s;
}
n = *(int *)p; p += 4;
while (n--) {
SourceCodeLineI *l = new SourceCodeLineI();
l->setPointer(*(int *)p); p += 4;
l->setSourceFile(files[*(int *)p]->getValue()); p += 4;
l->setSourceFileLine(*(int *)p); p += 4;
SourceCodeLineI *last = lines.getLast();
if (last != NULL) last->setLength(l->getPointer()-last->getPointer());
lines.addItem(l);
}
SourceCodeLineI *last = lines.getLast();
if (last != NULL) last->setLength(cb->size - last->getPointer());
}
}
DebugSymbols::~DebugSymbols()
{
files.deleteAll();
lines.deleteAll();
}
int DebugSymbols::getNumLines() {
if (!gotsymbols) return disasm.getNumLines();
return lines.getNumItems();
}
int DebugSymbols::findLine(int pointer) {
if (!gotsymbols) return disasm.findLine(pointer);
int i;
for (i=0;i<lines.getNumItems();i++) {
SourceCodeLine *l = lines.enumItem(i);
int ip = l->getPointer();
int il = l->getLength();
if (pointer >= ip && pointer < ip+il) {
return i;
}
}
return -1;
}
SourceCodeLine *DebugSymbols::enumLine(int n) {
if (!gotsymbols) return disasm.enumLine(n);
return lines.enumItem(n);
}