@@ -28,7 +28,6 @@ import org.usvm.UBvSort
28
28
import org.usvm.UConcreteHeapRef
29
29
import org.usvm.UContext
30
30
import org.usvm.UExpr
31
- import org.usvm.UExprTransformer
32
31
import org.usvm.UHeapReading
33
32
import org.usvm.UIndexedMethodReturnValue
34
33
import org.usvm.UInputArrayLengthReading
@@ -42,18 +41,20 @@ import org.usvm.URegisterReading
42
41
import org.usvm.USizeExpr
43
42
import org.usvm.USort
44
43
import org.usvm.USymbol
44
+ import org.usvm.UTransformer
45
45
import org.usvm.uctx
46
46
47
- class USoftConstraintsProvider <Field , Type >(ctx : UContext ) : UExprTransformer <Field, Type>(ctx) {
47
+ class USoftConstraintsProvider <Field , Type >(override val ctx : UContext ) : UTransformer <Field, Type> {
48
48
// We have a list here since sometimes we want to add several soft constraints
49
49
// to make it possible to drop only a part of them, not the whole soft constraint
50
- private val caches = hashMapOf<UExpr <* >, Set <UBoolExpr >>().withDefault { emptySet() }
50
+ private val caches = hashMapOf<UExpr <* >, Set <UBoolExpr >>()
51
51
private val sortPreferredValuesProvider = SortPreferredValuesProvider ()
52
52
53
- fun provide (initialExpr : UExpr <* >): Set <UBoolExpr > {
54
- apply (initialExpr)
55
- return caches.getValue(initialExpr)
56
- }
53
+ fun provide (initialExpr : UExpr <* >): Set <UBoolExpr > =
54
+ caches.getOrElse(initialExpr) {
55
+ apply (initialExpr)
56
+ caches.getOrPut(initialExpr, ::emptySet)
57
+ }
57
58
58
59
// region The most common methods
59
60
@@ -62,13 +63,11 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
62
63
}
63
64
64
65
override fun <T : KSort , A : KSort > transformApp (expr : KApp <T , A >): KExpr <T > =
65
- transformExprAfterTransformed(expr, expr.args) { args ->
66
- computeSideEffect(expr) {
67
- val nestedConstraints = args.flatMapTo(mutableSetOf ()) { caches.getValue(it) }
68
- val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
66
+ computeSideEffect(expr) {
67
+ val nestedConstraints = expr.args.flatMapTo(mutableSetOf (), ::provide)
68
+ val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
69
69
70
- caches[expr] = nestedConstraints + selfConstraint
71
- }
70
+ caches[expr] = nestedConstraints + selfConstraint
72
71
}
73
72
74
73
private fun <Sort : USort > transformAppIfPossible (expr : UExpr <Sort >): UExpr <Sort > =
@@ -101,37 +100,31 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
101
100
102
101
override fun transform (expr : UNullRef ): UExpr <UAddressSort > = expr
103
102
104
- override fun transform (expr : UIsSubtypeExpr <Type >): UBoolExpr =
105
- error(" Illegal operation since UIsExpr should not be translated into a SMT solver" )
103
+ override fun transform (expr : UIsSubtypeExpr <Type >): UBoolExpr = expr
106
104
107
- override fun transform (expr : UIsSupertypeExpr <Type >): UBoolExpr =
108
- error(" Illegal operation since UIsExpr should not be translated into a SMT solver" )
105
+ override fun transform (expr : UIsSupertypeExpr <Type >): UBoolExpr = expr
109
106
110
107
override fun transform (
111
108
expr : UInputArrayLengthReading <Type >,
112
- ): USizeExpr = transformExprAfterTransformed(expr, expr.address) {
113
- computeSideEffect(expr) {
114
- with (expr.ctx) {
115
- val addressIsNull = caches.getValue(expr.address)
116
- val arraySize = mkBvSignedLessOrEqualExpr(expr, PREFERRED_MAX_ARRAY_SIZE .toBv())
109
+ ): USizeExpr = computeSideEffect(expr) {
110
+ with (expr.ctx) {
111
+ val addressIsNull = provide(expr.address)
112
+ val arraySize = mkBvSignedLessOrEqualExpr(expr, PREFERRED_MAX_ARRAY_SIZE .toBv())
117
113
118
- caches[expr] = addressIsNull + arraySize
119
- }
114
+ caches[expr] = addressIsNull + arraySize
120
115
}
121
116
}
122
117
123
118
override fun <Sort : USort > transform (
124
119
expr : UInputArrayReading <Type , Sort >,
125
- ): UExpr <Sort > = transformExprAfterTransformed(expr, expr.index, expr.address) { _, _ ->
126
- computeSideEffect(expr) {
127
- val constraints = mutableSetOf<UBoolExpr >()
120
+ ): UExpr <Sort > = computeSideEffect(expr) {
121
+ val constraints = mutableSetOf<UBoolExpr >()
128
122
129
- constraints + = caches.getValue (expr.index)
130
- constraints + = caches.getValue (expr.address)
131
- constraints + = expr.sort.accept(sortPreferredValuesProvider)(expr)
123
+ constraints + = provide (expr.index)
124
+ constraints + = provide (expr.address)
125
+ constraints + = expr.sort.accept(sortPreferredValuesProvider)(expr)
132
126
133
- caches[expr] = constraints
134
- }
127
+ caches[expr] = constraints
135
128
}
136
129
137
130
override fun <Sort : USort > transform (expr : UAllocatedArrayReading <Type , Sort >): UExpr <Sort > =
@@ -143,23 +136,19 @@ class USoftConstraintsProvider<Field, Type>(ctx: UContext) : UExprTransformer<Fi
143
136
private fun <Sort : USort > readingWithSingleArgumentTransform (
144
137
expr : UHeapReading <* , * , Sort >,
145
138
arg : UExpr <* >,
146
- ): UExpr <Sort > = transformExprAfterTransformed(expr, arg) { _ ->
147
- computeSideEffect(expr) {
148
- val argConstraint = caches.getValue(arg)
149
- val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
139
+ ): UExpr <Sort > = computeSideEffect(expr) {
140
+ val argConstraint = provide(arg)
141
+ val selfConstraint = expr.sort.accept(sortPreferredValuesProvider)(expr)
150
142
151
- caches[expr] = argConstraint + selfConstraint
152
- }
143
+ caches[expr] = argConstraint + selfConstraint
153
144
}
154
145
155
146
// region KExpressions
156
147
157
148
override fun <T : KBvSort > transform (expr : KBvSignedLessOrEqualExpr <T >): KExpr <KBoolSort > = with (expr.ctx) {
158
- transformExprAfterTransformed(expr, expr.arg0, expr.arg1) { lhs, rhs ->
159
- computeSideEffect(expr) {
160
- val selfConstraint = mkEq(lhs, rhs)
161
- caches[expr] = mutableSetOf (selfConstraint) + caches.getValue(lhs) + caches.getValue(rhs)
162
- }
149
+ computeSideEffect(expr) {
150
+ val selfConstraint = mkEq(expr.arg0, expr.arg1)
151
+ caches[expr] = mutableSetOf (selfConstraint) + provide(expr.arg0) + provide(expr.arg1)
163
152
}
164
153
}
165
154
0 commit comments