From d87223741448e0ad851949aafce5bd0441b8b9ab Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 30 Jun 2018 22:45:49 +0100 Subject: [PATCH] dep.js: Fix the way `STATE' is handled. Use the correct global `STATE' variable throughout, rather than sometimes using a per-object `state' slot; restore it properly after changing it; and actually set the `frozen' state in `with_frozen'. How did this ever work? --- dep.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dep.js b/dep.js index d5235be..d21f94a 100644 --- a/dep.js +++ b/dep.js @@ -255,7 +255,7 @@ Dep.prototype = { * If the receiver isn't up-to-date then we synthesize the flags. */ - if (this.state === 'ready') return F_VALUE | F_DEPS; + if (STATE === 'ready') return F_VALUE | F_DEPS; else if (this._generation === GENERATION) return this.__flags; else if (this._value_function === null) return F_VALUE | F_DEPS; else return 0; @@ -394,7 +394,7 @@ Dep.prototype = { var val; - if (state === 'recomputing') { + if (STATE === 'recomputing') { if (EVALUATING) { this._dependents[EVALUATING._seq] = EVALUATING; EVALUATING._dependencies[this._seq] = this; @@ -469,8 +469,8 @@ function recompute_pending() { */ var d, f; - - state = 'recomputing'; + var old_state = STATE; + STATE = 'recomputing'; try_finally(function () { while (PENDING.length) { d = PENDING.shift(); @@ -488,6 +488,7 @@ function recompute_pending() { d = PENDING.shift(); d._value = BAD; } + STATE = old_state; }); } @@ -503,7 +504,7 @@ function with_frozen(body, delay) { */ var op, val; - var old_delayed, old_pending; + var old_delayed, old_pending, old_state; switch (STATE) { case 'frozen': @@ -516,6 +517,8 @@ function with_frozen(body, delay) { case 'ready': old_delayed = DELAYED; old_pending = PENDING; + old_state = STATE; + STATE = "frozen"; try_finally(function () { DELAYED = []; PENDING = []; @@ -530,6 +533,7 @@ function with_frozen(body, delay) { }, function () { DELAYED = old_delayed; PENDING = old_pending; + STATE = old_state; }); break; } -- 2.11.0