Commit 406d9878 authored by Skylot's avatar Skylot

core: fix invoke args skipping

parent 4e6c5cb2
...@@ -29,7 +29,6 @@ import jadx.core.dex.instructions.args.InsnWrapArg; ...@@ -29,7 +29,6 @@ import jadx.core.dex.instructions.args.InsnWrapArg;
import jadx.core.dex.instructions.args.LiteralArg; import jadx.core.dex.instructions.args.LiteralArg;
import jadx.core.dex.instructions.args.Named; import jadx.core.dex.instructions.args.Named;
import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.instructions.args.RegisterArg;
import jadx.core.dex.instructions.args.SSAVar;
import jadx.core.dex.instructions.mods.ConstructorInsn; import jadx.core.dex.instructions.mods.ConstructorInsn;
import jadx.core.dex.instructions.mods.TernaryInsn; import jadx.core.dex.instructions.mods.TernaryInsn;
import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.ClassNode;
...@@ -645,20 +644,17 @@ public class InsnGen { ...@@ -645,20 +644,17 @@ public class InsnGen {
boolean overloaded = callMth != null && callMth.isArgsOverload(); boolean overloaded = callMth != null && callMth.isArgsOverload();
for (int i = k; i < argsCount; i++) { for (int i = k; i < argsCount; i++) {
InsnArg arg = insn.getArg(i); InsnArg arg = insn.getArg(i);
if (arg.isRegister()) { if (arg.contains(AFlag.SKIP_ARG)) {
SSAVar sVar = ((RegisterArg) arg).getSVar(); continue;
if (sVar != null && sVar.contains(AFlag.SKIP_ARG)) { }
continue; if (i != k) {
} code.add(", ");
} }
boolean cast = overloaded && processOverloadedArg(code, callMth, arg, i - startArgNum); boolean cast = overloaded && processOverloadedArg(code, callMth, arg, i - startArgNum);
if (!cast && i == argsCount - 1 && processVarArg(code, callMth, arg)) { if (!cast && i == argsCount - 1 && processVarArg(code, callMth, arg)) {
continue; continue;
} }
addArg(code, arg, false); addArg(code, arg, false);
if (i < argsCount - 1) {
code.add(", ");
}
} }
} }
code.add(')'); code.add(')');
......
...@@ -27,10 +27,13 @@ public abstract class AttrNode implements IAttributeNode { ...@@ -27,10 +27,13 @@ public abstract class AttrNode implements IAttributeNode {
@Override @Override
public void copyAttributesFrom(AttrNode attrNode) { public void copyAttributesFrom(AttrNode attrNode) {
initStorage().addAll(attrNode.storage); AttributeStorage copyFrom = attrNode.storage;
if (!copyFrom.isEmpty()) {
initStorage().addAll(copyFrom);
}
} }
AttributeStorage initStorage() { private AttributeStorage initStorage() {
AttributeStorage store = storage; AttributeStorage store = storage;
if (store == EMPTY_ATTR_STORAGE) { if (store == EMPTY_ATTR_STORAGE) {
store = new AttributeStorage(); store = new AttributeStorage();
......
...@@ -111,6 +111,10 @@ public class AttributeStorage { ...@@ -111,6 +111,10 @@ public class AttributeStorage {
return list; return list;
} }
public boolean isEmpty() {
return flags.isEmpty() && attributes.isEmpty();
}
@Override @Override
public String toString() { public String toString() {
List<String> list = getAttributeStrings(); List<String> list = getAttributeStrings();
......
...@@ -54,6 +54,11 @@ public final class EmptyAttrStorage extends AttributeStorage { ...@@ -54,6 +54,11 @@ public final class EmptyAttrStorage extends AttributeStorage {
} }
@Override @Override
public boolean isEmpty() {
return true;
}
@Override
public String toString() { public String toString() {
return ""; return "";
} }
......
...@@ -79,6 +79,7 @@ public class RegisterArg extends InsnArg implements Named { ...@@ -79,6 +79,7 @@ public class RegisterArg extends InsnArg implements Named {
public RegisterArg duplicate() { public RegisterArg duplicate() {
RegisterArg dup = new RegisterArg(getRegNum(), getType()); RegisterArg dup = new RegisterArg(getRegNum(), getType());
dup.setSVar(sVar); dup.setSVar(sVar);
dup.copyAttributesFrom(this);
return dup; return dup;
} }
......
package jadx.core.dex.instructions.args; package jadx.core.dex.instructions.args;
import jadx.core.dex.attributes.AttrNode;
import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.DexNode;
public abstract class Typed { public abstract class Typed extends AttrNode {
protected ArgType type; protected ArgType type;
......
...@@ -277,8 +277,8 @@ public class ModVisitor extends AbstractVisitor { ...@@ -277,8 +277,8 @@ public class ModVisitor extends AbstractVisitor {
if (sVar != null) { if (sVar != null) {
sVar.add(AFlag.FINAL); sVar.add(AFlag.FINAL);
sVar.add(AFlag.DONT_INLINE); sVar.add(AFlag.DONT_INLINE);
sVar.add(AFlag.SKIP_ARG);
} }
reg.add(AFlag.SKIP_ARG);
} }
} }
} }
......
package jadx.tests.integration.inner;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;
import java.util.Random;
import org.junit.Test;
import static jadx.tests.api.utils.JadxMatchers.containsOne;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
public class TestAnonymousClass11 extends IntegrationTest {
public static class TestCls {
public void test() {
final int a = new Random().nextInt();
final long l = new Random().nextLong();
func(new A(l) {
@Override
public void m() {
System.out.println(a);
}
});
System.out.println("a" + a);
print(a);
print2(1, a);
print3(1, l);
}
public abstract class A {
public A(long l) {
}
public abstract void m();
}
private void func(A a) {
}
private void print(int a) {
}
private void print2(int i, int a) {
}
private void print3(int i, long l) {
}
}
@Test
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
assertThat(code, containsOne("System.out.println(\"a\" + a);"));
assertThat(code, containsOne("print(a);"));
assertThat(code, not(containsString("synthetic")));
}
}
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