Skip to content

Very simple UtAssembleModel improver #2678

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package org.utbot.framework.plugin.api.mapper

import org.utbot.framework.plugin.api.UtModel
import java.util.IdentityHashMap

class UtModelSafeCastingCachingShallowMapper(
val mapper: (UtModel) -> UtModel
) : UtModelMapper {
private val cache = mutableMapOf<UtModel, UtModel>()
private val cache = IdentityHashMap<UtModel, UtModel>()

override fun <T : UtModel> map(model: T, clazz: Class<T>): T {
val mapped = cache.getOrPut(model) { mapper(model) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,27 @@ import org.usvm.instrumentation.testcase.descriptor.Descriptor2ValueConverter
import org.usvm.instrumentation.testcase.descriptor.UTestExceptionDescriptor
import org.usvm.instrumentation.util.enclosingClass
import org.usvm.instrumentation.util.enclosingMethod
import org.utbot.common.isPublic
import org.utbot.contest.usvm.executor.JcExecution
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.Coverage
import org.utbot.framework.plugin.api.EnvironmentModels
import org.utbot.framework.plugin.api.ExecutableId
import org.utbot.framework.plugin.api.Instruction
import org.utbot.framework.plugin.api.UtAssembleModel
import org.utbot.framework.plugin.api.UtExecutableCallModel
import org.utbot.framework.plugin.api.UtExecution
import org.utbot.framework.plugin.api.UtExecutionFailure
import org.utbot.framework.plugin.api.UtExecutionSuccess
import org.utbot.framework.plugin.api.UtExplicitlyThrownException
import org.utbot.framework.plugin.api.UtImplicitlyThrownException
import org.utbot.framework.plugin.api.UtInstrumentation
import org.utbot.framework.plugin.api.UtPrimitiveModel
import org.utbot.framework.plugin.api.UtVoidModel
import org.utbot.framework.plugin.api.mapper.UtModelDeepMapper
import org.utbot.framework.plugin.api.util.executableId
import org.utbot.framework.plugin.api.util.jClass
import org.utbot.framework.plugin.api.util.utContext
import org.utbot.fuzzer.IdGenerator

Expand All @@ -38,7 +46,7 @@ class JcToUtExecutionConverter(
private val jcExecution: JcExecution,
private val idGenerator: IdGenerator<Int>,
private val instructionIdProvider: InstructionIdProvider,
utilMethodProvider: UtilMethodProvider,
private val utilMethodProvider: UtilMethodProvider,
) {
private val toValueConverter = Descriptor2ValueConverter(utContext.classLoader)

Expand Down Expand Up @@ -98,7 +106,41 @@ class JcToUtExecutionConverter(
}
} ?: return null

return utUsvmExecution
return utUsvmExecution.mapModels(constructAssemblingMapper())
}

private fun constructAssemblingMapper(): UtModelDeepMapper = UtModelDeepMapper { model ->
// TODO usvm-sbft: support constructors with parameters here if it is really required
// Unfortunately, it is not possible to use [AssembleModelGeneral] as it requires soot being initialized.
if (model !is UtAssembleModel
|| utilMethodProvider.createInstanceMethodId != model.instantiationCall.statement
|| model.modificationsChain.isNotEmpty()) {
return@UtModelDeepMapper model
}

val instantiatingClassName = (model
.instantiationCall
.params
.single() as UtPrimitiveModel).value.toString()

val defaultConstructor = ClassId(instantiatingClassName)
.jClass
.constructors
.firstOrNull { it.isPublic && it.parameters.isEmpty() }


defaultConstructor?.let { ctor ->
UtAssembleModel(
id = idGenerator.createId(),
classId = model.classId,
modelName = "",
instantiationCall = UtExecutableCallModel(
instance = null,
executable = ctor.executableId,
params = emptyList(),
)
)
} ?: model
}

private fun convertException(exceptionDescriptor: UTestExceptionDescriptor): Throwable =
Expand Down