| |
| /* |
| * weinre is available under *either* the terms of the modified BSD license *or* the |
| * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. |
| * |
| * Copyright (c) 2010, 2011 IBM Corporation |
| */ |
| |
| //----------------------------------------------------------------------------- |
| class StackTrace(args) |
| if (!args || !args.callee) { |
| throw Error("first parameter to " + arguments.callee.signature + " must be an Arguments object") |
| } |
| |
| this.trace = getTrace(args) |
| |
| //----------------------------------------------------------------------------- |
| static method dump(args) |
| args = args || arguments |
| |
| var stackTrace = new StackTrace(args) |
| stackTrace.dump() |
| |
| //----------------------------------------------------------------------------- |
| method dump |
| console.log("StackTrace:") |
| this.trace.forEach(function(frame) { |
| console.log(" " + frame) |
| }) |
| |
| //----------------------------------------------------------------------------- |
| function getTrace(args) |
| |
| var result = [] |
| var visitedFuncs = [] |
| |
| var func = args.callee |
| |
| while (func) { |
| if (func.signature) result.push(func.signature) |
| else if (func.displayName) result.push(func.displayName) |
| else if (func.name) result.push(func.name) |
| else result.push("<anonymous>") |
| |
| if (-1 != visitedFuncs.indexOf(func)) { |
| result.push("... recursion") |
| return result |
| } |
| |
| visitedFuncs.push(func) |
| |
| func = func.caller |
| } |
| |
| return result |