on master help sign in
Debugger with forward and backward seeking.
d87bc08Laszlo Pandy
runtime/Debugger.js+33−12
@@ -19,8 +19,12 @@ Elm.debuggerRestart = function() {
19 staticDebugger.restart();
19 staticDebugger.restart();
20};
20};
21
21
22−Elm.debuggerStep = function() {
22+Elm.debuggerGetMaxSteps = function() {
23+ return staticDebugger.getMaxSteps();
24+};
25+
26+Elm.debuggerStepTo = function(index) {
23− staticDebugger.step();
27+ staticDebugger.stepTo(index);
24};
28};
25
29
26function debuggerInit(module, elm) {
30function debuggerInit(module, elm) {
@@ -29,6 +33,7 @@ function debuggerInit(module, elm) {
29 var allNodes = null;
33 var allNodes = null;
30
34
31 var recordedEvents = [];
35 var recordedEvents = [];
36+ var eventCounter = 0;
32 var asyncTimers = [];
37 var asyncTimers = [];
33 var initialProgramState = {
38 var initialProgramState = {
34 nodeValues: [],
39 nodeValues: [],
@@ -76,18 +81,33 @@ function debuggerInit(module, elm) {
76 });
81 });
77 }
82 }
78
83
79− function stepRecording() {
84+ function gotoStep(index) {
80− if (programPaused) {
85+ if (!programPaused) {
81− if (recordedEvents.length > 0) {
82− var nextEvent = recordedEvents.shift();
83− elm.notify(nextEvent.id, nextEvent.value, nextEvent.timestep);
84− }
85− }
86− else {
87− // move into stepping mode
88 programPaused = true;
86 programPaused = true;
89 resetProgram();
87 resetProgram();
90 }
88 }
89+
90+ if (index < 0 || index >= recordedEvents.length) {
91+ throw "Index out of bounds: " + index;
92+ }
93+
94+ if (index < eventCounter) {
95+ resetProgram();
96+ eventCounter = 0;
97+ }
98+
99+ assert(index >= eventCounter, "index must be bad");
100+ while (eventCounter < index) {
101+ var nextEvent = recordedEvents[eventCounter];
102+ elm.notify(nextEvent.id, nextEvent.value, nextEvent.timestep);
103+
104+ eventCounter += 1;
105+ }
106+ assert(eventCounter == index, "while loop didnt' work");
107+ }
108+
109+ function getMaxSteps() {
110+ return recordedEvents.length - 1;
91 }
111 }
92
112
93 function clearAsyncEvents() {
113 function clearAsyncEvents() {
@@ -130,7 +150,8 @@ function debuggerInit(module, elm) {
130 // debugger functions
150 // debugger functions
131 reset: resetProgram,
151 reset: resetProgram,
132 restart: restartProgram,
152 restart: restartProgram,
133− step: stepRecording
153+ getMaxSteps: getMaxSteps,
154+ stepTo: gotoStep
134 };
155 };
135
156
136 allNodes = flattenNodes(wrappedElm.inputs);
157 allNodes = flattenNodes(wrappedElm.inputs);