From 128fe8a839300e77a2d44fbe0f6661abcfea3779 Mon Sep 17 00:00:00 2001 From: Anton Dyachenko Date: Tue, 2 Sep 2014 20:05:15 +0400 Subject: [PATCH] core: fix resolving the instance field in the 2nd and more nested inner class --- .../main/java/jadx/core/codegen/InsnGen.java | 12 ++- .../main/java/jadx/samples/TestInner3.java | 86 +++++++++++++++++++ 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 jadx-samples/src/main/java/jadx/samples/TestInner3.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index f71e7a653..225868756 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -129,8 +129,16 @@ public class InsnGen { } private void instanceField(CodeWriter code, FieldInfo field, InsnArg arg) throws CodegenException { - FieldNode fieldNode = mth.getParentClass().searchField(field); - if (fieldNode != null) { + ClassNode pCls = mth.getParentClass(); + FieldNode fieldNode = pCls.searchField(field); + + while ((fieldNode == null) + && (pCls.getParentClass() != pCls) && (pCls.getParentClass() != null)) + { + pCls = pCls.getParentClass(); + fieldNode = pCls.searchField(field); + } + if (fieldNode != null) { FieldReplaceAttr replace = fieldNode.get(AType.FIELD_REPLACE); if (replace != null) { FieldInfo info = replace.getFieldInfo(); diff --git a/jadx-samples/src/main/java/jadx/samples/TestInner3.java b/jadx-samples/src/main/java/jadx/samples/TestInner3.java new file mode 100644 index 000000000..0ffa7dcda --- /dev/null +++ b/jadx-samples/src/main/java/jadx/samples/TestInner3.java @@ -0,0 +1,86 @@ +package jadx.samples; + +public class TestInner3 extends AbstractTest { + + private String i0; + + public class A { + + protected String a; + + public A() { + a=""; + } + + public String a() { + return ""; + } + } + + public class I0 { + private String i0; + private String i1; + + public class I1 { + private String i0; + private String i1; + private String i2; + + public I1() { + TestInner3.this.i0 = "i0"; + I0.this.i0 = "i1"; + I0.this.i1 = "i2"; + + i0 = "i0"; + i1 = "i1"; + i2 = "i2"; + } + + public String i() { + + String result = TestInner3.this.i0 + I0.this.i0 + I0.this.i1 + i0 + i1 + i2; + + A a = new A() { + + public String a() { + TestInner3.this.i0 = "i1"; + I0.this.i0 = "i2"; + I0.this.i1 = "i3"; + I1.this.i0 = "i1"; + I1.this.i1 = "i2"; + I1.this.i2 = "i3"; + a = "a"; + + return TestInner3.this.i0 + I0.this.i0 + I0.this.i1 + I1.this.i0 + I1.this.i1 + I1.this.i2 + a; + } + }; + + return result + a.a(); + } + } + + public I0() { + TestInner3.this.i0 = "i-"; + i0 = "i0"; + i1 = "i1"; + } + + public String i() { + String result = TestInner3.this.i0 + i0 + i1; + return result + (new I1()).i(); + } + } + + @Override + public boolean testRun() throws Exception { + assertTrue((new I0()).i().equals("i-i0i1i0i1i2i0i1i2i1i2i3i1i2i3a")); + assertTrue(i0.equals("i1")); + + return true; + } + + public static void main(String[] args) throws Exception { + new TestInner2().testRun(); + } + +}