X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/lisp/blobdiff_plain/77f935dafbb63f1674a3df832972fda67c10e3d6..e9de36a94935ac203b8e7b210b1a4d66c3b9315e:/dep.lisp diff --git a/dep.lisp b/dep.lisp index c437538..15f6e0b 100644 --- a/dep.lisp +++ b/dep.lisp @@ -189,15 +189,16 @@ (defun recompute-dep-value (dep) We assume that DEP's dependencies are up-to-date already, and that DEP's +RECOMPUTING+ flag is set. In the former case, DEP's dependents and listeners are notified, using PROPAGATE-TO-DEPENDENTS." - (let ((winning nil) (queued (logand (dep-%flags dep) +queued+))) + (let ((winning nil) + (new-flags (logior (logand (dep-%flags dep) +queued+) + +value+ +deps+))) (flet ((update (value) (cond ((update-dep dep value) - (setf (dep-flags dep) (logior +value+ +deps+ +changed+ - queued)) + (setf (dep-flags dep) (logior new-flags +changed+)) (propagate-to-dependents dep) t) (t - (setf (dep-flags dep) (logior +value+ +deps+ queued)) + (setf (dep-flags dep) new-flags) nil)))) (unwind-protect (prog1 (update (new-dep-value dep)) (setf winning t)) @@ -228,11 +229,13 @@ (defun force-dep-value (dep) (progn (setf (dep-flags dep) flags) nil)))))) (defun %dep-value (dep) - "Do the difficult work of retrieving the current value of a DEP." + "Do the difficult work of retrieving the current value of a DEP. + + This is the unhappy path of `dep-value'." + (force-dep-value dep) (when *evaluating-dep* (pushnew (dep-weak-pointer *evaluating-dep*) (dep-dependents dep)) - (pushnew dep (dep-dependencies *evaluating-dep*))) - (force-dep-value dep)) + (pushnew dep (dep-dependencies *evaluating-dep*)))) (export 'dep-value) (declaim (inline dep-value))