@@ -80,7 +80,7 @@ module API =
8080 let Ref address = Ref address
8181 let Ptr baseAddress typ offset = Ptr baseAddress typ offset
8282 let HeapRef address baseType = HeapRef address baseType
83- let Union gvs = Union gvs
83+ let Ite iteType = Ite iteType
8484
8585 let True () = True()
8686 let False () = False()
@@ -426,9 +426,9 @@ module API =
426426 let index = indices [ 0 ]
427427 t , mul index ( TypeUtils.internalSizeOf t |> makeNumber )
428428 Ptr baseAddress sightType ( add offset indexOffset )
429- | Union gvs ->
429+ | Ite iteType ->
430430 let referenceArrayIndex term = ReferenceArrayIndex state term indices valueType
431- Merging.guardedMap referenceArrayIndex gvs
431+ Merging.guardedMap referenceArrayIndex iteType
432432 | _ -> internalfail $"Referencing array index : expected reference , but got { arrayRef } "
433433
434434 let ReferenceField state reference fieldId =
@@ -468,11 +468,6 @@ module API =
468468 let TryAddressFromRefFork state ref =
469469 CommonTryAddressFromRef state ref true
470470
471- let private transformBoxedRef ref =
472- match ref.term with
473- | HeapRef _ -> HeapReferenceToBoxReference ref
474- | _ -> ref
475-
476471 let ExtractAddress ref = extractAddress ref
477472 let ExtractPointerOffset ptr = extractPointerOffset ptr
478473
@@ -485,16 +480,17 @@ module API =
485480 let ReadThis state method = state.memory.ReadStackLocation ( ThisKey method)
486481 let ReadArgument state parameterInfo = state.memory.ReadStackLocation ( ParameterKey parameterInfo)
487482
488- let CommonReadField reporter state term field =
489- let doRead target =
490- match target.term with
491- | HeapRef _
492- | Ptr _
493- | Ref _ -> ReferenceField state target field |> state.memory.Read reporter
494- | Struct _ -> state.memory.ReadStruct reporter target field
495- | Combined _ -> state.memory.ReadFieldUnsafe reporter target field
496- | _ -> internalfail $" Reading field of {term}"
497- Merging.guardedApply doRead term
483+ let rec CommonReadField reporter state term field =
484+ match term.term with
485+ | HeapRef _
486+ | Ptr _
487+ | Ref _ -> ReferenceField state term field |> state.memory.Read reporter
488+ | Struct _ -> state.memory.ReadStruct reporter term field
489+ | Combined _ -> state.memory.ReadFieldUnsafe reporter term field
490+ | Ite iteType ->
491+ iteType.filter ( fun v -> True() <> IsBadRef v)
492+ |> Merging.guardedMap ( fun t -> CommonReadField reporter state t field)
493+ | _ -> internalfail $" Reading field of {term}"
498494
499495 let ReadField state term field =
500496 CommonReadField emptyReporter state term field
@@ -522,9 +518,9 @@ module API =
522518 | HeapRef( addr, typ) when state.memory.MostConcreteTypeOfHeapRef addr typ = typeof< string> ->
523519 let addr , arrayType = state.memory.StringArrayInfo addr None
524520 state.memory.ReadArrayIndex addr [ index] arrayType
525- | Union gvs ->
521+ | Ite iteType ->
526522 let readStringChar term = ReadStringChar state term index
527- Merging.guardedMap readStringChar gvs
523+ Merging.guardedMap readStringChar iteType
528524 | _ -> internalfail $" Reading string char: expected reference, but got {reference}"
529525 let ReadStaticField state typ field = state.memory.ReadStaticField typ field
530526 let ReadDelegate state reference = state.memory.ReadDelegate reference
@@ -538,16 +534,11 @@ module API =
538534
539535 let WriteStackLocation state location value = state.memory.WriteStackLocation location value
540536
541- let Write state reference value =
542- let write state reference =
543- state.memory.Write emptyReporter ( transformBoxedRef reference) value
544- Branching.guardedStatedMap write state reference
537+ let Write state reference value = state.memory.Write emptyReporter reference value
545538
546539 let WriteUnsafe ( reporter : IErrorReporter ) state reference value =
547- let write state reference =
548- reporter.ConfigureState state
549- state.memory.Write reporter reference value
550- Branching.guardedStatedMap write state reference
540+ reporter.ConfigureState state
541+ state.memory.Write reporter reference value
551542
552543 let WriteStructField structure field value = writeStruct structure field value
553544
@@ -556,13 +547,17 @@ module API =
556547 writeStruct structure field value
557548
558549 let WriteClassFieldUnsafe ( reporter : IErrorReporter ) state reference field value =
559- let write state reference =
560- reporter.ConfigureState state
561- match reference.term with
562- | HeapRef( addr, _) -> state.memory.WriteClassField addr field value
550+ let extractAddress ref =
551+ match ref.term with
552+ | HeapRef( addr, _) -> addr
563553 | _ -> internalfail $" Writing field of class: expected reference, but got {reference}"
564- state
565- Branching.guardedStatedMap write state reference
554+ reporter.ConfigureState state
555+ match reference.term with
556+ | Ite iteType ->
557+ let filtered = iteType.filter ( fun r -> Pointers.isBadRef r |> isTrue |> not )
558+ filtered.ToDisjunctiveGvs()
559+ |> List.iter ( fun ( g , r ) -> state.memory.GuardedWriteClassField ( Some g) ( extractAddress r) field value)
560+ | _ -> state.memory.WriteClassField ( extractAddress reference) field value
566561
567562 let WriteClassField state reference field value =
568563 WriteClassFieldUnsafe emptyReporter state reference field value
@@ -766,26 +761,26 @@ module API =
766761 let rec ArrayRank state arrayRef =
767762 match arrayRef.term with
768763 | HeapRef( addr, typ) -> state.memory.MostConcreteTypeOfHeapRef addr typ |> TypeUtils.rankOf |> makeNumber
769- | Union gvs -> Merging.guardedMap ( ArrayRank state) gvs
764+ | Ite iteType -> Merging.guardedMap ( ArrayRank state) iteType
770765 | _ -> internalfail $" Getting rank of array: expected ref, but got {arrayRef}"
771766
772767 let rec ArrayLengthByDimension state arrayRef index =
773768 match arrayRef.term with
774769 | HeapRef( addr, typ) ->
775770 let memory = state.memory
776771 memory.MostConcreteTypeOfHeapRef addr typ |> symbolicTypeToArrayType |> memory.ReadLength addr index
777- | Union gvs ->
772+ | Ite iteType ->
778773 let arrayLengthByDimension term = ArrayLengthByDimension state term index
779- Merging.guardedMap arrayLengthByDimension gvs
774+ Merging.guardedMap arrayLengthByDimension iteType
780775 | _ -> internalfail $" reading array length: expected heap reference, but got {arrayRef}"
781776 let rec ArrayLowerBoundByDimension state arrayRef index =
782777 match arrayRef.term with
783778 | HeapRef( addr, typ) ->
784779 let memory = state.memory
785780 memory.MostConcreteTypeOfHeapRef addr typ |> symbolicTypeToArrayType |> memory.ReadLowerBound addr index
786- | Union gvs ->
781+ | Ite iteType ->
787782 let arrayLowerBoundByDimension term = ArrayLowerBoundByDimension state term index
788- Merging.guardedMap arrayLowerBoundByDimension gvs
783+ Merging.guardedMap arrayLowerBoundByDimension iteType
789784 | _ -> internalfail $" reading array lower bound: expected heap reference, but got {arrayRef}"
790785
791786 let rec CountOfArrayElements state arrayRef =
@@ -795,7 +790,7 @@ module API =
795790 let arrayType = memory.MostConcreteTypeOfHeapRef address typ |> symbolicTypeToArrayType
796791 let lens = List.init arrayType.dimension ( fun dim -> memory.ReadLength address ( makeNumber dim) arrayType)
797792 List.fold mul ( makeNumber 1 ) lens
798- | Union gvs -> Merging.guardedMap ( CountOfArrayElements state) gvs
793+ | Ite iteType -> Merging.guardedMap ( CountOfArrayElements state) iteType
799794 | _ -> internalfail $" counting array elements: expected heap reference, but got {arrayRef}"
800795
801796 let StringLength state strRef = state.memory.LengthOfString strRef
0 commit comments