From 3f05570b6bb8249f545ced73a1beb7f996c5227d Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Mon, 8 Apr 2013 20:27:35 -0700 Subject: [PATCH] Always use .equals for comparing RegisterType instances --- ...PostInstructionRegisterInfoMethodItem.java | 4 +- .../PreInstructionRegisterInfoMethodItem.java | 4 +- .../java/org/jf/baksmali/AnalysisTest.java | 5 +++ .../ConstructorTest/out/ConstructorTest.smali | 12 ------ .../out/ConstructorTest2.smali | 17 -------- .../RegisterEqualityOnMerge.smali | 37 ++++++++++++++++++ .../RegisterEqualityOnMergeTest/classes.dex | Bin 0 -> 508 bytes .../dexlib2/analysis/AnalyzedInstruction.java | 6 +-- .../jf/dexlib2/analysis/MethodAnalyzer.java | 2 +- .../org/jf/dexlib2/analysis/RegisterType.java | 2 +- 10 files changed, 51 insertions(+), 38 deletions(-) delete mode 100644 baksmali/src/test/resources/ConstructorTest/out/ConstructorTest.smali delete mode 100644 baksmali/src/test/resources/ConstructorTest/out/ConstructorTest2.smali create mode 100644 baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali create mode 100644 baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex 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 0000000000000000000000000000000000000000..424fc203b70699f89ebe5c556938f186c022a56c GIT binary patch literal 508 zcmY*Vu}Z^G6un7fl_DW@(yfzgg<23Qb`n7%g$muHKEo?D)-*~*gt+?!;^5%u;2;iC z96E~M;nYtM^qf4O;DwWO-nn@*O%#+ zBQg|`ac`{(Dk_IJ4@KVtZU7g!18kKbo&mfnA3y*x1Mh&3fF+;-bb)O^1DwHooH+-; zDm+keX3rEm>{}Kon?~UnSL7Q-d-Q8~e>X&Y_(LpJk|c2PT$FXpu-cd9u&ZJ{%2c{_ zdKL|IcF{?8RT`_7RKtFB9@Pg?64yKXeRYtv#OX=Ilaq4s#Z0QjtSobPnSOh@eA6 literal 0 HcmV?d00001 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; }