Skip to content

Commit

Permalink
fix: don't eliminate StringBuilder if no String arg present
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Nov 19, 2019
1 parent a48ce29 commit 4b314e9
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,20 @@ private static InsnNode convertStringBuilderChain(MethodNode mth, InvokeNode toS
}
args.add(arg);
}

boolean stringArgFound = false;
for (InsnArg arg : args) {
if (arg.getType().equals(ArgType.STRING)) {
stringArgFound = true;
break;
}
}
if (!stringArgFound) {
// TODO: convert one arg to string using `String.valueOf()`
return null;
}

// all check passed
removeStringBuilderInsns(mth, toStrInsn, chain);

InsnNode concatInsn = new InsnNode(InsnType.STR_CONCAT, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package jadx.tests.integration.others;

import org.junit.jupiter.api.Test;

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

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;

public class TestStringBuilderElimination4Neg extends IntegrationTest {

public static class TestCls<K, V> {
private K k;
private V v;

public String test() {
StringBuilder sb = new StringBuilder();
sb.append(k);
sb.append('=');
sb.append(v);
return sb.toString();
}
}

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

assertThat(code, containsString("sb.append('=');"));
}
}

0 comments on commit 4b314e9

Please sign in to comment.