axmol/scripting/javascript/bindings/js/jsb_debugger.js

192 lines
4.5 KiB
JavaScript

dbg = {};
// fallback for no cc
cc = {};
cc.log = log;
var breakpointHandler = {
hit: function (frame) {
var script = frame.script;
_lockVM(frame, frame.script);
}
};
var stepFunction = function (frame, script) {
if (dbg.breakLine > 0) {
var curLine = script.getOffsetLine(frame.offset);
if (curLine < dbg.breakLine) {
return;
} else {
_lockVM(frame, script);
// dbg.breakLine = 0;
// frame.onStep = undefined;
}
} else {
cc.log("invalid state onStep");
}
};
dbg.breakLine = 0;
var processInput = function (str, frame, script) {
str = str.replace(/\n$/, "");
if (str.length === 0) {
return;
}
var md = str.match(/^b(reak)?\s+([^:]+):(\d+)/);
if (md) {
var scripts = dbg.scripts[md[2]],
tmpScript = null;
if (scripts) {
var breakLine = parseInt(md[3], 10),
off = -1;
for (var n=0; n < scripts.length; n++) {
offsets = scripts[n].getLineOffsets(breakLine);
if (offsets.length > 0) {
off = offsets[0];
tmpScript = scripts[n];
break;
}
}
if (off >= 0) {
tmpScript.setBreakpoint(off, breakpointHandler);
_bufferWrite("breakpoint set for line " + breakLine + " of script " + md[2] + "\n");
} else {
_bufferWrite("no valid offsets at that line\n");
}
} else {
_bufferWrite("no script named: " + md[2] + "\n");
}
return;
}
md = str.match(/^scripts/);
if (md) {
cc.log("sending list of available scripts");
_bufferWrite("scripts:\n" + Object.keys(dbg.scripts).join("\n") + "\n");
return;
}
md = str.match(/^s(tep)?/);
if (md && frame) {
cc.log("will step");
dbg.breakLine = script.getOffsetLine(frame.offset) + 1;
frame.onStep = function () {
stepFunction(frame, frame.script);
return undefined;
};
stop = true;
_unlockVM();
return;
}
md = str.match(/^c(ontinue)?/);
if (md) {
if (frame) {
frame.onStep = undefined;
dbg.breakLine = 0;
}
stop = true;
_unlockVM();
return;
}
md = str.match(/^eval\s+(.+)/);
if (md && frame) {
var res = frame['eval'](md[1]),
k;
if (res['return']) {
var r = res['return'];
_bufferWrite("* " + (typeof r) + "\n");
if (typeof r != "object") {
_bufferWrite("~> " + r + "\n");
} else {
var props = r.getOwnPropertyNames();
for (k in props) {
var desc = r.getOwnPropertyDescriptor(props[k]);
_bufferWrite("~> " + props[k] + " = ");
if (desc.value) {
_bufferWrite("" + desc.value);
} else if (desc.get) {
_bufferWrite("" + desc.get());
} else {
_bufferWrite("undefined (no value or getter)");
}
_bufferWrite("\n");
}
}
} else if (res['throw']) {
_bufferWrite("!! got exception: " + res['throw'].message + "\n");
}
return;
} else if (md) {
_bufferWrite("!! no frame to eval in\n");
return;
}
md = str.match(/^line/);
if (md && frame) {
_bufferWrite("current line: " + script.getOffsetLine(frame.offset) + "\n");
return;
} else if (md) {
_bufferWrite("no line, probably entering script\n");
return;
}
md = str.match(/^bt/);
if (md && frame) {
var cur = frame,
stack = [cur.script.url + ":" + cur.script.getOffsetLine(cur.offset)];
while ((cur = cur.older)) {
stack.push(cur.script.url + ":" + cur.script.getOffsetLine(cur.offset));
}
_bufferWrite(stack.join("\n") + "\n");
return;
} else if (md) {
_bufferWrite("no valid frame\n");
return;
}
_bufferWrite("! invalid command: \"" + str + "\"\n");
};
dbg.scripts = [];
dbg.onNewScript = function (script) {
// skip if the url is this script
var last = script.url.split("/").pop();
var children = script.getChildScripts(),
arr = [script].concat(children);
/**
* just dumping all the offsets from the scripts
for (var i in arr) {
cc.log("script: " + arr[i].url);
for (var start=arr[i].startLine, j=start; j < start+arr[i].lineCount; j++) {
var offsets = arr[i].getLineOffsets(j);
cc.log(" off: " + offsets.join(",") + "; line: " + j);
}
}
*/
dbg.scripts[last] = arr;
};
dbg.onError = function (frame, report) {
if (dbg.socket && report) {
_socketWrite(dbg.socket, "!! exception @ " + report.file + ":" + report.line);
}
cc.log("!! exception");
};
function _prepareDebugger(global) {
var tmp = new Debugger(global);
tmp.onNewScript = dbg.onNewScript;
tmp.onDebuggerStatement = dbg.onDebuggerStatement;
tmp.onError = dbg.onError;
dbg.dbg = tmp;
}
function _startDebugger(global, files, startFunc) {
cc.log("starting with debugger enabled");
for (var i in files) {
global['eval']("require('" + files[i] + "');");
}
if (startFunc) {
global['eval'](startFunc);
}
// beginDebug();
}