parent
9a30bb5b2e
commit
2f2fd70a27
@ -1,72 +1,16 @@ |
||||
'use strict' |
||||
var SourceLocationTracker = require('../code/sourceLocationTracker') |
||||
var AstWalker = require('../util/astWalker') |
||||
var decodeInfo = require('../solidity/decodeInfo') |
||||
|
||||
class LocalDecoder { |
||||
constructor (codeManager, traceAnalyserEvent, solidityProxy) { |
||||
this.astWalker = new AstWalker() |
||||
this.sourceLocationTracker = new SourceLocationTracker(codeManager) |
||||
this.solidityProxy = solidityProxy |
||||
this.locals = {} |
||||
var self = this |
||||
traceAnalyserEvent.register('startAnalysing', function (step) { |
||||
self.clear() |
||||
}) |
||||
traceAnalyserEvent.register('onOp', function (index, step, callStack, cache) { |
||||
self.push(index, step, callStack, cache) |
||||
}) |
||||
traceAnalyserEvent.register('finishAnalysing', function (index, step) {}) |
||||
this.variableDeclarationByFile = {} |
||||
solidityLocals (vmtraceIndex, internalTreeCall, stack, memory) { |
||||
var scope = this.internalTreeCall.findScope(vmtraceIndex) |
||||
var locals = {} |
||||
for (var local of scope.locals) { |
||||
if (local.type.decodeLocals) { |
||||
locals[local.name] = local.type.decodeLocals(local.stackHeight, stack, memory) |
||||
} |
||||
|
||||
push (index, step, callStack, cache) { |
||||
if (!this.solidityProxy.loaded()) return |
||||
if (step.op.indexOf('PUSH') === 0) { |
||||
var address = callStack[callStack.length - 1] |
||||
this.sourceLocationTracker.getSourceLocationFromVMTraceIndex(address, index, this.solidityProxy.contracts, (error, result) => { |
||||
if (error) { |
||||
console.log(error) |
||||
} else { |
||||
if (!this.variableDeclarationByFile[result.file]) { |
||||
var ast = this.solidityProxy.ast(result) |
||||
this.variableDeclarationByFile[result.file] = extractVariableDeclarations(ast, this.astWalker) |
||||
} |
||||
var variableDeclarations = this.variableDeclarationByFile[result.file] |
||||
this.solidityProxy.extractStateVariablesAt(index, (error, stateVars) => { // cached
|
||||
if (error) { |
||||
console.log(error) |
||||
} else { |
||||
for (var dec of variableDeclarations) { |
||||
if (dec.src.indexOf(result.start + ':' + result.length) === 0) { |
||||
this.locals[dec.attributes.name] = { |
||||
type: decodeInfo.parseType(dec.attributes.type, stateVars), |
||||
stack: step.stack |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}) |
||||
} |
||||
}) |
||||
} |
||||
} |
||||
|
||||
clear () { |
||||
this.locals = {} |
||||
this.variableDeclarationByFile = {} |
||||
} |
||||
} |
||||
|
||||
function extractVariableDeclarations (ast, astWalker) { |
||||
var ret = [] |
||||
astWalker.walk(ast, (node) => { |
||||
if (node.name === 'VariableDeclaration') { |
||||
ret.push(node) |
||||
return locals |
||||
} |
||||
return true |
||||
}) |
||||
return ret |
||||
} |
||||
|
||||
module.exports = LocalDecoder |
||||
|
@ -0,0 +1,44 @@ |
||||
'use strict' |
||||
var DropdownPanel = require('./DropdownPanel') |
||||
var localDecoder = require('../solidity/localDecoder') |
||||
var yo = require('yo-yo') |
||||
|
||||
class SolidityLocals { |
||||
|
||||
constructor (_parent, _traceManager, internalTreeCall) { |
||||
this.parent = _parent |
||||
this.internalTreeCall = internalTreeCall |
||||
this.traceManager = _traceManager |
||||
this.basicPanel = new DropdownPanel('Solidity Locals') |
||||
this.init() |
||||
} |
||||
|
||||
render () { |
||||
return yo`<div id='soliditylocals' >${this.basicPanel.render()}</div>` |
||||
} |
||||
|
||||
init () { |
||||
this.parent.event.register('indexChanged', this, (index) => { |
||||
if (index < 0) { |
||||
this.basicPanel.update({info: 'invalid step index'}) |
||||
return |
||||
} |
||||
if (this.parent.currentStepIndex !== index) return |
||||
|
||||
this.traceManager.waterfall([ |
||||
this.traceManager.getStackAt, |
||||
this.traceManager.getMemoryAt], |
||||
index, |
||||
function (error, result) { |
||||
if (!error) { |
||||
var stack = result[0].value |
||||
var memory = result[1].value |
||||
var locals = localDecoder.soliditylocals(index, this.internalTreeCall, stack, memory) |
||||
this.basicPanel.update(locals) |
||||
} |
||||
}) |
||||
}) |
||||
} |
||||
} |
||||
|
||||
module.exports = SolidityLocals |
Loading…
Reference in new issue