From 43e39ca4a1d54a5e16714577d6925cf11550f6b9 Mon Sep 17 00:00:00 2001 From: Grigorii Kirgizov Date: Tue, 28 Jul 2020 12:46:30 +0300 Subject: [PATCH] Clear LogicalState for occurrences dropped during incremental invalidation --- .../core/internal/ConstraintsProcessing.kt | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt index b4f2164e..f0bbd99f 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt @@ -64,9 +64,8 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di fun activateContinue(controller: Controller, activeOcc: Occurrence, parent: MatchJournal.MatchChunk): FeedbackStatus { assert(activeOcc.stored) - // Forget that occ was seen. Otherwise it will be + // Forget that occurrence was seen. Otherwise it will be // processed as with reactivation through observers. - // Incremental reactivation should proceed more like usual activation. this.dispatchingFront = dispatchingFront.forgetExpanded(activeOcc) trace.activateContinue(activeOcc) @@ -113,10 +112,10 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di } private fun invalidateChunk(chunk: MatchJournal.Chunk, invalidJustifications: Collection): Iterable { - // 'Undo' all activated in this chunk occurrences - // todo: need clearing observers in logicalState for occurrences we drop? + // 'Undo' all activated in this chunk occurrences: clear Dispatcher & LogicalState chunk.activatedLog().forEach { dispatchingFront = dispatchingFront.forget(it) + it.clearLogicalState(logicalState) } val validOccs: Sequence @@ -339,9 +338,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di profiler.profile("terminateOccurrence") { - occ.terminate(logicalState) - - occurrenceContractObserver?.onDiscarded(occ) + occ.clearLogicalState(logicalState) } @@ -351,6 +348,13 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di } } + private fun Occurrence.clearLogicalState(observable: LogicalStateObservable) { + terminate(logicalState) + if (occurrenceContractObserver != null && this.isPrincipal) { + occurrenceContractObserver.onDiscarded(this) + } + } + /** * Incapsulates logic for deriving [Evidence] and [Justifications] for a new [Occurrence].