diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java index 5e89d398..812a282a 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java @@ -75,8 +75,8 @@ public class PostInstructionRegisterInfoMethodItem extends MethodItem { private void addDestRegs(BitSet printPostRegister, int registerCount) { for (int registerNum=0; registerNum()V - .registers 4 - - invoke-direct {p0}, Ljava/lang/Object;->()V - - return-void -.end method diff --git a/baksmali/src/test/resources/ConstructorTest/out/ConstructorTest2.smali b/baksmali/src/test/resources/ConstructorTest/out/ConstructorTest2.smali deleted file mode 100644 index 46ffebf9..00000000 --- a/baksmali/src/test/resources/ConstructorTest/out/ConstructorTest2.smali +++ /dev/null @@ -1,17 +0,0 @@ -.class public LConstructorTest2; -.super Ljava/lang/Object; - - -# direct methods -.method public constructor ()V - .registers 4 - - if-eqz p0, :cond_3 - - nop - - :cond_3 - invoke-direct {p0}, Ljava/lang/Object;->()V - - return-void -.end method diff --git a/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali new file mode 100644 index 00000000..b2b9b521 --- /dev/null +++ b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali @@ -0,0 +1,37 @@ +.class public LRegisterEqualityOnMerge; +.super Ljava/lang/Object; + + +# direct methods +.method public constructor ()V + .registers 4 + + #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LRegisterEqualityOnMerge;); + invoke-direct {p0}, Ljava/lang/Object;->()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 diff --git a/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex new file mode 100644 index 00000000..424fc203 Binary files /dev/null and b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex differ diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java index 3224ce79..0e90fcc8 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java @@ -176,7 +176,7 @@ public class AnalyzedInstruction implements Comparable { RegisterType oldRegisterType = preRegisterMap[registerNumber]; RegisterType mergedRegisterType = oldRegisterType.merge(registerType); - if (mergedRegisterType == oldRegisterType) { + if (mergedRegisterType.equals(oldRegisterType)) { return false; } @@ -218,7 +218,7 @@ public class AnalyzedInstruction implements Comparable { assert registerType != null; RegisterType oldRegisterType = postRegisterMap[registerNumber]; - if (oldRegisterType == registerType) { + if (oldRegisterType.equals(registerType)) { return false; } @@ -277,7 +277,7 @@ public class AnalyzedInstruction implements Comparable { return false; } //check if the uninit ref has been copied to another register - if (getPreInstructionRegisterType(registerNumber) == preInstructionDestRegisterType) { + if (getPreInstructionRegisterType(registerNumber).equals(preInstructionDestRegisterType)) { return true; } return false; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java index f565897f..60c43435 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java @@ -1253,7 +1253,7 @@ public class MethodAnalyzer { if (preInstructionRegisterType.category == RegisterType.UNINIT_REF || preInstructionRegisterType.category == RegisterType.UNINIT_THIS) { RegisterType registerType; - if (preInstructionRegisterType == objectRegisterType) { + if (preInstructionRegisterType.equals(objectRegisterType)) { registerType = analyzedInstruction.postRegisterMap[objectRegister]; } else { registerType = preInstructionRegisterType; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java index 60306b53..040c7a66 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java @@ -264,7 +264,7 @@ public class RegisterType { @Nonnull public RegisterType merge(@Nonnull RegisterType other) { - if (other == this) { + if (other.equals(this)) { return this; }