parent
8073213d9e
commit
e309ea7515
@ -0,0 +1,163 @@ |
|||||||
|
var remixLib = require('remix-lib') |
||||||
|
var EventManager = remixLib.EventManager |
||||||
|
|
||||||
|
class DebuggerStepManager { |
||||||
|
|
||||||
|
constructor (_parent, _traceManager) { |
||||||
|
this.event = new EventManager() |
||||||
|
this._parent = _parent |
||||||
|
this.parent = _parent.debugger |
||||||
|
this.traceManager = _traceManager |
||||||
|
this.currentStepIndex = 0 |
||||||
|
this.traceLength = 0 |
||||||
|
this.revertionPoint = null |
||||||
|
|
||||||
|
this.listenToEvents() |
||||||
|
} |
||||||
|
|
||||||
|
listenToEvents () { |
||||||
|
const self = this |
||||||
|
|
||||||
|
this.parent.event.register('newTraceLoaded', this, function () { |
||||||
|
self.traceManager.getLength(function (error, newLength) { |
||||||
|
if (error) { |
||||||
|
return console.log(error) |
||||||
|
} |
||||||
|
if (self.traceLength !== newLength) { |
||||||
|
self.event.trigger('traceLengthChanged', [newLength]) |
||||||
|
self.traceLength = newLength |
||||||
|
} |
||||||
|
self.jumpTo(0) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
this.parent.callTree.event.register('callTreeReady', () => { |
||||||
|
if (self.parent.callTree.functionCallStack.length) { |
||||||
|
self.jumpTo(self.parent.callTree.functionCallStack[0]) |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
this._parent.event.register('indexChanged', this, (index) => { |
||||||
|
if (index < 0) return |
||||||
|
if (self._parent.currentStepIndex !== index) return |
||||||
|
|
||||||
|
self.traceManager.buildCallPath(index, (error, callsPath) => { |
||||||
|
if (error) { |
||||||
|
console.log(error) |
||||||
|
return self.event.trigger('revertWarning', ['']) |
||||||
|
// if (self.buttonNavigator) {
|
||||||
|
// self.buttonNavigator.resetWarning('')
|
||||||
|
// }
|
||||||
|
// return
|
||||||
|
} |
||||||
|
self.currentCall = callsPath[callsPath.length - 1] |
||||||
|
if (self.currentCall.reverted) { |
||||||
|
let revertedReason = self.currentCall.outofgas ? 'outofgas' : '' |
||||||
|
self.revertionPoint = self.currentCall.return |
||||||
|
return self.event.trigger('revertWarning', [revertedReason]) |
||||||
|
// if (self.buttonNavigator) {
|
||||||
|
// self.buttonNavigator.resetWarning(revertedReason)
|
||||||
|
// }
|
||||||
|
// return
|
||||||
|
} |
||||||
|
for (var k = callsPath.length - 2; k >= 0; k--) { |
||||||
|
var parent = callsPath[k] |
||||||
|
if (!parent.reverted) continue |
||||||
|
self.revertionPoint = parent.return |
||||||
|
self.event.trigger('revertWarning', ['parenthasthrown']) |
||||||
|
// if (self.buttonNavigator) {
|
||||||
|
// self.buttonNavigator.resetWarning('parenthasthrown')
|
||||||
|
// }
|
||||||
|
} |
||||||
|
self.event.trigger('revertWarning', ['']) |
||||||
|
// if (self.buttonNavigator) {
|
||||||
|
// self.buttonNavigator.resetWarning('')
|
||||||
|
// }
|
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
triggerStepChanged (step) { |
||||||
|
const self = this |
||||||
|
this.traceManager.getLength(function (error, length) { |
||||||
|
let stepState = 'valid' |
||||||
|
|
||||||
|
if (error) { |
||||||
|
stepState = 'invalid' |
||||||
|
} else if (step <= 0) { |
||||||
|
stepState = 'initial' |
||||||
|
} else if (step >= length - 1) { |
||||||
|
stepState = 'end' |
||||||
|
} |
||||||
|
|
||||||
|
let jumpOutDisabled = (step === self.traceManager.findStepOut(step)) |
||||||
|
|
||||||
|
self.event.trigger('stepChanged', [step, stepState, jumpOutDisabled]) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
stepIntoBack () { |
||||||
|
if (!this.traceManager.isLoaded()) return |
||||||
|
var step = this.currentStepIndex - 1 |
||||||
|
this.currentStepIndex = step |
||||||
|
if (!this.traceManager.inRange(step)) { |
||||||
|
return |
||||||
|
} |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
stepIntoForward () { |
||||||
|
if (!this.traceManager.isLoaded()) return |
||||||
|
var step = this.currentStepIndex + 1 |
||||||
|
this.currentStepIndex = step |
||||||
|
if (!this.traceManager.inRange(step)) { |
||||||
|
return |
||||||
|
} |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
stepOverBack () { |
||||||
|
if (!this.traceManager.isLoaded()) return |
||||||
|
var step = this.traceManager.findStepOverBack(this.currentStepIndex) |
||||||
|
this.currentStepIndex = step |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
stepOverForward () { |
||||||
|
if (!this.traceManager.isLoaded()) return |
||||||
|
var step = this.traceManager.findStepOverForward(this.currentStepIndex) |
||||||
|
this.currentStepIndex = step |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
jumpOut () { |
||||||
|
if (!this.traceManager.isLoaded()) return |
||||||
|
var step = this.traceManager.findStepOut(this.currentStepIndex) |
||||||
|
this.currentStepIndex = step |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
jumpTo (step) { |
||||||
|
if (!this.traceManager.inRange(step)) return |
||||||
|
this.currentStepIndex = step |
||||||
|
this.event.trigger('stepChanged', [step]) |
||||||
|
} |
||||||
|
|
||||||
|
jumpToException () { |
||||||
|
this.jumpTo(this.revertionPoint) |
||||||
|
} |
||||||
|
|
||||||
|
jumpNextBreakpoint () { |
||||||
|
// TODO: this is the same currentStepIndex var but currently coupled all the way up to EthDebuggerUI
|
||||||
|
// the trigger in updateStep is updating it in EthDebuggerUI
|
||||||
|
// the refactor should remove it
|
||||||
|
this.parent.breakpointManager.jumpNextBreakpoint(this._parent.currentStepIndex, true) |
||||||
|
} |
||||||
|
|
||||||
|
jumpPreviousBreakpoint () { |
||||||
|
this.parent.breakpointManager.jumpPreviousBreakpoint(this._parent.currentStepIndex, true) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
module.exports = DebuggerStepManager |
Loading…
Reference in new issue