on master help sign in
Debugger with forward stepping.
commit73e6bc293b2959a13860b7780cde779886c49a90 authorLaszlo Pandy <laszlo.pandy@prezi.com> dateFri 19 Jul 2013, 17:46 (13 years ago) parentd1b3989
1 file changed+48−34
runtime/Debugger.js+48−34
runtime/Debugger.js+48−34
@@ -13,32 +13,36 @@ Elm.debuggerInit = function(module) {
1313
1414Elm.debuggerReset = function() {
1515 staticDebugger.reset();
16−}
17−
18−Elm.debuggerRecord = function() {
19− staticDebugger.startRecording();
20−}
16+};
2117
22−Elm.debuggerPlayback = function() {
23− staticDebugger.stopRecording();
24−}
18+Elm.debuggerRestart = function() {
19+ staticDebugger.restart();
20+};
2521
22+Elm.debuggerStep = function() {
23+ staticDebugger.step();
24+};
2625
2726function debuggerInit(module, elm) {
28− var State = { OFF: 0, RECORDING: 1, PLAYBACK: 2 };
29− var debuggerState = State.RUNNING;
3027
28+ var programPaused = false;
3129 var allNodes = null;
32− var initialProgramState = null;
30+
3331 var recordedEvents = [];
3432 var asyncTimers = [];
33+ var initialProgramState = {
34+ nodeValues: [],
35+ asyncTimers: []
36+ };
3537
3638 function wrapNotify(id, v) {
3739 var timestep = Date.now();
38− if (debuggerState != State.PLAYBACK) {
39− elm.notify(id, v, timestep);
40+
41+ if (programPaused) {
42+ // ignore notify because we are stepping
4043 }
41− if (debuggerState == State.RECORDING) {
44+ else {
45+ elm.notify(id, v, timestep);
4246 recordEvent(id, v, timestep);
4347 }
4448 };
@@ -49,37 +53,46 @@ function debuggerInit(module, elm) {
4953
5054 function safeSetTimeout(func, delayMs) {
5155 var timerId = setTimeout(func, delayMs);
52− asyncTimers.push(timerId);
56+ asyncTimers.push({ func:func, delayMs:delayMs, timerId:timerId });
5357 return timerId;
5458 }
5559
5660 function recordEvent(id, v, timestep) {
57− recordedEvents.push([id, v, timestep]);
61+ recordedEvents.push({ id:id, value:v, timestep:timestep });
5862 }
5963
6064 function resetProgram() {
6165 clearAsyncEvents();
62− restoreProgramState(allNodes, initialProgramState);
66+ restoreNodeValues(allNodes, initialProgramState.nodeValues);
6367 redrawGraphics();
6468 }
6569
66− function startRecording() {
67− clearAsyncEvents();
68− restoreProgramState(allNodes, initialProgramState);
69− debuggerState = State.RECORDING;
70+ function restartProgram() {
71+ resetProgram();
7072 recordedEvents = [];
73+ initialProgramState.asyncTimers.forEach(function(timer) {
74+ var func = timer.func;
75+ func();
76+ });
7177 }
7278
73− function stopRecording() {
74− clearAsyncEvents();
75− restoreProgramState(allNodes, initialProgramState);
76− debuggerState = State.PLAYBACK;
77− doPlayback(recordedEvents);
79+ function stepRecording() {
80+ 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;
89+ resetProgram();
90+ }
7891 }
7992
8093 function clearAsyncEvents() {
81− asyncTimers.forEach(function(id) {
82− clearTimeout(id);
94+ asyncTimers.forEach(function(timer) {
95+ clearTimeout(timer.timerId);
8396 });
8497 }
8598
@@ -115,13 +128,14 @@ function debuggerInit(module, elm) {
115128 moduleRetValue: moduleRetValue,
116129
117130 // debugger functions
118− startRecording: startRecording,
119− stopRecording: stopRecording,
120− reset: resetProgram
131+ reset: resetProgram,
132+ restart: restartProgram,
133+ step: stepRecording
121134 };
122135
123136 allNodes = flattenNodes(wrappedElm.inputs);
124− initialProgramState = saveProgramState(allNodes);
137+ initialProgramState.nodeValues = saveNodeValues(allNodes);
138+ initialProgramState.asyncTimers = asyncTimers.slice();
125139
126140 return elmDebugger;
127141};
@@ -134,7 +148,7 @@ function assert(bool, msg) {
134148 }
135149}
136150
137−function saveProgramState(allNodes) {
151+function saveNodeValues(allNodes) {
138152 var nodeValues = [];
139153
140154 allNodes.forEach(function(node) {
@@ -145,7 +159,7 @@ function saveProgramState(allNodes) {
145159};
146160
147161
148−function restoreProgramState(allNodes, nodeStates) {
162+function restoreNodeValues(allNodes, nodeStates) {
149163 assert(allNodes.length == nodeStates.length, "saved program state has wrong length");
150164 for (var i=0; i < allNodes.length; i++) {
151165 var node = allNodes[i];