@@ -40,7 +40,7 @@ module API =
4040 let GuardedApplyExpression term f = Merging.guardedApply f term
4141 let GuardedStatedApplyStatementK state term f k = Branching.guardedStatedApplyk f state term k
4242 let GuardedStatedApplyk f state term mergeStates k =
43- Branching.commonGuardedStatedApplyk f state term false mergeStates k
43+ Branching.commonGuardedStatedApplyk f state term mergeStates k
4444
4545 let ReleaseBranches () = Branching.branchesReleased <- true
4646 let AcquireBranches () = Branching.branchesReleased <- false
@@ -81,10 +81,6 @@ module API =
8181 let Ptr baseAddress typ offset = Ptr baseAddress typ offset
8282 let HeapRef address baseType = HeapRef address baseType
8383 let Ite iteType = Ite iteType
84- let ConditionFilter term condition =
85- match term.term with
86- | Ite iteType -> iteType.ConditionFilter condition |> Merging.merge
87- | _ -> term
8884
8985 let True () = True()
9086 let False () = False()
@@ -543,20 +539,12 @@ module API =
543539
544540 let WriteStackLocation state location value = state.memory.WriteStackLocation location value
545541
546- let Write state reference value =
547- let write state reference =
548- state.memory.Write emptyReporter ( transformBoxedRef reference) value
549- Branching.guardedStatedMap write state reference
542+ let Write state reference value = state.memory.Write emptyReporter reference value
543+
550544
551545 let WriteUnsafe ( reporter : IErrorReporter ) state reference value =
552- let filteredRef =
553- match reference.term with
554- | Ite iteType -> iteType.filter ( fun v -> True() <> IsBadRef v) |> Merging.merge
555- | _ -> reference
556- let write state reference =
557- reporter.ConfigureState state
558- state.memory.Write reporter reference value
559- Branching.disjunctiveGuardedStatedMap write state filteredRef
546+ reporter.ConfigureState state
547+ state.memory.WriteUnsafe reporter reference value
560548
561549 let WriteStructField structure field value = writeStruct structure field value
562550
@@ -565,13 +553,17 @@ module API =
565553 writeStruct structure field value
566554
567555 let WriteClassFieldUnsafe ( reporter : IErrorReporter ) state reference field value =
568- let write state reference =
569- reporter.ConfigureState state
570- match reference.term with
571- | HeapRef( addr, _) -> state.memory.WriteClassField addr field value
556+ let extractAddress ref =
557+ match ref.term with
558+ | HeapRef( addr, _) -> addr
572559 | _ -> internalfail $" Writing field of class: expected reference, but got {reference}"
573- state
574- Branching.guardedStatedMap write state reference
560+ reporter.ConfigureState state
561+ match reference.term with
562+ | Ite iteType ->
563+ let filtered = iteType.filter ( fun r -> Pointers.isBadRef r |> isTrue |> not )
564+ filtered.ToDisjunctiveGvs()
565+ |> List.iter ( fun ( g , r ) -> state.memory.GuardedWriteClassField ( Some g) ( extractAddress r) field value)
566+ | _ -> state.memory.WriteClassField ( extractAddress reference) field value
575567
576568 let WriteClassField state reference field value =
577569 WriteClassFieldUnsafe emptyReporter state reference field value
0 commit comments