@@ -17,13 +17,14 @@ import org.usvm.test.api.UTestStatement
1717class JcDeadCodeTransformer : JcTestTransformer () {
1818 private val roots: MutableSet <UTestExpression > = Collections .newSetFromMap(IdentityHashMap ())
1919 private val reachable: MutableSet <UTestExpression > = Collections .newSetFromMap(IdentityHashMap ())
20- private lateinit var rootFetcher: ReachabilityRootFetcher
20+
21+ private val rootFetcher get() = ReachabilityRootFetcher (roots)
22+
2123 private class ReachabilityRootFetcher (val roots : MutableSet <UTestExpression >): JcTestVisitor() {
2224 val fetched: MutableSet <UTestExpression > = Collections .newSetFromMap(IdentityHashMap ())
2325
2426 fun fetchFrom (expr : UTestExpression ): MutableSet <UTestExpression > = fetchFrom(listOf (expr))
2527 fun fetchFrom (exprs : List <UTestExpression >): MutableSet <UTestExpression > {
26- fetched.clear()
2728
2829 for (expr in exprs) {
2930 visitExpr(expr)
@@ -42,31 +43,14 @@ class JcDeadCodeTransformer: JcTestTransformer() {
4243 }
4344
4445 private class ReachabilityCollector (
45- val test : UTest ,
4646 val roots : MutableSet <UTestExpression >,
4747 val reachable : MutableSet <UTestExpression >
4848 ) : JcTestVisitor() {
4949 private var marker = false
5050
51- fun prepareRootFetcher (): ReachabilityRootFetcher {
52- super .visit(test)
53- propagateWhilePossible(test)
54- return ReachabilityRootFetcher (roots)
55- }
56-
57- private fun propagateWhilePossible (test : UTest ) {
58- val clone: MutableSet <UTestExpression > = Collections .newSetFromMap(IdentityHashMap ())
59-
60- do {
61- clone.clear()
62- clone.addAll(reachable)
63- check(clone.size == reachable.size)
64- (test.initStatements + test.callMethodExpression).forEach { inst ->
65- marker = false
66- visit(inst)
67- }
68-
69- } while (clone.size != reachable.size)
51+ override fun visit (inst : UTestInst ) {
52+ marker = false
53+ super .visit(inst)
7054 }
7155
7256 override fun visit (stmt : UTestSetStaticFieldStatement ) {
@@ -140,8 +124,10 @@ class JcDeadCodeTransformer: JcTestTransformer() {
140124 }
141125
142126 override fun transform (test : UTest ): UTest {
127+ roots.clear()
128+ reachable.clear()
143129
144- rootFetcher = ReachabilityCollector (test, roots, reachable).prepareRootFetcher( )
130+ propagateReachabilityIn (test)
145131
146132 val filteredInitInstList = test.initStatements.flatMap {
147133 transformInstProxy(it)
@@ -152,6 +138,17 @@ class JcDeadCodeTransformer: JcTestTransformer() {
152138 return UTest (filteredInitInstList, callMethodExpression)
153139 }
154140
141+ private fun propagateReachabilityIn (test : UTest ) {
142+ val clone: MutableSet <UTestExpression > = Collections .newSetFromMap(IdentityHashMap ())
143+
144+ do {
145+ clone.clear()
146+ clone.addAll(reachable)
147+ check(clone.size == reachable.size)
148+ ReachabilityCollector (roots, reachable).visit(test)
149+ } while (clone.size != reachable.size)
150+ }
151+
155152 private fun transformExprs (expr : UTestExpression ): List <UTestInst ?>{
156153 if (expr in reachable)
157154 return listOf (expr)
0 commit comments