void DebugCLI::bt() { //core->stackTrace->dump(core->console); //core->console << '\n'; // obtain information about each frame int frameCount = core->debugger->frameCount(); for(int k=0; k<frameCount; k++) { Atom* ptr; int count, line; SourceInfo* src; DebugFrame* frame = core->debugger->frameAt(k); // source information frame->sourceLocation(src, line); core->console << "#" << k << " "; // this Atom a = nullObjectAtom; frame->dhis(a); core->console << core->format(a) << "."; // method MethodInfo* info = functionFor(src, line); if (info) core->console << info->name; else core->console << "<unknown>"; core->console << "("; // dump args frame->arguments(ptr, count); for(int i=0; i<count; i++) { // write out the name if ( info && (info->getArgName(i) != core->kundefined) ) core->console << info->getArgName(i) << "="; core->console << core->format(*ptr++); if (i<count-1) core->console << ","; } core->console << ") at "; if (src) core->console << src->name(); else core->console << "???"; core->console << ":" << (line) << "\n"; } }
Stringp Debugger::autoVarName(DebugStackFrame* frame, int index, AutoVarKind kind) { if (frame == NULL) return NULL; int line; SourceInfo* src = NULL; // source information frame->sourceLocation(src, line); MethodInfo* info = functionFor(src, line, frame); if (!info) return NULL; switch (kind) { case AUTO_LOCAL: return info->getLocalName(index); case AUTO_ARGUMENT: return info->getArgName(index); case AUTO_THIS: return NULL; default: AvmAssert(false); } return NULL; }
void DebugCLI::set() { const char* what = nextToken(); const char* equ = nextToken(); const char* to = nextToken(); if (!to || !equ || !what || *equ != '=') { core->console << " Bad format, should be: 'set {variable} = {value}' "; } else { // look for the varable in our locals or args. Atom* ptr; int count, line; SourceInfo* src; DebugFrame* frame = core->debugger->frameAt(0); // source information frame->sourceLocation(src, line); if (!src) { core->console << "Unable to locate debug information for current source file, so no local or argument names known"; return; } // method MethodInfo* info = functionFor(src, line); if (!info) { core->console << "Unable to find method debug information, so no local or argument names known"; return; } frame->arguments(ptr, count); for(int i=0; i<count; i++) { Stringp arg = info->getArgName(i); if (arg->Equals(what)) { // match! Atom a = ease2Atom(to, ptr[i]); if (a == undefinedAtom) core->console << " Type mismatch : current value is " << core->format(ptr[i]); else frame->setArgument(i, a); return; } } frame->locals(ptr, count); for(int i=0; i<count; i++) { Stringp local = info->getLocalName(i); if ( local->Equals(what)) { // match! Atom a = ease2Atom(to, ptr[i]); if (a == undefinedAtom) core->console << " Type mismatch : current value is " << core->format(ptr[i]); else frame->setLocal(i, a); return; } } } }