Commit b32dc17d authored by Skylot's avatar Skylot

fix: don't change AST before checks in ternary transform (#710)

parent 7c53b985
......@@ -253,10 +253,6 @@ public class TernaryMod implements IRegionIterativeVisitor {
}
private static void replaceWithTernary(MethodNode mth, IfRegion ifRegion, BlockNode block, InsnNode insn) {
BlockNode header = ifRegion.getConditionBlocks().get(0);
if (!ifRegion.getParent().replaceSubBlock(ifRegion, header)) {
return;
}
RegisterArg resArg = insn.getResult();
if (resArg.getSVar().getUseList().size() != 1) {
return;
......@@ -277,6 +273,10 @@ public class TernaryMod implements IRegionIterativeVisitor {
}
// all checks passed
BlockNode header = ifRegion.getConditionBlocks().get(0);
if (!ifRegion.getParent().replaceSubBlock(ifRegion, header)) {
return;
}
InsnList.remove(block, insn);
TernaryInsn ternInsn = new TernaryInsn(ifRegion.getCondition(),
phiInsn.getResult(), InsnArg.wrapInsnIntoArg(insn), otherArg);
......
......@@ -119,7 +119,8 @@ public class DebugUtils {
CodeWriter code = new CodeWriter();
ig.makeInsn(insn, code);
String insnStr = code.toString().substring(CodeWriter.NL.length());
LOG.debug("{}|> {}\t{}", indent, insnStr, insn.getAttributesString());
String attrStr = insn.isAttrStorageEmpty() ? "" : '\t' + insn.getAttributesString();
LOG.debug("{}|> {}{}", indent, insnStr, attrStr);
} catch (CodegenException e) {
LOG.debug("{}|>!! {}", indent, insn);
}
......
package jadx.tests.integration.trycatch;
import java.util.Properties;
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.MatcherAssert.assertThat;
public class TestTryWithEmptyCatch extends IntegrationTest {
public static class TestCls extends Exception {
private static final long serialVersionUID = -5723049816464070603L;
private Properties field;
public TestCls(String str) {
super(str);
Properties properties = null;
try {
if (str.contains("properties")) {
properties = new Properties();
}
} catch (Exception unused) {
// empty
}
this.field = properties;
}
}
@Test
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
assertThat(code, containsOne("try {"));
assertThat(code, containsOne("if ("));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment