Skip to content

Commit 515955d

Browse files
author
Kamenev Yury
committed
Added missing num dimension constraints for generics
1 parent 2a1346b commit 515955d

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

utbot-framework/src/main/kotlin/org/utbot/engine/Memory.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,6 @@ class TypeRegistry {
431431

432432
private val genericAddrToNumDimensionsArrays = mutableMapOf<Int, UtArrayExpressionBase>()
433433

434-
@Suppress("unused")
435434
private fun genericAddrToNumDimensions(i: Int) = genericAddrToNumDimensionsArrays.getOrPut(i) {
436435
mkArrayConst(
437436
"genericAddrToNumDimensions_$i",
@@ -562,6 +561,8 @@ class TypeRegistry {
562561
*/
563562
fun symNumDimensions(addr: UtAddrExpression) = addrToNumDimensions.select(addr)
564563

564+
fun genericNumDimensions(addr: UtAddrExpression, i: Int) = genericAddrToNumDimensions(i).select(addr)
565+
565566
/**
566567
* Returns a constraint stating that number of dimensions for the given address is zero
567568
*/

utbot-framework/src/main/kotlin/org/utbot/engine/pc/Z3TranslatorVisitor.kt

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,13 @@ open class Z3TranslatorVisitor(
226226
override fun visit(expr: UtGenericExpression): Expr = expr.run {
227227
val constraints = mutableListOf<BoolExpr>()
228228
for (i in types.indices) {
229+
val symNumDimensions = translate(typeRegistry.genericNumDimensions(addr, i)) as BitVecExpr
229230
val symType = translate(typeRegistry.genericTypeId(addr, i))
231+
230232
if (types[i].leastCommonType.isJavaLangObject()) {
231233
continue
232234
}
235+
233236
val possibleBaseTypes = types[i].possibleConcreteTypes.map { it.baseType }
234237

235238
val typeConstraint = z3Context.mkOr(
@@ -241,6 +244,22 @@ open class Z3TranslatorVisitor(
241244
}.toTypedArray()
242245
)
243246
constraints += typeConstraint
247+
248+
val numDimensionsConstraint = z3Context.mkAnd(
249+
*possibleBaseTypes.map {
250+
val numDimensions = z3Context.mkBV(it.numDimensions, Int.SIZE_BITS)
251+
252+
if (it.isJavaLangObject()) {
253+
z3Context.mkBVSGE(symNumDimensions, numDimensions)
254+
} else {
255+
z3Context.mkEq(symNumDimensions, numDimensions)
256+
}
257+
}.toTypedArray()
258+
)
259+
260+
constraints += numDimensionsConstraint
261+
262+
z3Context.mkAnd(*constraints.toTypedArray())
244263
}
245264
z3Context.mkOr(
246265
z3Context.mkAnd(*constraints.toTypedArray()),
@@ -250,11 +269,19 @@ open class Z3TranslatorVisitor(
250269

251270
override fun visit(expr: UtIsGenericTypeExpression): Expr = expr.run {
252271
val symType = translate(typeRegistry.symTypeId(addr))
272+
val symNumDimensions = translate(typeRegistry.symNumDimensions(addr))
273+
253274
val genericSymType = translate(typeRegistry.genericTypeId(baseAddr, parameterTypeIndex))
254-
z3Context.mkOr(
275+
val genericNumDimensions = translate(typeRegistry.genericNumDimensions(baseAddr, parameterTypeIndex))
276+
277+
val typeConstraint = z3Context.mkOr(
255278
z3Context.mkEq(symType, genericSymType),
256279
z3Context.mkEq(translate(expr.addr), translate(nullObjectAddr))
257280
)
281+
282+
val dimensionsConstraint = z3Context.mkEq(symNumDimensions, genericNumDimensions)
283+
284+
z3Context.mkAnd(typeConstraint, dimensionsConstraint)
258285
}
259286

260287
override fun visit(expr: UtEqGenericTypeParametersExpression): Expr = expr.run {
@@ -263,6 +290,10 @@ open class Z3TranslatorVisitor(
263290
val firstSymType = translate(typeRegistry.genericTypeId(firstAddr, i))
264291
val secondSymType = translate(typeRegistry.genericTypeId(secondAddr, j))
265292
constraints += z3Context.mkEq(firstSymType, secondSymType)
293+
294+
val firstSymNumDimensions = translate(typeRegistry.genericNumDimensions(firstAddr, i))
295+
val secondSymNumDimensions = translate(typeRegistry.genericNumDimensions(secondAddr, j))
296+
constraints += z3Context.mkEq(firstSymNumDimensions, secondSymNumDimensions)
266297
}
267298
z3Context.mkAnd(*constraints.toTypedArray())
268299
}

0 commit comments

Comments
 (0)