Skip to content

Commit b2cb044

Browse files
Very simple UtAssembleModel improver (#2678)
* Very simple UtAssembleModel improver * Use `IdentityHashMap`-based cache when mapping `UtModel`s * Improve checks for `UtAssembleModel`s created with `createInstance` method --------- Co-authored-by: IlyaMuravjov <muravjovilya@gmail.com>
1 parent 31dd74d commit b2cb044

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/mapper/UtModelSafeCastingCachingShallowMapper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package org.utbot.framework.plugin.api.mapper
22

33
import org.utbot.framework.plugin.api.UtModel
4+
import java.util.IdentityHashMap
45

56
class UtModelSafeCastingCachingShallowMapper(
67
val mapper: (UtModel) -> UtModel
78
) : UtModelMapper {
8-
private val cache = mutableMapOf<UtModel, UtModel>()
9+
private val cache = IdentityHashMap<UtModel, UtModel>()
910

1011
override fun <T : UtModel> map(model: T, clazz: Class<T>): T {
1112
val mapped = cache.getOrPut(model) { mapper(model) }

utbot-junit-contest/src/main/kotlin/org/utbot/contest/usvm/JcToUtExecutionConverter.kt

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,27 @@ import org.usvm.instrumentation.testcase.descriptor.Descriptor2ValueConverter
1717
import org.usvm.instrumentation.testcase.descriptor.UTestExceptionDescriptor
1818
import org.usvm.instrumentation.util.enclosingClass
1919
import org.usvm.instrumentation.util.enclosingMethod
20+
import org.utbot.common.isPublic
2021
import org.utbot.contest.usvm.executor.JcExecution
2122
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
23+
import org.utbot.framework.plugin.api.ClassId
2224
import org.utbot.framework.plugin.api.Coverage
2325
import org.utbot.framework.plugin.api.EnvironmentModels
2426
import org.utbot.framework.plugin.api.ExecutableId
2527
import org.utbot.framework.plugin.api.Instruction
28+
import org.utbot.framework.plugin.api.UtAssembleModel
29+
import org.utbot.framework.plugin.api.UtExecutableCallModel
2630
import org.utbot.framework.plugin.api.UtExecution
2731
import org.utbot.framework.plugin.api.UtExecutionFailure
2832
import org.utbot.framework.plugin.api.UtExecutionSuccess
2933
import org.utbot.framework.plugin.api.UtExplicitlyThrownException
3034
import org.utbot.framework.plugin.api.UtImplicitlyThrownException
3135
import org.utbot.framework.plugin.api.UtInstrumentation
36+
import org.utbot.framework.plugin.api.UtPrimitiveModel
3237
import org.utbot.framework.plugin.api.UtVoidModel
38+
import org.utbot.framework.plugin.api.mapper.UtModelDeepMapper
39+
import org.utbot.framework.plugin.api.util.executableId
40+
import org.utbot.framework.plugin.api.util.jClass
3341
import org.utbot.framework.plugin.api.util.utContext
3442
import org.utbot.fuzzer.IdGenerator
3543

@@ -40,7 +48,7 @@ class JcToUtExecutionConverter(
4048
private val jcClasspath: JcClasspath,
4149
private val idGenerator: IdGenerator<Int>,
4250
private val instructionIdProvider: InstructionIdProvider,
43-
utilMethodProvider: UtilMethodProvider,
51+
private val utilMethodProvider: UtilMethodProvider,
4452
) {
4553
private val toValueConverter = Descriptor2ValueConverter(utContext.classLoader)
4654

@@ -100,7 +108,41 @@ class JcToUtExecutionConverter(
100108
}
101109
} ?: return null
102110

103-
return utUsvmExecution
111+
return utUsvmExecution.mapModels(constructAssemblingMapper())
112+
}
113+
114+
private fun constructAssemblingMapper(): UtModelDeepMapper = UtModelDeepMapper { model ->
115+
// TODO usvm-sbft: support constructors with parameters here if it is really required
116+
// Unfortunately, it is not possible to use [AssembleModelGeneral] as it requires soot being initialized.
117+
if (model !is UtAssembleModel
118+
|| utilMethodProvider.createInstanceMethodId != model.instantiationCall.statement
119+
|| model.modificationsChain.isNotEmpty()) {
120+
return@UtModelDeepMapper model
121+
}
122+
123+
val instantiatingClassName = (model
124+
.instantiationCall
125+
.params
126+
.single() as UtPrimitiveModel).value.toString()
127+
128+
val defaultConstructor = ClassId(instantiatingClassName)
129+
.jClass
130+
.constructors
131+
.firstOrNull { it.isPublic && it.parameters.isEmpty() }
132+
133+
134+
defaultConstructor?.let { ctor ->
135+
UtAssembleModel(
136+
id = idGenerator.createId(),
137+
classId = model.classId,
138+
modelName = "",
139+
instantiationCall = UtExecutableCallModel(
140+
instance = null,
141+
executable = ctor.executableId,
142+
params = emptyList(),
143+
)
144+
)
145+
} ?: model
104146
}
105147

106148
private fun convertException(exceptionDescriptor: UTestExceptionDescriptor): Throwable =

0 commit comments

Comments
 (0)