On 6/30/17 Jun 30 -10:11 AM, Faré wrote:
First, can you confirm that the compute-action-stamp called by mark-operation-done called by the perform :after method on define-op returns the correct value?
Hm. I don't see any such after method. All I see is this:
(defmethod perform ((o define-op) (s system))
...
(if-let ((pathname (first (input-files o s)))))
... This call to input-files is problematic, as it will cause the wrong value to be cached, before you recorded your input-files. Note that you might have to invalidate the cached input-files anyway, because it may already have been called by compute-action-stamp at that point.
But I meant the general perform :after method and mark-operation-done method from action.lisp.
At any rate, I'm having a hard time tracking down exactly where we determine whether or not a define-op needs redoing.
Ultimately, it boils down to (compute-action-stamp plan operation component [nil]) as called by compute-action-status in plan.lisp. And *that* will call input-files.
The caching code makes things much more efficient, but it also effectively camouflages the algorithm....
Not just "more efficient", but in some cases keeps O(n) what might be a much higher polynomial (or exponential?) when a module's input-files recursively depend on its contents (e.g. for warning checking). But yes, sometimes you need to invalidate the cache, and this looks like one of those times to me.
—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org Too many people are thinking of security instead of opportunity. They seem more afraid of life than death. — James F. Byrnes