Commit 61b50aa7 authored by yann300's avatar yann300 Committed by GitHub

Merge pull request #203 from ethereum/fixInternalCallTree

Add external call ref to the call tree
parents 76f8485b 9943e2b2
...@@ -4,6 +4,7 @@ var AstWalker = require('./astWalker') ...@@ -4,6 +4,7 @@ var AstWalker = require('./astWalker')
var EventManager = require('../lib/eventManager') var EventManager = require('../lib/eventManager')
var decodeInfo = require('../solidity/decodeInfo') var decodeInfo = require('../solidity/decodeInfo')
var util = require('../helpers/util') var util = require('../helpers/util')
var traceHelper = require('../helpers/traceHelper')
/** /**
* Tree representing internal jump into function. * Tree representing internal jump into function.
...@@ -107,6 +108,14 @@ async function buildTree (tree, step, scopeId) { ...@@ -107,6 +108,14 @@ async function buildTree (tree, step, scopeId) {
let subScope = 1 let subScope = 1
tree.scopeStarts[step] = scopeId tree.scopeStarts[step] = scopeId
tree.scopes[scopeId] = { firstStep: step, locals: {} } tree.scopes[scopeId] = { firstStep: step, locals: {} }
function callDepthChange (step, trace) {
if (step + 1 < trace.length) {
return trace[step].depth !== trace[step + 1].depth
}
return false
}
var currentSourceLocation = {} var currentSourceLocation = {}
while (step < tree.traceManager.trace.length) { while (step < tree.traceManager.trace.length) {
var sourceLocation var sourceLocation
...@@ -124,19 +133,23 @@ async function buildTree (tree, step, scopeId) { ...@@ -124,19 +133,23 @@ async function buildTree (tree, step, scopeId) {
if (!sourceLocation) { if (!sourceLocation) {
return { outStep: step, error: 'InternalCallTree - No source Location. ' + step } return { outStep: step, error: 'InternalCallTree - No source Location. ' + step }
} }
if (sourceLocation.jump === 'i') { if (traceHelper.isCallInstruction(tree.traceManager.trace[step]) ||
sourceLocation.jump === 'i') {
try { try {
var result = await buildTree(tree, step + 1, scopeId === '' ? subScope.toString() : scopeId + '.' + subScope) if (sourceLocation.jump === 'i') {
if (result.error) { step++
return { outStep: step, error: 'InternalCallTree - ' + result.error } }
var externalCallResult = await buildTree(tree, step, scopeId === '' ? subScope.toString() : scopeId + '.' + subScope)
if (externalCallResult.error) {
return { outStep: step, error: 'InternalCallTree - ' + externalCallResult.error }
} else { } else {
step = result.outStep step = externalCallResult.outStep
subScope++ subScope++
} }
} catch (e) { } catch (e) {
return { outStep: step, error: 'InternalCallTree - ' + e.message } return { outStep: step, error: 'InternalCallTree - ' + e.message }
} }
} else if (sourceLocation.jump === 'o') { } else if (sourceLocation.jump === 'o' || callDepthChange(step, tree.traceManager.trace)) {
tree.scopes[scopeId].lastStep = step tree.scopes[scopeId].lastStep = step
return { outStep: step + 1 } return { outStep: step + 1 }
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment