diff --git a/src/asmCode.js b/src/asmCode.js index 582466caab..c941b25297 100644 --- a/src/asmCode.js +++ b/src/asmCode.js @@ -23,8 +23,10 @@ module.exports = React.createClass({ }, componentDidMount: function () { - this.context.codeManager.registerIndexChangedListener(this, this.indexChanged) - this.context.codeManager.registerCodeChangedListener(this, this.codeChanged) + this.context.codeManager.register('indexChanged', this, this.indexChanged) + this.context.codeManager.register('codeChanged', this, this.codeChanged) + this.context.codeManager.register('loadingCode', this, function (address) { + }) }, indexChanged: function (index) { diff --git a/src/codeManager.js b/src/codeManager.js index 8afaa25a6e..5db4387d09 100644 --- a/src/codeManager.js +++ b/src/codeManager.js @@ -1,32 +1,30 @@ 'use strict' var traceManagerUtil = require('./traceManagerUtil') var codeResolver = require('./codeResolver') +var util = require('./util') +var eventManager = require('./eventManager') + +/* + resolve contract code referenced by vmtrace in order to be used by asm listview. + events: + - indexChanged: triggered when an item is selected + - codeChanged: triggered when an item (in a different context) is selected + - loadingCode: triggerred when loading new code + - resolvingStep: when CodeManager resolves code/selected instruction of a new step +*/ + function CodeManager (_web3, _traceManager) { + util.extend(this, eventManager) this.web3 = _web3 this.isLoading = false this.traceManager = _traceManager this.currentAddress = '' - this.indexChangedlisteners = [] - this.codeChangedlisteners = [] codeResolver.setWeb3(_web3) } -CodeManager.prototype.registerIndexChangedListener = function (obj, func) { - this.indexChangedlisteners.push({ - obj: obj, - func: func - }) -} - -CodeManager.prototype.registerCodeChangedListener = function (obj, func) { - this.codeChangedlisteners.push({ - obj: obj, - func: func - }) -} - -CodeManager.prototype.resolveCodeFor = function (stepIndex, tx) { +CodeManager.prototype.resolveStep = function (stepIndex, tx) { if (stepIndex < 0) return + this.trigger('resolvingStep') var self = this if (stepIndex === 0) { self.ensureCodeLoaded(tx.to, stepIndex, tx) @@ -51,9 +49,10 @@ CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) { console.log(error) } else { var codes = codeResolver.cacheExecutingCode(address, hexCode) + self.trigger('loadingCode', [address]) self.getInstructionIndex(address, currentStep, function (error, result) { if (!error) { - self.dispatchCodeChanged(codes.code, address, result) + self.trigger('codeChanged', [codes.code, address, result]) self.currentAddress = address } else { console.log(error) @@ -64,9 +63,10 @@ CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) { } else { codeResolver.resolveCode(address, currentStep, tx, function (address, code) { // resoling code from stack + self.trigger('loadingCode', [address]) self.getInstructionIndex(address, currentStep, function (error, result) { if (!error) { - self.dispatchCodeChanged(code, address, result) + self.trigger('codeChanged', [code, address, result]) self.currentAddress = address } else { console.log(error) @@ -78,7 +78,7 @@ CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) { // only set selected item this.getInstructionIndex(this.currentAddress, currentStep, function (error, result) { if (!error) { - self.dispatchIndexChanged(result) + self.trigger('indexChanged', [result]) } }) } @@ -96,18 +96,4 @@ CodeManager.prototype.getInstructionIndex = function (address, step, callback) { }) } -CodeManager.prototype.dispatchIndexChanged = function (itemIndex) { - for (var listener in this.indexChangedlisteners) { - var l = this.indexChangedlisteners[listener] - l.func.call(l.obj, itemIndex) - } -} - -CodeManager.prototype.dispatchCodeChanged = function (code, address, itemIndex) { - for (var listener in this.codeChangedlisteners) { - var l = this.codeChangedlisteners[listener] - l.func.call(l.obj, code, address, itemIndex) - } -} - module.exports = CodeManager diff --git a/src/debugger.js b/src/debugger.js index e379de3fb7..9f6de8b0bd 100644 --- a/src/debugger.js +++ b/src/debugger.js @@ -44,7 +44,7 @@ module.exports = React.createClass({ this.setState({ currentStepIndex: stepIndex }) - this.props.context.codeManager.resolveCodeFor(stepIndex, this.state.tx) + this.props.context.codeManager.resolveStep(stepIndex, this.state.tx) }, startDebugging: function (blockNumber, txIndex, tx) { @@ -62,7 +62,7 @@ module.exports = React.createClass({ currentStepIndex: 0 }) self.refs.stepManager.newTraceAvailable() - self.props.context.codeManager.resolveCodeFor(0, tx) + self.props.context.codeManager.resolveStep(0, tx) }) } }) diff --git a/src/eventManager.js b/src/eventManager.js new file mode 100644 index 0000000000..82d9929c64 --- /dev/null +++ b/src/eventManager.js @@ -0,0 +1,22 @@ +'use strict' +module.exports = { + registered: {}, + + register: function (eventName, obj, func) { + if (!this.registered[eventName]) { + this.registered[eventName] = [] + } + this.registered[eventName].push({ + obj: obj, + func: func + }) + }, + + trigger: function (eventName, args) { + for (var listener in this.registered[eventName]) { + var l = this.registered[eventName][listener] + l.func.apply(l.obj, args) + } + } + +} diff --git a/src/util.js b/src/util.js new file mode 100644 index 0000000000..75c2570c4a --- /dev/null +++ b/src/util.js @@ -0,0 +1,9 @@ +'use strict' +module.exports = { + extend: function (destination, source) { + for (var property in source) { + destination[property] = source[property] + } + // return destination + } +}