From 6cb14a1c50029819e02634977b9ba78c14b7b5ff Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 16 Aug 2018 22:55:30 +0300 Subject: [PATCH] core: use flag for mark 'this' register --- .../java/jadx/core/dex/attributes/AFlag.java | 1 + .../core/dex/instructions/args/InsnArg.java | 2 +- .../dex/instructions/args/RegisterArg.java | 3 +- .../instructions/args/TypeImmutableArg.java | 38 +++---------------- .../java/jadx/core/dex/nodes/MethodNode.java | 5 ++- .../core/dex/visitors/ssa/SSATransform.java | 8 ++++ 6 files changed, 20 insertions(+), 37 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java index de36da802..06d4824f1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java @@ -26,6 +26,7 @@ public enum AFlag { SKIP_ARG, // skip argument in invoke call ANONYMOUS_CONSTRUCTOR, ANONYMOUS_CLASS, + THIS, ELSE_IF_CHAIN, diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java index d03a67298..9e9c76a9d 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java @@ -140,7 +140,7 @@ public abstract class InsnArg extends Typed { } public boolean isThis() { - // must be implemented in RegisterArg and MthParameterArg + // must be implemented in RegisterArg return false; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java index 4b136f25a..3dcc0b2db 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java @@ -4,6 +4,7 @@ import java.util.Objects; import org.jetbrains.annotations.NotNull; +import jadx.core.dex.attributes.AFlag; import jadx.core.dex.instructions.InsnType; import jadx.core.dex.instructions.PhiInsn; import jadx.core.dex.nodes.DexNode; @@ -118,7 +119,7 @@ public class RegisterArg extends InsnArg implements Named { @Override public boolean isThis() { - if ("this".equals(getName())) { + if (contains(AFlag.THIS)) { return true; } // maybe it was moved from 'this' register diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypeImmutableArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypeImmutableArg.java index e99151559..aa2ecaa50 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypeImmutableArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypeImmutableArg.java @@ -4,7 +4,7 @@ import org.jetbrains.annotations.NotNull; public class TypeImmutableArg extends RegisterArg { - private boolean isThis; + public static final String THIS_ARG_NAME = "this"; public TypeImmutableArg(int rn, ArgType type) { super(rn, type); @@ -20,48 +20,20 @@ public class TypeImmutableArg extends RegisterArg { // not allowed } - public void markAsThis() { - this.isThis = true; - } - - @Override - public boolean isThis() { - return isThis; - } - @Override public String getName() { - if (isThis) { - return "this"; + if (isThis()) { + return THIS_ARG_NAME; } return super.getName(); } @Override void setSVar(@NotNull SSAVar sVar) { - if (isThis) { - sVar.setName("this"); + if (isThis()) { + sVar.setName(THIS_ARG_NAME); } sVar.setTypeImmutable(type); super.setSVar(sVar); } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof TypeImmutableArg)) { - return false; - } - if (!super.equals(obj)) { - return false; - } - return isThis == ((TypeImmutableArg) obj).isThis; - } - - @Override - public int hashCode() { - return 31 * super.hashCode() + (isThis ? 1 : 0); - } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index e89d77566..7569444fb 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -193,11 +193,11 @@ public class MethodNode extends LineAttrNode implements ILoadable, IDexNode { } } initArguments(argsTypes); + return true; } catch (JadxRuntimeException e) { LOG.error("Method signature parse error: {}", this, e); return false; } - return true; } private void initArguments(List args) { @@ -214,7 +214,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, IDexNode { thisArg = null; } else { TypeImmutableArg arg = InsnArg.typeImmutableReg(pos - 1, parentClass.getClassInfo().getType()); - arg.markAsThis(); + arg.add(AFlag.THIS); thisArg = arg; } if (args.isEmpty()) { @@ -243,6 +243,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, IDexNode { return argsList.remove(0); } + @Nullable public RegisterArg getThisArg() { return thisArg; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java index 46207b77c..6a2f06d47 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java @@ -53,6 +53,7 @@ public class SSATransform extends AbstractVisitor { fixLastAssignInTry(mth); removeBlockerInsns(mth); + markThisArg(mth); boolean repeatFix; int k = 0; @@ -405,4 +406,11 @@ public class SSATransform extends AbstractVisitor { InstructionRemover.unbindInsn(mth, phi); return true; } + + private static void markThisArg(MethodNode mth) { + RegisterArg thisArg = mth.getThisArg(); + if (thisArg != null) { + thisArg.getSVar().getUseList().forEach(arg -> arg.add(AFlag.THIS)); + } + } }