Skip to content

Commit

Permalink
fix: preserve arg type on PHI insn inline (#718)
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Oct 28, 2019
1 parent 64c9ce2 commit 8321d5e
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ private static InsnNode duplicateReturnInsn(InsnNode returnInsn) {
InsnNode insn = new InsnNode(returnInsn.getType(), returnInsn.getArgsCount());
if (returnInsn.getArgsCount() == 1) {
RegisterArg arg = (RegisterArg) returnInsn.getArg(0);
insn.addArg(InsnArg.reg(arg.getRegNum(), arg.getInitType()));
insn.addArg(arg.duplicate());
}
insn.copyAttributesFrom(returnInsn);
insn.setOffset(returnInsn.getOffset());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import jadx.core.dex.attributes.nodes.PhiListAttr;
import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.PhiInsn;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg;
import jadx.core.dex.instructions.args.RegisterArg;
import jadx.core.dex.instructions.args.SSAVar;
Expand Down Expand Up @@ -383,25 +382,18 @@ private static boolean inlinePhiInsn(MethodNode mth, BlockNode block, PhiInsn ph
List<RegisterArg> useList = resVar.getUseList();
for (RegisterArg useArg : new ArrayList<>(useList)) {
InsnNode useInsn = useArg.getParentInsn();
if (useInsn == null || useInsn == phi) {
if (useInsn == null || useInsn == phi || useArg.getRegNum() != arg.getRegNum()) {
return false;
}
// replace SSAVar in 'useArg' to SSAVar from 'arg'
// no need to replace whole RegisterArg
useArg.getSVar().removeUse(useArg);
RegisterArg inlArg = arg.duplicate();
if (!useInsn.replaceArg(useArg, inlArg)) {
return false;
}
inlArg.getSVar().use(inlArg);
inlArg.setName(useArg.getName());
ArgType type = useArg.getImmutableType();
if (type != null) {
inlArg.setType(type);
}
arg.getSVar().use(useArg);
}
if (block.contains(AType.EXC_HANDLER)) {
// don't inline into exception handler
InsnNode assignInsn = arg.getAssignInsn();
if (assignInsn != null) {
if (assignInsn != null && !assignInsn.isConstInsn()) {
assignInsn.add(AFlag.DONT_INLINE);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package jadx.tests.integration.inline;

import org.junit.jupiter.api.Test;

import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;

import static jadx.tests.api.utils.JadxMatchers.containsOne;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;

public class TestConstInline extends IntegrationTest {

public static class TestCls {
public boolean test() {
try {
return f(0);
} catch (Exception e) {
return false;
}
}

public boolean f(int i) {
return true;
}
}

@Test
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();

assertThat(code, containsOne("return f(0);"));
assertThat(code, containsOne("return false;"));
assertThat(code, not(containsString(" = ")));
}
}

0 comments on commit 8321d5e

Please sign in to comment.