@@ -20,6 +20,7 @@ import viper.silicon.{Map, Stack}
2020final case class State (g : Store = Store (),
2121 h : Heap = Heap (),
2222 program : ast.Program ,
23+ currentMember : Option [ast.Member ],
2324 predicateData : Map [ast.Predicate , PredicateData ],
2425 functionData : Map [ast.Function , FunctionData ],
2526 oldHeaps : OldHeaps = Map .empty,
@@ -64,13 +65,19 @@ final case class State(g: Store = Store(),
6465 /* TODO: Isn't this data stable, i.e. fully known after a preprocessing step? If so, move it to the appropriate supporter. */
6566 predicateSnapMap : Map [ast.Predicate , terms.Sort ] = Map .empty,
6667 predicateFormalVarMap : Map [ast.Predicate , Seq [terms.Var ]] = Map .empty,
67- isMethodVerification : Boolean = false ,
6868 retryLevel : Int = 0 ,
6969 /* ast.Field, ast.Predicate, or MagicWandIdentifier */
7070 heapDependentTriggers : InsertionOrderedSet [Any ] = InsertionOrderedSet .empty,
7171 moreCompleteExhale : Boolean = false )
7272 extends Mergeable [State ] {
7373
74+ val isMethodVerification : Boolean = {
75+ // currentMember being None means we're verifying a CFG; this should behave like verifying a method.
76+ currentMember.isEmpty || currentMember.get.isInstanceOf [ast.Method ]
77+ }
78+
79+ val isLastRetry : Boolean = retryLevel == 0
80+
7481 def incCycleCounter (m : ast.Predicate ) =
7582 if (recordVisited) copy(visited = m :: visited)
7683 else this
@@ -128,7 +135,7 @@ object State {
128135 def merge (s1 : State , s2 : State ): State = {
129136 s1 match {
130137 /* Decompose state s1 */
131- case State (g1, h1, program,
138+ case State (g1, h1, program, member,
132139 predicateData,
133140 functionData,
134141 oldHeaps1,
@@ -148,13 +155,13 @@ object State {
148155 reserveHeaps1, reserveCfgs1, conservedPcs1, recordPcs1, exhaleExt1,
149156 ssCache1, hackIssue387DisablePermissionConsumption1,
150157 qpFields1, qpPredicates1, qpMagicWands1, smCache1, pmCache1, smDomainNeeded1,
151- predicateSnapMap1, predicateFormalVarMap1, hack, retryLevel, useHeapTriggers,
158+ predicateSnapMap1, predicateFormalVarMap1, retryLevel, useHeapTriggers,
152159 moreCompleteExhale) =>
153160
154161 /* Decompose state s2: most values must match those of s1 */
155162 s2 match {
156163 case State (`g1`, `h1`,
157- `program`,
164+ `program`, `member`,
158165 `predicateData`, `functionData`,
159166 `oldHeaps1`,
160167 `parallelizeBranches1`,
@@ -173,7 +180,7 @@ object State {
173180 `reserveHeaps1`, `reserveCfgs1`, `conservedPcs1`, `recordPcs1`, `exhaleExt1`,
174181 ssCache2, `hackIssue387DisablePermissionConsumption1`,
175182 `qpFields1`, `qpPredicates1`, `qpMagicWands1`, smCache2, pmCache2, `smDomainNeeded1`,
176- `predicateSnapMap1`, `predicateFormalVarMap1`, `hack`, ` retryLevel`, `useHeapTriggers`,
183+ `predicateSnapMap1`, `predicateFormalVarMap1`, `retryLevel`, `useHeapTriggers`,
177184 moreCompleteExhale2) =>
178185
179186 val functionRecorder3 = functionRecorder1.merge(functionRecorder2)
0 commit comments