### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java,v retrieving revision 1.169 diff -u -r1.169 CodeStream.java --- compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java 30 Sep 2008 15:31:26 -0000 1.169 +++ compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java 30 Sep 2008 16:41:10 -0000 @@ -2445,14 +2445,14 @@ areturn(); } -public void generateSyntheticBodyForFieldReadAccess(SyntheticMethodBinding accessBinding) { - initializeMaxLocals(accessBinding); - FieldBinding fieldBinding = accessBinding.targetReadField; +public void generateSyntheticBodyForFieldReadAccess(SyntheticMethodBinding accessMethod) { + initializeMaxLocals(accessMethod); + FieldBinding fieldBinding = accessMethod.targetReadField; if (fieldBinding.isStatic()) { - fieldAccess(Opcodes.OPC_getstatic, fieldBinding, null /* default declaringClass */); + fieldAccess(Opcodes.OPC_getstatic, fieldBinding, accessMethod.declaringClass); // target method declaring class may not be accessible (247953); } else { aload_0(); - fieldAccess(Opcodes.OPC_getfield, fieldBinding, null /* default declaringClass */); + fieldAccess(Opcodes.OPC_getfield, fieldBinding, accessMethod.declaringClass); // target method declaring class may not be accessible (247953); } switch (fieldBinding.type.id) { // case T_void : @@ -2479,16 +2479,16 @@ } } -public void generateSyntheticBodyForFieldWriteAccess(SyntheticMethodBinding accessBinding) { - initializeMaxLocals(accessBinding); - FieldBinding fieldBinding = accessBinding.targetWriteField; +public void generateSyntheticBodyForFieldWriteAccess(SyntheticMethodBinding accessMethod) { + initializeMaxLocals(accessMethod); + FieldBinding fieldBinding = accessMethod.targetWriteField; if (fieldBinding.isStatic()) { load(fieldBinding.type, 0); - fieldAccess(Opcodes.OPC_putstatic, fieldBinding, null /* default declaringClass */); + fieldAccess(Opcodes.OPC_putstatic, fieldBinding, accessMethod.declaringClass); // target method declaring class may not be accessible (247953); } else { aload_0(); load(fieldBinding.type, 1); - fieldAccess(Opcodes.OPC_putfield, fieldBinding, null /* default declaringClass */); + fieldAccess(Opcodes.OPC_putfield, fieldBinding, accessMethod.declaringClass); // target method declaring class may not be accessible (247953); } return_(); } @@ -2529,7 +2529,7 @@ } } if (targetMethod.isStatic()) - invoke(Opcodes.OPC_invokestatic, targetMethod, null /* default declaringClass */); + invoke(Opcodes.OPC_invokestatic, targetMethod, accessMethod.declaringClass); // target method declaring class may not be accessible (128563) else { if (targetMethod.isConstructor() || targetMethod.isPrivate() #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java,v retrieving revision 1.44 diff -u -r1.44 InnerEmulationTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java 30 Sep 2008 15:31:35 -0000 1.44 +++ src/org/eclipse/jdt/core/tests/compiler/regression/InnerEmulationTest.java 30 Sep 2008 16:41:13 -0000 @@ -6520,7 +6520,7 @@ checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 -public void _testONLY_157() throws Exception { +public void test157() throws Exception { this.runConformTest(new String[] { "package1/A.java",//======================= "package package1;\n" + @@ -6550,15 +6550,15 @@ }, ""); String expectedOutput = - " // Method descriptor #33 (Lpackage2/C;)V\n" + + " // Method descriptor #33 (Lpackage2/C;)I\n" + " // Stack: 1, Locals: 1\n" + - " static synthetic void access$0(package2.C arg0);\n" + + " static synthetic int access$0(package2.C arg0);\n" + " 0 aload_0 [arg0]\n" + " 1 getfield package2.C.outerField : int"; checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation -public void _testONLY_158() throws Exception { +public void test158() throws Exception { this.runConformTest(new String[] { "package1/A.java",//======================= "package package1;\n" + @@ -6598,7 +6598,7 @@ checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation -public void _testONLY_159() throws Exception { +public void test159() throws Exception { this.runConformTest(new String[] { "package1/A.java",//======================= "package package1;\n" + @@ -6628,15 +6628,15 @@ }, ""); String expectedOutput = - " // Method descriptor #33 (Lpackage2/C;)V\n" + + " // Method descriptor #33 (Lpackage2/C;)I\n" + " // Stack: 1, Locals: 1\n" + - " static synthetic void access$0(package2.C arg0);\n" + + " static synthetic int access$0(package2.C arg0);\n" + " 0 aload_0 [arg0]\n" + " 1 getfield package2.C.outerField : int"; checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation -public void _testONLY_160() throws Exception { +public void test160() throws Exception { this.runConformTest(new String[] { "package1/A.java",//======================= "package package1;\n" + @@ -6674,6 +6674,195 @@ " 2 putfield package2.C.outerField : int"; checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation +public void test161() throws Exception { + this.runConformTest(new String[] { + "package1/A.java",//======================= + "package package1;\n" + + "abstract class A {\n" + + " static protected int outerField; {\n" + + " }\n" + + "}\n", + "package1/B.java",//======================= + "package package1;\n" + + "public class B extends A {\n" + + "}\n", + "package2/C.java",//======================= + "package package2;\n" + + "import package1.B;\n" + + "public class C extends B {\n" + + " private final MyInner myInner = new MyInner();\n" + + " private class MyInner {\n" + + " public void innerMethod() {\n" + + " int j = C.this.outerField;\n" + + " }\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " final C c = new C();\n" + + " c.myInner.innerMethod();\n" + + " }\n" + + "}\n", + }, + ""); + String expectedOutput = + " // Method descriptor #33 ()I\n" + + " // Stack: 1, Locals: 0\n" + + " static synthetic int access$0();\n" + + " 0 getstatic package2.C.outerField : int"; + checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation +public void test162() throws Exception { + this.runConformTest(new String[] { + "package1/A.java",//======================= + "package package1;\n" + + "abstract class A {\n" + + " static protected int outerField; {\n" + + " }\n" + + "}\n", + "package1/B.java",//======================= + "package package1;\n" + + "public class B extends A {\n" + + "}\n", + "package2/C.java",//======================= + "package package2;\n" + + "import package1.B;\n" + + "public class C extends B {\n" + + " private final MyInner myInner = new MyInner();\n" + + " private class MyInner {\n" + + " public void innerMethod() {\n" + + " C.this.outerField = 12;\n" + + " }\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " final C c = new C();\n" + + " c.myInner.innerMethod();\n" + + " }\n" + + "}\n", + }, + ""); + String expectedOutput = + " // Method descriptor #33 (I)V\n" + + " // Stack: 1, Locals: 1\n" + + " static synthetic void access$0(int arg0);\n" + + " 0 iload_0 [arg0]\n" + + " 1 putstatic package2.C.outerField : int"; + + checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation +public void test163() throws Exception { + this.runConformTest(new String[] { + "package1/A.java",//======================= + "package package1;\n" + + "abstract class A {\n" + + " static protected int outerField; {\n" + + " }\n" + + "}\n", + "package1/B.java",//======================= + "package package1;\n" + + "public class B extends A {\n" + + "}\n", + "package2/C.java",//======================= + "package package2;\n" + + "import package1.B;\n" + + "public class C extends B {\n" + + " private final MyInner myInner = new MyInner();\n" + + " private class MyInner {\n" + + " public void innerMethod() {\n" + + " int j = outerField;\n" + + " }\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " final C c = new C();\n" + + " c.myInner.innerMethod();\n" + + " }\n" + + "}\n", + }, + ""); + String expectedOutput = + " // Method descriptor #33 ()I\n" + + " // Stack: 1, Locals: 0\n" + + " static synthetic int access$0();\n" + + " 0 getstatic package2.C.outerField : int"; + checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation +public void test164() throws Exception { + this.runConformTest(new String[] { + "package1/A.java",//======================= + "package package1;\n" + + "abstract class A {\n" + + " static protected int outerField; {\n" + + " }\n" + + "}\n", + "package1/B.java",//======================= + "package package1;\n" + + "public class B extends A {\n" + + "}\n", + "package2/C.java",//======================= + "package package2;\n" + + "import package1.B;\n" + + "public class C extends B {\n" + + " private final MyInner myInner = new MyInner();\n" + + " private class MyInner {\n" + + " public void innerMethod() {\n" + + " outerField = 12;\n" + + " }\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " final C c = new C();\n" + + " c.myInner.innerMethod();\n" + + " }\n" + + "}\n", + }, + ""); + String expectedOutput = + " // Method descriptor #33 (I)V\n" + + " // Stack: 1, Locals: 1\n" + + " static synthetic void access$0(int arg0);\n" + + " 0 iload_0 [arg0]\n" + + " 1 putstatic package2.C.outerField : int"; + checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128563 - variation +public void test165() throws Exception { + this.runConformTest(new String[] { + "package1/A.java",//======================= + "package package1;\n" + + "abstract class A {\n" + + " static protected final void outerMethod() {\n" + + " }\n" + + "}\n", + "package1/B.java",//======================= + "package package1;\n" + + "public class B extends A {\n" + + "}\n", + "package2/C.java",//======================= + "package package2;\n" + + "import package1.B;\n" + + "public class C extends B {\n" + + " private final MyInner myInner = new MyInner();\n" + + " private class MyInner {\n" + + " public void innerMethod() {\n" + + " C.this.outerMethod();\n" + + " }\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " final C c = new C();\n" + + " c.myInner.innerMethod();\n" + + " }\n" + + "}\n", + }, + ""); + String expectedOutput = + " // Method descriptor #8 ()V\n" + + " // Stack: 0, Locals: 0\n" + + " static synthetic void access$0();\n" + + " 0 invokestatic package2.C.outerMethod() : void"; + checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput); +} + public static Class testClass() { return InnerEmulationTest.class; }