提交 8321d5e3 编写于 作者: S Skylot

fix: preserve arg type on PHI insn inline (#718)

上级 64c9ce2a
......@@ -677,7 +677,7 @@ public class BlockProcessor extends AbstractVisitor {
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());
......
......@@ -12,7 +12,6 @@ import jadx.core.dex.attributes.AType;
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;
......@@ -383,25 +382,18 @@ public class SSATransform extends AbstractVisitor {
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);
}
}
......
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(" = ")));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册