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))
(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))