|
|
|
@ -85,7 +85,21 @@ module.exports = { |
|
|
|
|
return index >= 0 ? array[index] : null |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
findCall: findCall |
|
|
|
|
findCall: findCall, |
|
|
|
|
buildCallsPath: buildCallsPath |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Find calls path from @args rootCall which leads to @args index (recursive) |
|
|
|
|
* |
|
|
|
|
* @param {Int} index - index of the vmtrace |
|
|
|
|
* @param {Object} rootCall - call tree, built by the trace analyser |
|
|
|
|
* @return {Array} - return the calls path to @args index |
|
|
|
|
*/ |
|
|
|
|
function buildCallsPath (index, rootCall) { |
|
|
|
|
var ret = [] |
|
|
|
|
findCallInternal(index, rootCall, ret) |
|
|
|
|
return ret |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -96,12 +110,18 @@ module.exports = { |
|
|
|
|
* @return {Object} - return the call which include the @args index |
|
|
|
|
*/ |
|
|
|
|
function findCall (index, rootCall) { |
|
|
|
|
var ret = buildCallsPath(index, rootCall) |
|
|
|
|
return ret[ret.length - 1] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function findCallInternal (index, rootCall, callsPath) { |
|
|
|
|
var calls = Object.keys(rootCall.calls) |
|
|
|
|
var ret = rootCall |
|
|
|
|
callsPath.push(rootCall) |
|
|
|
|
for (var k in calls) { |
|
|
|
|
var subCall = rootCall.calls[calls[k]] |
|
|
|
|
if (index >= subCall.start && index <= subCall.return) { |
|
|
|
|
ret = findCall(index, subCall) |
|
|
|
|
findCallInternal(index, subCall, callsPath) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|