@@ -17,19 +17,27 @@ import org.usvm.instrumentation.testcase.descriptor.Descriptor2ValueConverter
1717import org.usvm.instrumentation.testcase.descriptor.UTestExceptionDescriptor
1818import org.usvm.instrumentation.util.enclosingClass
1919import org.usvm.instrumentation.util.enclosingMethod
20+ import org.utbot.common.isPublic
2021import org.utbot.contest.usvm.executor.JcExecution
2122import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
23+ import org.utbot.framework.plugin.api.ClassId
2224import org.utbot.framework.plugin.api.Coverage
2325import org.utbot.framework.plugin.api.EnvironmentModels
2426import org.utbot.framework.plugin.api.ExecutableId
2527import org.utbot.framework.plugin.api.Instruction
28+ import org.utbot.framework.plugin.api.UtAssembleModel
29+ import org.utbot.framework.plugin.api.UtExecutableCallModel
2630import org.utbot.framework.plugin.api.UtExecution
2731import org.utbot.framework.plugin.api.UtExecutionFailure
2832import org.utbot.framework.plugin.api.UtExecutionSuccess
2933import org.utbot.framework.plugin.api.UtExplicitlyThrownException
3034import org.utbot.framework.plugin.api.UtImplicitlyThrownException
3135import org.utbot.framework.plugin.api.UtInstrumentation
36+ import org.utbot.framework.plugin.api.UtPrimitiveModel
3237import 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
3341import org.utbot.framework.plugin.api.util.utContext
3442import 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