123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- #include <precomp.h>
- #include "sdebuggerui.h"
- #include <api/script/debugger/jitd.h>
- #include <tataki/canvas/canvas.h>
- #include <api/wnd/wndclass/editwnd.h>
- #include <api/script/objcontroller.h>
- #include <bfc/string/stringdict.h>
- #include <bfc/parse/paramparser.h>
- #include <api/wnd/notifmsg.h>
- #include <api/script/objecttable.h>
- #include <api/script/debugger/sourcecodeline.h>
- #include "../nu/AutoWide.h"
- #define LEFTCOLUMN 100
- #define RIGHTCOLUMN 200
- #define INPUTHEIGHT 21
- #define NCONSOLELINES 4
- #define LINEHEIGHT 14
- #define REGWIDTH 100
- SimpleDebuggerUI::SimpleDebuggerUI()
- {
- leave = 0;
- jitd = NULL;
- edit = NULL;
- memset(cmdbuf, 0, sizeof(cmdbuf));
- retcode = JITD_RETURN_CONTINUE;
- }
- SimpleDebuggerUI::~SimpleDebuggerUI()
- {}
- void SimpleDebuggerUI::setJITD(MakiJITD *_jitd)
- {
- jitd = _jitd;
- }
- int SimpleDebuggerUI::messageLoop()
- {
- leave = 0;
- retcode = JITD_RETURN_STEPINTO;
- if (!isInited())
- {
- setVirtual(0);
- setStartHidden(1);
- setParent(WASABI_API_WND->main_getRootWnd());
- init(WASABI_API_WND->main_getRootWnd(), 1);
- edit = new EditWnd;
- edit->setParent(this);
- edit->setBackgroundColor(RGB(0, 0, 0));
- edit->setTextColor(RGB(0, 255, 0));
- edit->setWantFocus(0);
- *cmdbuf = 0;
- edit->setBuffer(cmdbuf, 256);
- edit->init(this);
- RECT r;
- POINT pt = {0, 0};
- Wasabi::Std::getViewport(&r, &pt);
- resize(r.right - 656, r.top + 16, 640, 480);
- bringToFront();
- }
- for (int s = 0;s < jitd->getVSP();s++)
- {
- scriptVar v = WASABI_API_MAKIDEBUG->debugger_readStack(s);
- StringW str;
- switch (v.type)
- {
- case SCRIPT_VOID:
- str = L"NULL";
- break;
- case SCRIPT_INT:
- str = StringPrintfW(L"%d", GET_SCRIPT_INT(v));
- break;
- case SCRIPT_BOOLEAN:
- str = StringPrintfW(L"%s", GET_SCRIPT_BOOLEAN(v) ? L"true" : L"false");
- break;
- case SCRIPT_FLOAT:
- str = StringPrintfW(L"%f", GET_SCRIPT_FLOAT(v));
- break;
- case SCRIPT_DOUBLE:
- str = StringPrintfW(L"%f", (float)GET_SCRIPT_DOUBLE(v));
- break;
- case SCRIPT_STRING:
- str = GET_SCRIPT_STRING(v);
- break;
- default:
- {
- if (v.type == SCRIPT_OBJECT)
- str = L"Object";
- else
- str = ObjectTable::getClassName(v.type);
- #ifdef WASABI_COMPILE_SKIN
- ScriptObject *o = GET_SCRIPT_OBJECT(v);
- if (o != NULL)
- {
- GuiObject *go = static_cast<GuiObject *>(o->vcpu_getInterface(guiObjectGuid));
- if (go != NULL)
- {
- str += L";";
- str.cat(go->guiobject_getId());
- }
- }
- #endif
- break;
- }
- }
- strstack.addItem(new StringW(str));
- }
- setVisible(1);
- //WASABI_API_WND->pushModalWnd(this);
- #ifdef WIN32
- MSG msg;
- //DWORD leavetime = GetTickCount()+5;
- while (!leave/* && !(GetTickCount() >leavetime)*/)
- {
- if (PeekMessage(&msg, /*(HWND)NULL*/ getOsWindowHandle(), 0, 0, PM_NOREMOVE))
- {
- GetMessage(&msg, /*(HWND) NULL*/getOsWindowHandle(), 0, 0) &&
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- #endif
- //WASABI_API_WND->popModalWnd(this);
- setVisible(0);
- strstack.deleteAll();
- return retcode;
- }
- int SimpleDebuggerUI::onPaint(Canvas *c)
- {
- SimpleDebuggerUI_PARENT::onPaint(c);
- Wasabi::FontInfo fontInfo;
- RECT r;
- getClientRect(&r);
- c->fillRect(&r, RGB(0, 0, 0));
- c->drawRect(&r, 1, RGB(0, 255, 0));
- fontInfo.color = RGB(0, 255, 0);
- fontInfo.pointSize = 14;
- fontInfo.face = L"Courier New";
- c->pushPen(PENSTYLE_SOLID, 1, RGB(0, 255, 0));
- c->textOut(r.right - REGWIDTH + 7, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2) + 8, StringPrintfW(L"VSD:%08X", jitd->getVSD()), &fontInfo);
- c->textOut(r.right - REGWIDTH + 7, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2) + 8 + (LINEHEIGHT + 1), StringPrintfW(L"VIP:%08X", jitd->getVIP()), &fontInfo);
- c->textOut(r.right - REGWIDTH + 7, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2) + 8 + (LINEHEIGHT + 1)*2, StringPrintfW(L"VSP:%08X", jitd->getVSP()), &fontInfo);
- c->textOut(r.right - REGWIDTH + 7, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2) + 8 + (LINEHEIGHT + 1)*3, StringPrintfW(L"VCC:%08X", jitd->getVCC()), &fontInfo);
- c->lineDraw(r.left, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2), r.right, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2));
- c->lineDraw(r.left, r.bottom - (INPUTHEIGHT + 2), r.right - REGWIDTH, r.bottom - (INPUTHEIGHT + 2));
- c->lineDraw(r.right - REGWIDTH, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2), r.right - REGWIDTH, r.bottom);
- c->lineDraw(r.right - RIGHTCOLUMN, 0, r.right - RIGHTCOLUMN, r.bottom - (INPUTHEIGHT + (NCONSOLELINES*LINEHEIGHT) + 2));
- disassemble(c);
- for (int s = 0;s < strstack.getNumItems();s++)
- {
- c->textOutEllipsed(r.right - RIGHTCOLUMN + 4, s*LINEHEIGHT + 4, RIGHTCOLUMN - 8, 16, strstack.enumItem(s)->getValue(), &fontInfo);
- }
- return 1;
- }
- int SimpleDebuggerUI::onLeftButtonDown(int x, int y)
- {
- SimpleDebuggerUI_PARENT::onLeftButtonDown(x, y);
- if (edit) edit->onGetFocus();
- // leave = 1;
- return 1;
- }
- void SimpleDebuggerUI::disassemble(Canvas *c)
- {
- RECT r;
- getClientRect(&r);
- int x = 4;
- int y = (r.bottom - r.top - 4) / 2 + 4;
- int ln = jitd->findLine(jitd->getVIP());
- if (ln != -1)
- {
- Wasabi::FontInfo fontInfo;
- SourceCodeLine *l = jitd->enumLine(ln);
- int sourcecode = l->getSourceFile() != NULL;
- int g;
- int j = 0;
- for (g = y;g < r.bottom - (INPUTHEIGHT + 4 + (NCONSOLELINES*LINEHEIGHT)) - LINEHEIGHT;g += LINEHEIGHT)
- {
- if (!sourcecode || j == 0)
- l = jitd->enumLine(ln + j);
- if (!l) break;
- if (j == 0)
- {
- RECT br;
- br.left = 4;
- br.top = g;
- br.right = r.right - (RIGHTCOLUMN + 4);
- br.bottom = br.top + LINEHEIGHT;
- c->fillRect(&br, RGB(0, 255, 0));
- fontInfo.color = RGB(0, 0, 0);
- }
- if (!sourcecode)
- {
- String str;
- unsigned const char *d = (unsigned const char *)(l->getPointer() + jitd->getCodeBlock());
- for (int k = 0;k < l->getLength();k++)
- {
- if (!str.isempty()) str += " ";
- str += StringPrintf("%02X", *d);
- d++;
- }
- c->textOut(x, g, StringPrintfW(L"%08X", l->getPointer()), &fontInfo);
- c->textOut(x + 70, g, AutoWide(str), &fontInfo);
- c->textOut(x + 70 + 150, g, l->getLine(), &fontInfo);
- }
- else
- {
- c->textOutEllipsed(x, g, r.right - r.left - (RIGHTCOLUMN + 4 + x), 16, (getLine(l->getSourceFile(), l->getSourceFileLine() + j)), &fontInfo);
- }
- j++;
- }
- j = 1;
- for (g = y - LINEHEIGHT;g > 1;g -= LINEHEIGHT)
- {
- if (!sourcecode || j == 0)
- l = jitd->enumLine(ln - j);
- if (!l) break;
- if (!sourcecode)
- {
- String str;
- unsigned const char *d = (unsigned const char *)(l->getPointer() + jitd->getCodeBlock());
- for (int k = 0;k < l->getLength();k++)
- {
- if (!str.isempty()) str += " ";
- str += StringPrintf("%02X", *d);
- d++;
- }
- c->textOut(x, g, StringPrintfW(L"%08X", l->getPointer()), &fontInfo);
- c->textOut(x + 70, g, AutoWide(str), &fontInfo);
- c->textOut(x + 70 + 150, g, (l->getLine()), &fontInfo);
- }
- else
- {
- c->textOutEllipsed(x, g, r.right - r.left - (RIGHTCOLUMN + 4 + x), 16, (getLine(l->getSourceFile(), l->getSourceFileLine() - j)), &fontInfo);
- }
- j++;
- }
- }
- }
- int SimpleDebuggerUI::onResize()
- {
- SimpleDebuggerUI_PARENT::onResize();
- if (edit != NULL)
- {
- RECT r;
- getClientRect(&r);
- edit->resize(1, r.bottom - (INPUTHEIGHT + 1), r.right - r.left - (REGWIDTH + 1), INPUTHEIGHT);
- }
- return 1;
- }
- int SimpleDebuggerUI::childNotify(ifc_window *child, int msg, intptr_t p1, intptr_t p2)
- {
- if (child == edit)
- {
- if (msg == ChildNotify::EDITWND_ENTER_PRESSED)
- {
- onCommand(cmdbuf);
- }
- }
- return SimpleDebuggerUI_PARENT::childNotify(child, msg, p1, p2);
- }
- BEGIN_STRINGDICTIONARY(_debuggercommands)
- SDI(L"b", DEBUG_CMD_BREAKPOINT);
- SDI(L"break", DEBUG_CMD_BREAKPOINT);
- SDI(L"x", DEBUG_CMD_CONTINUE);
- SDI(L"continue", DEBUG_CMD_CONTINUE);
- SDI(L"i", DEBUG_CMD_STEPINTO);
- SDI(L"stepinto", DEBUG_CMD_STEPINTO);
- SDI(L"o", DEBUG_CMD_STEPOVER);
- SDI(L"stepover", DEBUG_CMD_STEPOVER);
- SDI(L"p", DEBUG_CMD_STEPOUT);
- SDI(L"stepout", DEBUG_CMD_STEPOUT);
- SDI(L"k", DEBUG_CMD_KILL);
- SDI(L"kill", DEBUG_CMD_KILL);
- SDI(L"?", DEBUG_CMD_HELP);
- SDI(L"help", DEBUG_CMD_HELP);
- END_STRINGDICTIONARY(_debuggercommands, debuggercommands)
- void SimpleDebuggerUI::onCommand(const wchar_t *cmd)
- {
- if (*cmd == 0)
- {
- stepOver();
- return;
- }
- ParamParser pp(cmd, L" ");
- int i = debuggercommands.getId(pp.enumItem(0));
- switch (i)
- {
- case DEBUG_CMD_BREAKPOINT:
- addBreakPoint(pp.enumItem(1));
- break;
- case DEBUG_CMD_CONTINUE:
- continueExecution();
- break;
- case DEBUG_CMD_STEPINTO:
- stepInto();
- break;
- case DEBUG_CMD_STEPOVER:
- stepOver();
- break;
- case DEBUG_CMD_KILL:
- killScript();
- break;
- case DEBUG_CMD_HELP:
- showHelp();
- break;
- }
- }
- int SimpleDebuggerUI::evaluate(const wchar_t *ascii)
- {
- if (!_wcsicmp(ascii, L"VSD")) return jitd->getVSD();
- if (!_wcsicmp(ascii, L"VIP")) return jitd->getVIP();
- if (!_wcsicmp(ascii, L"VSP")) return jitd->getVSP();
- if (!_wcsicmp(ascii, L"VCC")) return jitd->getVCC();
- wchar_t *end;
- return wcstol(ascii, &end, 16);
- }
- void SimpleDebuggerUI::addBreakPoint(const wchar_t *pointer_ascii)
- {
- /*int i = */evaluate(pointer_ascii);
- }
- void SimpleDebuggerUI::continueExecution()
- {
- retcode = JITD_RETURN_CONTINUE;
- leave = 1;
- }
- void SimpleDebuggerUI::stepInto()
- {
- retcode = JITD_RETURN_STEPINTO;
- leave = 1;
- }
- void SimpleDebuggerUI::stepOver()
- {
- int ln = jitd->findLine(jitd->getVIP());
- ln++;
- SourceCodeLine *l = jitd->enumLine(ln);
- if (l != NULL) // else ret as last opcode
- jitd->setSysBreakpoint(l->getPointer());
- retcode = JITD_RETURN_CONTINUE;
- leave = 1;
- }
- void SimpleDebuggerUI::killScript()
- {
- retcode = JITD_RETURN_TERMINATE;
- leave = 1;
- }
- void SimpleDebuggerUI::showHelp()
- {}
- int SimpleDebuggerUI::onGetFocus()
- {
- SimpleDebuggerUI_PARENT::onGetFocus();
- if (edit) edit->onGetFocus();
- return 1;
- }
- void SimpleDebuggerUI::onSetVisible(int show)
- {
- SimpleDebuggerUI_PARENT::onSetVisible(show);
- if (edit) edit->onGetFocus();
- }
- #undef fgets
- const wchar_t *SimpleDebuggerUI::getLine(const wchar_t *filename, int fileline)
- {
- if (fileline <= 0)
- return L"";
- static StringW str;
- FILE *f = _wfopen(filename, L"rt");
- if (!f)
- {
- str = L"couldn't load ";
- str += filename;
- return str;
- }
- char t[256] = {0};
- char u[256] = {0};
- int n = fileline;
- while (n--)
- {
- *u = 0;
- char *p;
- do
- {
- p = *u ? t : u;
- fgets(p, 255, f);
- t[255] = 0;
- }
- while (!feof(f) && p[STRLEN(p)-1] != '\n' && p[STRLEN(p)-1] != '\r');
- }
- char *p = u;
- while (p && *p && p < u + 256)
- {
- if (*p < 0x21) *p = ' ';
- p++;
- }
- str = AutoWide(u, CP_UTF8);
- fclose(f);
- return str;
- }
|