on master help sign in
closer to the right fix. The timer can have an invalid state though
22e6655Michael James
libraries/Native/Signal/Time.js+5−4
@@ -14,12 +14,13 @@ Elm.Native.Time.make = function(elm) {
14 var msPerFrame = 1000 / desiredFPS;
14 var msPerFrame = 1000 / desiredFPS;
15 var prev = elm.timer.now(), curr = prev, diff = 0, wasOn = true;
15 var prev = elm.timer.now(), curr = prev, diff = 0, wasOn = true;
16 var ticker = NS.input(diff);
16 var ticker = NS.input(diff);
17− function tick(zero) { return function(previousTime /* =undefined */) {
17+ function tick(zero) {
18+ return function() {
18 curr = elm.timer.now();
19 curr = elm.timer.now();
19− if (previousTime) {
20− prev = previousTime;
21− }
22 diff = zero ? 0 : curr - prev;
20 diff = zero ? 0 : curr - prev;
21+ if (prev > curr) {
22+ diff = 0;
23+ }
23 prev = curr;
24 prev = curr;
24 elm.notify(ticker.id, diff);
25 elm.notify(ticker.id, diff);
25 };
26 };
runtime/Debugger.js+5−6
@@ -180,14 +180,13 @@ function debugModule(module, runtime) {
180 snapshots = snapshots.slice(0, lastSnapshotPosition + 1);
180 snapshots = snapshots.slice(0, lastSnapshotPosition + 1);
181
181
182 var lastEventTime = recordedEvents[position-1].timestep;
182 var lastEventTime = recordedEvents[position-1].timestep;
183− runtime.timer.setDelay(Date.now() - lastEventTime);
183+ var scrubTime = runtime.timer.now() - lastEventTime;
184+ runtime.timer.addDelay(scrubTime);
184
185
185 recordedEvents = recordedEvents.slice(0, position);
186 recordedEvents = recordedEvents.slice(0, position);
186 tracePath.clearTracesAfter(position);
187 tracePath.clearTracesAfter(position);
187 eventCounter = position;
188 eventCounter = position;
188− executeCallbacks(asyncCallbacks, false, lastEventTime);
189+ executeCallbacks(asyncCallbacks, false);
189− } else {
190− runtime.timer.setDelay(0);
191 }
190 }
192 tracePath.startRecording();
191 tracePath.startRecording();
193 }
192 }
@@ -491,12 +490,12 @@ function tracePathInit(runtime, signalGraphMain) {
491 }
490 }
492}
491}
493
492
494−function executeCallbacks(callbacks, reexecute, previousTime /* =undefined */) {
493+function executeCallbacks(callbacks, reexecute) {
495 callbacks.forEach(function(timer) {
494 callbacks.forEach(function(timer) {
496 if (reexecute || !timer.executed) {
495 if (reexecute || !timer.executed) {
497 var func = timer.func;
496 var func = timer.func;
498 timer.executed = true;
497 timer.executed = true;
499− func(previousTime);
498+ func();
500 }
499 }
501 });
500 });
502}
501}
runtime/Init.js+4−4
@@ -44,13 +44,13 @@ function init(display, container, module, ports, moduleToReplace) {
44 return Date.now() - inducedDelay;
44 return Date.now() - inducedDelay;
45 };
45 };
46
46
47− var setDelay = function(d) {
47+ var addDelay = function(d) {
48− inducedDelay = d;
48+ inducedDelay += d;
49 return inducedDelay;
49 return inducedDelay;
50− }
50+ };
51
51
52 return { now : now
52 return { now : now
53− , setDelay : setDelay
53+ , addDelay : addDelay
54 }
54 }
55 }();
55 }();
56
56