@@ -203,10 +203,10 @@ object evaluator extends EvaluationRules {
203
203
204
204
case fa : ast.FieldAccess if s.qpFields.contains(fa.field) =>
205
205
eval(s, fa.rcv, pve, v)((s1, tRcvr, eRcvr, v1) => {
206
- val debugOldLabel = v1.getDebugOldLabel(s1)
206
+ val (debugHeapName, debugLabel) = v1.getDebugOldLabel(s1, fa.pos )
207
207
val newFa = Option .when(withExp)({
208
208
if (s1.isEvalInOld) ast.FieldAccess (eRcvr.get, fa.field)(fa.pos, fa.info, fa.errT)
209
- else ast.DebugLabelledOld (ast.FieldAccess (eRcvr.get, fa.field)(), debugOldLabel )(fa.pos, fa.info, fa.errT)
209
+ else ast.DebugLabelledOld (ast.FieldAccess (eRcvr.get, fa.field)(), debugLabel )(fa.pos, fa.info, fa.errT)
210
210
})
211
211
val (relevantChunks, _) =
212
212
quantifiedChunkSupporter.splitHeap[QuantifiedFieldChunk ](s1.h, BasicChunkIdentifier (fa.field.name))
@@ -230,7 +230,7 @@ object evaluator extends EvaluationRules {
230
230
val fvfLookup = Lookup (fa.field.name, fvfDef.sm, tRcvr)
231
231
val fr1 = s1.functionRecorder.recordSnapshot(fa, v1.decider.pcs.branchConditions, fvfLookup)
232
232
val s2 = s1.copy(functionRecorder = fr1)
233
- val s3 = if (Verifier .config.enableDebugging() && ! s2.isEvalInOld) s2.copy(oldHeaps = s2.oldHeaps + (debugOldLabel -> magicWandSupporter.getEvalHeap(s2))) else s2
233
+ val s3 = if (Verifier .config.enableDebugging() && ! s2.isEvalInOld) s2.copy(oldHeaps = s2.oldHeaps + (debugHeapName -> magicWandSupporter.getEvalHeap(s2))) else s2
234
234
Q (s3, fvfLookup, newFa, v1)
235
235
} else {
236
236
val toAssert = IsPositive (totalPermissions.replace(`?r`, tRcvr))
@@ -245,7 +245,7 @@ object evaluator extends EvaluationRules {
245
245
else
246
246
s1.possibleTriggers
247
247
val s2 = s1.copy(functionRecorder = fr1, possibleTriggers = possTriggers)
248
- val s3 = if (Verifier .config.enableDebugging() && ! s2.isEvalInOld) s2.copy(oldHeaps = s2.oldHeaps + (debugOldLabel -> magicWandSupporter.getEvalHeap(s2))) else s2
248
+ val s3 = if (Verifier .config.enableDebugging() && ! s2.isEvalInOld) s2.copy(oldHeaps = s2.oldHeaps + (debugHeapName -> magicWandSupporter.getEvalHeap(s2))) else s2
249
249
Q (s3, fvfLookup, newFa, v1)}
250
250
}
251
251
case _ =>
@@ -317,12 +317,12 @@ object evaluator extends EvaluationRules {
317
317
chunkSupporter.lookup(s1, s1.h, resource, tArgs, eArgs, ve, v1)((s2, h2, tSnap, v2) => {
318
318
val fr = s2.functionRecorder.recordSnapshot(fa, v2.decider.pcs.branchConditions, tSnap)
319
319
val s3 = s2.copy(h = h2, functionRecorder = fr)
320
- val debugOldLabel = v2.getDebugOldLabel(s3)
320
+ val (debugHeapName, debugLabel) = v2.getDebugOldLabel(s3, fa.pos )
321
321
val newFa = Option .when(withExp)({
322
322
if (s3.isEvalInOld) ast.FieldAccess (eArgs.get.head, fa.field)(e.pos, e.info, e.errT)
323
- else ast.DebugLabelledOld (ast.FieldAccess (eArgs.get.head, fa.field)(), debugOldLabel )(e.pos, e.info, e.errT)
323
+ else ast.DebugLabelledOld (ast.FieldAccess (eArgs.get.head, fa.field)(), debugLabel )(e.pos, e.info, e.errT)
324
324
})
325
- val s4 = if (Verifier .config.enableDebugging() && ! s3.isEvalInOld) s3.copy(oldHeaps = s3.oldHeaps + (debugOldLabel -> magicWandSupporter.getEvalHeap(s3))) else s3
325
+ val s4 = if (Verifier .config.enableDebugging() && ! s3.isEvalInOld) s3.copy(oldHeaps = s3.oldHeaps + (debugHeapName -> magicWandSupporter.getEvalHeap(s3))) else s3
326
326
Q (s4, tSnap, newFa, v1)
327
327
})
328
328
})
@@ -340,11 +340,15 @@ object evaluator extends EvaluationRules {
340
340
Q (s1, t0, e0New.map(ast.Old (_)(e.pos, e.info, e.errT)), v1))
341
341
342
342
case old@ ast.DebugLabelledOld (e0, lbl) =>
343
- s.oldHeaps.get(lbl) match {
343
+ val heapName = if (lbl.contains(" #" ))
344
+ lbl.substring(0 , lbl.indexOf(" #" ))
345
+ else
346
+ lbl
347
+ s.oldHeaps.get(heapName) match {
344
348
case None =>
345
- createFailure(pve dueTo LabelledStateNotReached (ast.LabelledOld (e0, lbl )(old.pos, old.info, old.errT)), v, s, " labelled state reached" )
349
+ createFailure(pve dueTo LabelledStateNotReached (ast.LabelledOld (e0, heapName )(old.pos, old.info, old.errT)), v, s, " labelled state reached" )
346
350
case _ =>
347
- evalInOldState(s, lbl , e0, pve, v)((s1, t0, _, v1) =>
351
+ evalInOldState(s, heapName , e0, pve, v)((s1, t0, _, v1) =>
348
352
Q (s1, t0, Some (old), v1))
349
353
}
350
354
@@ -581,9 +585,11 @@ object evaluator extends EvaluationRules {
581
585
}
582
586
val currentPermAmount = PermLookup (field.name, pmDef.pm, args.head)
583
587
v1.decider.prover.comment(s " perm( $resacc) ~~> assume upper permission bound " )
584
- val exp = Option .when(withExp)(ast.PermLeCmp (ast.DebugLabelledOld (ast.CurrentPerm (resacc)(), v1.getDebugOldLabel(s2))(), ast.FullPerm ()())())
588
+ val (debugHeapName, debugLabel) = v1.getDebugOldLabel(s2, resacc.pos, Some (h))
589
+ val exp = Option .when(withExp)(ast.PermLeCmp (ast.DebugLabelledOld (ast.CurrentPerm (resacc)(), debugLabel)(), ast.FullPerm ()())())
585
590
v1.decider.assume(PermAtMost (currentPermAmount, FullPerm ), exp, exp.map(s2.substituteVarsInExp(_)))
586
- (s2, currentPermAmount)
591
+ val s3 = if (Verifier .config.enableDebugging()) s2.copy(oldHeaps = s2.oldHeaps + (debugHeapName -> h)) else s2
592
+ (s3, currentPermAmount)
587
593
588
594
case predicate : ast.Predicate =>
589
595
val (relevantChunks, _) =
@@ -1102,7 +1108,6 @@ object evaluator extends EvaluationRules {
1102
1108
val assertExpNew = Option .when(withExp)(ast.GeCmp (esNew.get(1 ), ast.IntLit (0 )())(e1.pos, e1.info, e1.errT))
1103
1109
v1.decider.assert(AtLeast (t1, IntLiteral (0 ))) {
1104
1110
case true =>
1105
- val assertExp2 = Option .when(withExp)(ast.LtCmp (e1, ast.SeqLength (e0)())(e1.pos, e1.info, e1.errT))
1106
1111
val assertExp2New = Option .when(withExp)(ast.LtCmp (esNew.get(1 ), ast.SeqLength (esNew.get(0 ))())(e1.pos, e1.info, e1.errT))
1107
1112
v1.decider.assert(Less (t1, SeqLength (t0))) {
1108
1113
case true =>
0 commit comments