Always use .equals for comparing RegisterType instances

This commit is contained in:
Ben Gruver 2013-04-08 20:27:35 -07:00
parent d87770e69b
commit 3f05570b6b
10 changed files with 51 additions and 38 deletions

View File

@ -75,8 +75,8 @@ public class PostInstructionRegisterInfoMethodItem extends MethodItem {
private void addDestRegs(BitSet printPostRegister, int registerCount) { private void addDestRegs(BitSet printPostRegister, int registerCount) {
for (int registerNum=0; registerNum<registerCount; registerNum++) { for (int registerNum=0; registerNum<registerCount; registerNum++) {
if (analyzedInstruction.getPreInstructionRegisterType(registerNum) != if (!analyzedInstruction.getPreInstructionRegisterType(registerNum).equals(
analyzedInstruction.getPostInstructionRegisterType(registerNum)) { analyzedInstruction.getPostInstructionRegisterType(registerNum))) {
printPostRegister.set(registerNum); printPostRegister.set(registerNum);
} }
} }

View File

@ -151,7 +151,7 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem {
RegisterType mergedRegisterType = analyzedInstruction.getPreInstructionRegisterType(registerNum); RegisterType mergedRegisterType = analyzedInstruction.getPreInstructionRegisterType(registerNum);
for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) { for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) {
if (predecessor.getPostInstructionRegisterType(registerNum) != mergedRegisterType) { if (!predecessor.getPostInstructionRegisterType(registerNum).equals(mergedRegisterType)) {
registers.set(registerNum); registers.set(registerNum);
} }
} }
@ -178,7 +178,7 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem {
for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) { for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) {
RegisterType predecessorRegisterType = predecessor.getPostInstructionRegisterType(registerNum); RegisterType predecessorRegisterType = predecessor.getPostInstructionRegisterType(registerNum);
if (predecessorRegisterType.category != RegisterType.UNKNOWN && if (predecessorRegisterType.category != RegisterType.UNKNOWN &&
predecessorRegisterType != mergedRegisterType) { !predecessorRegisterType.equals(mergedRegisterType)) {
addRegister = true; addRegister = true;
break; break;

View File

@ -56,6 +56,11 @@ public class AnalysisTest {
runTest("ConstructorTest"); runTest("ConstructorTest");
} }
@Test
public void RegisterEqualityOnMergeTest() throws IOException, URISyntaxException {
runTest("RegisterEqualityOnMergeTest");
}
public void runTest(String test) throws IOException, URISyntaxException { public void runTest(String test) throws IOException, URISyntaxException {
String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar); String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar);

View File

@ -1,12 +0,0 @@
.class public LConstructorTest;
.super Ljava/lang/Object;
# direct methods
.method public constructor <init>()V
.registers 4
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method

View File

@ -1,17 +0,0 @@
.class public LConstructorTest2;
.super Ljava/lang/Object;
# direct methods
.method public constructor <init>()V
.registers 4
if-eqz p0, :cond_3
nop
:cond_3
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method

View File

@ -0,0 +1,37 @@
.class public LRegisterEqualityOnMerge;
.super Ljava/lang/Object;
# direct methods
.method public constructor <init>()V
.registers 4
#v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LRegisterEqualityOnMerge;);
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
#v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
#v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
#v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
#v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
move-result-object v0
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
if-eqz v0, :cond_d
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
move-result-object v0
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
:cond_d
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
return-void
#v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
.end method

View File

@ -176,7 +176,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> {
RegisterType oldRegisterType = preRegisterMap[registerNumber]; RegisterType oldRegisterType = preRegisterMap[registerNumber];
RegisterType mergedRegisterType = oldRegisterType.merge(registerType); RegisterType mergedRegisterType = oldRegisterType.merge(registerType);
if (mergedRegisterType == oldRegisterType) { if (mergedRegisterType.equals(oldRegisterType)) {
return false; return false;
} }
@ -218,7 +218,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> {
assert registerType != null; assert registerType != null;
RegisterType oldRegisterType = postRegisterMap[registerNumber]; RegisterType oldRegisterType = postRegisterMap[registerNumber];
if (oldRegisterType == registerType) { if (oldRegisterType.equals(registerType)) {
return false; return false;
} }
@ -277,7 +277,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> {
return false; return false;
} }
//check if the uninit ref has been copied to another register //check if the uninit ref has been copied to another register
if (getPreInstructionRegisterType(registerNumber) == preInstructionDestRegisterType) { if (getPreInstructionRegisterType(registerNumber).equals(preInstructionDestRegisterType)) {
return true; return true;
} }
return false; return false;

View File

@ -1253,7 +1253,7 @@ public class MethodAnalyzer {
if (preInstructionRegisterType.category == RegisterType.UNINIT_REF || if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
preInstructionRegisterType.category == RegisterType.UNINIT_THIS) { preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
RegisterType registerType; RegisterType registerType;
if (preInstructionRegisterType == objectRegisterType) { if (preInstructionRegisterType.equals(objectRegisterType)) {
registerType = analyzedInstruction.postRegisterMap[objectRegister]; registerType = analyzedInstruction.postRegisterMap[objectRegister];
} else { } else {
registerType = preInstructionRegisterType; registerType = preInstructionRegisterType;

View File

@ -264,7 +264,7 @@ public class RegisterType {
@Nonnull @Nonnull
public RegisterType merge(@Nonnull RegisterType other) { public RegisterType merge(@Nonnull RegisterType other) {
if (other == this) { if (other.equals(this)) {
return this; return this;
} }