Skip to content

Commit 271dfac

Browse files
committed
Debug commit
1 parent fcc0e0e commit 271dfac

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

usvm-ts/src/main/kotlin/org/usvm/machine/expr/TsExprResolver.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,11 +558,18 @@ class TsExprResolver(
558558
return mkBvToFpExpr(fp64Sort, fpRoundingModeSortDefaultValue(), expr.asExpr(sizeSort), signed = true)
559559
}
560560

561-
val lValue = UFieldLValue(addressSort, instanceRef, value.field)
561+
val fieldType = scene.fieldLookUp(value.field).type
562+
val sort = typeToSort(fieldType)
563+
val lValue = UFieldLValue(sort, instanceRef, value.field.name)
562564
val expr = scope.calcOnState { memory.read(lValue) }
563565

566+
val fakeExpr = expr.toFakeObject(scope)
567+
568+
val fieldLValue = UFieldLValue(addressSort, instanceRef, value.field.name)
569+
scope.calcOnState { memory.write(fieldLValue, fakeExpr, guard = trueExpr) }
570+
564571
if (assertIsSubtype(expr, value.type)) {
565-
expr
572+
fakeExpr
566573
} else {
567574
null
568575
}

usvm-ts/src/main/kotlin/org/usvm/machine/interpreter/TsInterpreter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import mu.KotlinLogging
55
import org.jacodb.ets.base.EtsArrayAccess
66
import org.jacodb.ets.base.EtsAssignStmt
77
import org.jacodb.ets.base.EtsCallStmt
8+
import org.jacodb.ets.base.EtsClassType
89
import org.jacodb.ets.base.EtsGotoStmt
910
import org.jacodb.ets.base.EtsIfStmt
1011
import org.jacodb.ets.base.EtsInstanceFieldRef
@@ -23,6 +24,7 @@ import org.jacodb.ets.model.EtsMethod
2324
import org.usvm.StepResult
2425
import org.usvm.StepScope
2526
import org.usvm.UInterpreter
27+
import org.usvm.api.evalTypeEquals
2628
import org.usvm.api.targets.TsTarget
2729
import org.usvm.collection.array.UArrayIndexLValue
2830
import org.usvm.collection.field.UFieldLValue
@@ -175,7 +177,7 @@ class TsInterpreter(
175177
val instance = exprResolver.resolve(lhv.instance)?.asExpr(ctx.addressSort) ?: return@doWithState
176178
val exprValue = expr.toFakeObject(scope)
177179

178-
val lValue = UFieldLValue(addressSort, instance, lhv.field)
180+
val lValue = UFieldLValue(addressSort, instance, lhv.field.name)
179181
memory.write(lValue, exprValue, guard = ctx.trueExpr)
180182
}
181183

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.usvm.machine.types
2+
3+
import com.jetbrains.rd.framework.util.RdCoroutineScope.Companion.override
4+
import org.jacodb.ets.base.EtsRefType
5+
import org.jacodb.ets.base.EtsType
6+
import org.jacodb.ets.model.EtsFieldSignature
7+
8+
/**
9+
* An artificial type that represents a set of properties.
10+
*/
11+
class AuxiliaryType(val properties: Set<EtsFieldSignature>) : EtsRefType {
12+
override val typeName: String = "AuxiliaryType"
13+
14+
override fun <R> accept(visitor: EtsType.Visitor<R>): R {
15+
error("Should not be called")
16+
}
17+
}

usvm-ts/src/test/kotlin/org/usvm/util/TsTestResolver.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,16 @@ open class TsTestStateResolver(
121121
fun resolveExpr(
122122
expr: UExpr<out USort>,
123123
type: EtsType,
124-
): TsValue = when (type) {
125-
is EtsPrimitiveType -> resolvePrimitive(expr, type)
126-
is EtsRefType -> resolveRef(expr.asExpr(ctx.addressSort), type)
127-
else -> resolveUnknownExpr(expr)
124+
): TsValue = with(ctx) {
125+
if (expr.isFakeObject()) {
126+
return resolveFakeObject(expr)
127+
}
128+
129+
return when (type) {
130+
is EtsPrimitiveType -> resolvePrimitive(expr, type)
131+
is EtsRefType -> resolveRef(expr.asExpr(ctx.addressSort), type)
132+
else -> resolveUnknownExpr(expr)
133+
}
128134
}
129135

130136
fun resolveUnknownExpr(expr: UExpr<out USort>): TsValue = with(expr.tctx) {
@@ -300,11 +306,12 @@ open class TsTestStateResolver(
300306
}
301307

302308
val properties = clazz.fields.associate { field ->
303-
val lValue = UFieldLValue(ctx.addressSort, expr.asExpr(ctx.addressSort), field.signature)
304-
val fieldExpr = memory.read(lValue)
309+
val lValue = UFieldLValue(ctx.addressSort, expr.asExpr(ctx.addressSort), field.name)
310+
// read from final state memory since it is a fake object
311+
val fieldExpr = finalStateMemory.read(lValue)
305312

306313
with(ctx) {
307-
if (model.eval(mkHeapRefEq(fieldExpr, mkUndefinedValue())).isTrue) {
314+
if (model.eval(mkEq(fieldExpr, mkUndefinedValue())).isTrue) {
308315
return@associate field.name to TsValue.TsUndefined
309316
}
310317

0 commit comments

Comments
 (0)