From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Wasabi/api/script/debugger/debugsymbols.cpp | 75 +++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Src/Wasabi/api/script/debugger/debugsymbols.cpp (limited to 'Src/Wasabi/api/script/debugger/debugsymbols.cpp') diff --git a/Src/Wasabi/api/script/debugger/debugsymbols.cpp b/Src/Wasabi/api/script/debugger/debugsymbols.cpp new file mode 100644 index 00000000..e3b85980 --- /dev/null +++ b/Src/Wasabi/api/script/debugger/debugsymbols.cpp @@ -0,0 +1,75 @@ +#include +#include "debugsymbols.h" +#include +#include +#include +#include + +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;igetPointer(); + 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); +} -- cgit