jimu-decompiled/sources/com/squareup/haha/perflib/analysis/Dominators.java
2025-05-13 19:24:51 +02:00

77 lines
3.2 KiB
Java

package com.squareup.haha.perflib.analysis;
import com.squareup.haha.guava.collect.ImmutableList;
import com.squareup.haha.guava.collect.Iterables;
import com.squareup.haha.perflib.Heap;
import com.squareup.haha.perflib.Instance;
import com.squareup.haha.perflib.RootObj;
import com.squareup.haha.perflib.Snapshot;
import java.util.Iterator;
/* loaded from: classes.dex */
public class Dominators {
private final Snapshot mSnapshot;
private final ImmutableList<Instance> mTopSort;
public Dominators(Snapshot snapshot, ImmutableList<Instance> immutableList) {
this.mSnapshot = snapshot;
this.mTopSort = immutableList;
Iterator<RootObj> it = snapshot.getGCRoots().iterator();
while (it.hasNext()) {
Instance referredInstance = it.next().getReferredInstance();
if (referredInstance != null) {
referredInstance.setImmediateDominator(Snapshot.SENTINEL_ROOT);
}
}
}
private void computeDominators() {
boolean z;
for (boolean z2 = true; z2; z2 = z) {
z = false;
for (int i = 0; i < this.mTopSort.size(); i++) {
Instance instance = this.mTopSort.get(i);
if (instance.getImmediateDominator() != Snapshot.SENTINEL_ROOT) {
Instance instance2 = null;
for (int i2 = 0; i2 < instance.getHardReferences().size(); i2++) {
Instance instance3 = instance.getHardReferences().get(i2);
if (instance3.getImmediateDominator() != null) {
if (instance2 == null) {
instance2 = instance3;
} else {
while (instance2 != instance3) {
if (instance2.getTopologicalOrder() < instance3.getTopologicalOrder()) {
instance3 = instance3.getImmediateDominator();
} else {
instance2 = instance2.getImmediateDominator();
}
}
}
}
}
if (instance.getImmediateDominator() != instance2) {
instance.setImmediateDominator(instance2);
z = true;
}
}
}
}
}
public void computeRetainedSizes() {
for (Heap heap : this.mSnapshot.getHeaps()) {
Iterator it = Iterables.concat(heap.getClasses(), heap.getInstances()).iterator();
while (it.hasNext()) {
((Instance) it.next()).resetRetainedSize();
}
}
computeDominators();
for (Instance instance : this.mSnapshot.getReachableInstances()) {
int heapIndex = this.mSnapshot.getHeapIndex(instance.getHeap());
for (Instance immediateDominator = instance.getImmediateDominator(); immediateDominator != Snapshot.SENTINEL_ROOT; immediateDominator = immediateDominator.getImmediateDominator()) {
immediateDominator.addRetainedSize(heapIndex, instance.getSize());
}
}
}
}