Lines 15129-15148
Link Here
|
15129 |
" 6 dup\n" + |
15129 |
" 6 dup\n" + |
15130 |
" 7 invokespecial X() [28]\n" + |
15130 |
" 7 invokespecial X() [28]\n" + |
15131 |
" 10 getfield X.e : XA [29]\n" + |
15131 |
" 10 getfield X.e : XA [29]\n" + |
15132 |
" 13 pop\n" + |
15132 |
" 13 checkcast XAB [31]\n" + |
15133 |
" 14 getstatic XAB.CONST : XB [31]\n" + |
15133 |
" 16 pop\n" + |
15134 |
" 17 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + |
15134 |
" 17 getstatic XAB.CONST : XB [33]\n" + |
15135 |
" 20 new X [1]\n" + |
15135 |
" 20 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + |
15136 |
" 23 dup\n" + |
15136 |
" 23 new X [1]\n" + |
15137 |
" 24 invokespecial X() [28]\n" + |
15137 |
" 26 dup\n" + |
15138 |
" 27 invokevirtual X.foo() : void [43]\n" + |
15138 |
" 27 invokespecial X() [28]\n" + |
15139 |
" 30 return\n" + |
15139 |
" 30 invokevirtual X.foo() : void [43]\n" + |
|
|
15140 |
" 33 return\n" + |
15140 |
" Line numbers:\n" + |
15141 |
" Line numbers:\n" + |
15141 |
" [pc: 0, line: 10]\n" + |
15142 |
" [pc: 0, line: 10]\n" + |
15142 |
" [pc: 20, line: 11]\n" + |
15143 |
" [pc: 23, line: 11]\n" + |
15143 |
" [pc: 30, line: 12]\n" + |
15144 |
" [pc: 33, line: 12]\n" + |
15144 |
" Local variable table:\n" + |
15145 |
" Local variable table:\n" + |
15145 |
" [pc: 0, pc: 31] local: args index: 0 type: java.lang.String[]\n" + |
15146 |
" [pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]\n" + |
15146 |
" \n" + |
15147 |
" \n" + |
15147 |
" // Method descriptor #10 ()V\n" + |
15148 |
" // Method descriptor #10 ()V\n" + |
15148 |
" // Stack: 2, Locals: 1\n" + |
15149 |
" // Stack: 2, Locals: 1\n" + |
Lines 15238-15257
Link Here
|
15238 |
" 6 dup\n" + |
15239 |
" 6 dup\n" + |
15239 |
" 7 invokespecial X() [28]\n" + |
15240 |
" 7 invokespecial X() [28]\n" + |
15240 |
" 10 invokevirtual X.e() : XA [29]\n" + |
15241 |
" 10 invokevirtual X.e() : XA [29]\n" + |
15241 |
" 13 pop\n" + |
15242 |
" 13 checkcast XAB [31]\n" + |
15242 |
" 14 getstatic XAB.CONST : XB [31]\n" + |
15243 |
" 16 pop\n" + |
15243 |
" 17 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + |
15244 |
" 17 getstatic XAB.CONST : XB [33]\n" + |
15244 |
" 20 new X [1]\n" + |
15245 |
" 20 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + |
15245 |
" 23 dup\n" + |
15246 |
" 23 new X [1]\n" + |
15246 |
" 24 invokespecial X() [28]\n" + |
15247 |
" 26 dup\n" + |
15247 |
" 27 invokevirtual X.foo() : void [43]\n" + |
15248 |
" 27 invokespecial X() [28]\n" + |
15248 |
" 30 return\n" + |
15249 |
" 30 invokevirtual X.foo() : void [43]\n" + |
|
|
15250 |
" 33 return\n" + |
15249 |
" Line numbers:\n" + |
15251 |
" Line numbers:\n" + |
15250 |
" [pc: 0, line: 10]\n" + |
15252 |
" [pc: 0, line: 10]\n" + |
15251 |
" [pc: 20, line: 11]\n" + |
15253 |
" [pc: 23, line: 11]\n" + |
15252 |
" [pc: 30, line: 12]\n" + |
15254 |
" [pc: 33, line: 12]\n" + |
15253 |
" Local variable table:\n" + |
15255 |
" Local variable table:\n" + |
15254 |
" [pc: 0, pc: 31] local: args index: 0 type: java.lang.String[]\n" + |
15256 |
" [pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]\n" + |
15255 |
" \n" + |
15257 |
" \n" + |
15256 |
" // Method descriptor #6 ()V\n" + |
15258 |
" // Method descriptor #6 ()V\n" + |
15257 |
" // Stack: 2, Locals: 1\n" + |
15259 |
" // Stack: 2, Locals: 1\n" + |
Lines 15360-15377
Link Here
|
15360 |
" 5 invokespecial X$1(X) [30]\n" + |
15362 |
" 5 invokespecial X$1(X) [30]\n" + |
15361 |
" 8 invokevirtual X$1.run() : void [33]\n" + |
15363 |
" 8 invokevirtual X$1.run() : void [33]\n" + |
15362 |
" 11 getstatic java.lang.System.out : java.io.PrintStream [36]\n" + |
15364 |
" 11 getstatic java.lang.System.out : java.io.PrintStream [36]\n" + |
15363 |
" 14 getstatic XB.CONST : XB [42]\n" + |
15365 |
" 14 aload_0 [this]\n" + |
15364 |
" 17 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [48]\n" + |
15366 |
" 15 getfield X.e : XA [42]\n" + |
15365 |
" 20 return\n" + |
15367 |
" 18 checkcast XB [44]\n" + |
|
|
15368 |
" 21 pop\n" + |
15369 |
" 22 getstatic XB.CONST : XB [46]\n" + |
15370 |
" 25 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [50]\n" + |
15371 |
" 28 return\n" + |
15366 |
" Line numbers:\n" + |
15372 |
" Line numbers:\n" + |
15367 |
" [pc: 0, line: 13]\n" + |
15373 |
" [pc: 0, line: 13]\n" + |
15368 |
" [pc: 8, line: 17]\n" + |
15374 |
" [pc: 8, line: 17]\n" + |
15369 |
" [pc: 11, line: 18]\n" + |
15375 |
" [pc: 11, line: 18]\n" + |
15370 |
" [pc: 20, line: 19]\n" + |
15376 |
" [pc: 28, line: 19]\n" + |
15371 |
" Local variable table:\n" + |
15377 |
" Local variable table:\n" + |
15372 |
" [pc: 0, pc: 21] local: this index: 0 type: X\n" + |
15378 |
" [pc: 0, pc: 29] local: this index: 0 type: X\n" + |
15373 |
" Local variable type table:\n" + |
15379 |
" Local variable type table:\n" + |
15374 |
" [pc: 0, pc: 21] local: this index: 0 type: X<E>\n"; |
15380 |
" [pc: 0, pc: 29] local: this index: 0 type: X<E>\n"; |
15375 |
|
15381 |
|
15376 |
try { |
15382 |
try { |
15377 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
15383 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
Lines 33663-33669
Link Here
|
33663 |
" 5 ldc <String \"[B.local_field]\"> [32]\n" + |
33669 |
" 5 ldc <String \"[B.local_field]\"> [32]\n" + |
33664 |
" 7 invokestatic A.foo(java.lang.String) : Value [17]\n" + |
33670 |
" 7 invokestatic A.foo(java.lang.String) : Value [17]\n" + |
33665 |
" 10 putfield B.local_field : Value [34]\n" + |
33671 |
" 10 putfield B.local_field : Value [34]\n" + |
33666 |
" 13 getstatic I.CONST : Value [36]\n" + |
33672 |
" 13 getstatic B.CONST : Value [36]\n" + |
33667 |
" 16 pop\n" + |
33673 |
" 16 pop\n" + |
33668 |
" 17 getstatic Value.NAME : java.lang.String [39]\n" + |
33674 |
" 17 getstatic Value.NAME : java.lang.String [39]\n" + |
33669 |
" 20 pop\n" + |
33675 |
" 20 pop\n" + |
Lines 36736-36743
Link Here
|
36736 |
}, |
36742 |
}, |
36737 |
""); |
36743 |
""); |
36738 |
} |
36744 |
} |
36739 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591 |
36745 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591 |
36740 |
// ?: cuts assignment context |
36746 |
//?: cuts assignment context |
36741 |
public void test1109() { |
36747 |
public void test1109() { |
36742 |
this.runNegativeTest( |
36748 |
this.runNegativeTest( |
36743 |
new String[] { |
36749 |
new String[] { |
Lines 36763-36770
Link Here
|
36763 |
"Type mismatch: cannot convert from Y<Object> to Y<String>\n" + |
36769 |
"Type mismatch: cannot convert from Y<Object> to Y<String>\n" + |
36764 |
"----------\n"); |
36770 |
"----------\n"); |
36765 |
} |
36771 |
} |
36766 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591 |
36772 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591 |
36767 |
// variant |
36773 |
//variant |
36768 |
public void test1110() { |
36774 |
public void test1110() { |
36769 |
this.runConformTest( |
36775 |
this.runConformTest( |
36770 |
new String[] { |
36776 |
new String[] { |
Lines 36785-36788
Link Here
|
36785 |
}, |
36791 |
}, |
36786 |
""); |
36792 |
""); |
36787 |
} |
36793 |
} |
|
|
36794 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 |
36795 |
public void test1111() { |
36796 |
Map settings = getCompilerOptions(); |
36797 |
settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
36798 |
this.runConformTest( |
36799 |
new String[] { |
36800 |
"X.java", |
36801 |
"class A<T> {\n" + |
36802 |
" public T foo(Object o) {\n" + |
36803 |
" return (T) o; // should get unchecked warning\n" + |
36804 |
" }\n" + |
36805 |
"}\n" + |
36806 |
"\n" + |
36807 |
"public class X {\n" + |
36808 |
" public static void main(String[] args) {\n" + |
36809 |
" A<X> a = new A<X>();\n" + |
36810 |
" try {\n" + |
36811 |
" X s = a.foo(new Object());\n" + |
36812 |
" } catch(ClassCastException e) {\n" + |
36813 |
" System.out.println(\"SUCCESS\");\n" + |
36814 |
" return;\n" + |
36815 |
" }\n" + |
36816 |
" System.out.println(\"FAILED\");\n" + |
36817 |
" }\n" + |
36818 |
"}\n", // ================= |
36819 |
}, |
36820 |
"SUCCESS", |
36821 |
null, |
36822 |
true, |
36823 |
null, |
36824 |
settings, |
36825 |
null); |
36826 |
} |
36827 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
36828 |
public void test1112() { |
36829 |
Map settings = getCompilerOptions(); |
36830 |
settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
36831 |
this.runConformTest( |
36832 |
new String[] { |
36833 |
"X.java", |
36834 |
"class A<T> {\n" + |
36835 |
" public T foo;\n" + |
36836 |
"}\n" + |
36837 |
"\n" + |
36838 |
"public class X {\n" + |
36839 |
" public static void main(String[] args) {\n" + |
36840 |
" A<X> a = new A<X>();\n" + |
36841 |
" A ua = a;\n" + |
36842 |
" ua.foo = new Object();\n" + |
36843 |
" try {\n" + |
36844 |
" X s = a.foo;\n" + |
36845 |
" } catch(ClassCastException e) {\n" + |
36846 |
" System.out.println(\"SUCCESS\");\n" + |
36847 |
" return;\n" + |
36848 |
" }\n" + |
36849 |
" System.out.println(\"FAILED\");\n" + |
36850 |
" }\n" + |
36851 |
"}\n", // ================= |
36852 |
}, |
36853 |
"SUCCESS", |
36854 |
null, |
36855 |
true, |
36856 |
null, |
36857 |
settings, |
36858 |
null); |
36859 |
} |
36860 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
36861 |
public void test1113() { |
36862 |
Map settings = getCompilerOptions(); |
36863 |
settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
36864 |
this.runConformTest( |
36865 |
new String[] { |
36866 |
"X.java", |
36867 |
"class A<T> {\n" + |
36868 |
" public T foo;\n" + |
36869 |
"}\n" + |
36870 |
"\n" + |
36871 |
"public class X extends A<X>{\n" + |
36872 |
" public static void main(String[] args) {\n" + |
36873 |
" new X().foo();\n" + |
36874 |
" }\n" + |
36875 |
" public void foo() {\n" + |
36876 |
" A ua = this;\n" + |
36877 |
" ua.foo = new Object();\n" + |
36878 |
" try {\n" + |
36879 |
" X s = foo;\n" + |
36880 |
" } catch(ClassCastException e) {\n" + |
36881 |
" System.out.println(\"SUCCESS\");\n" + |
36882 |
" return;\n" + |
36883 |
" }\n" + |
36884 |
" System.out.println(\"FAILED\");\n" + |
36885 |
" }\n" + |
36886 |
"}\n", // ================= |
36887 |
}, |
36888 |
"SUCCESS", |
36889 |
null, |
36890 |
true, |
36891 |
null, |
36892 |
settings, |
36893 |
null); |
36894 |
} |
36895 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
36896 |
public void test1114() { |
36897 |
Map settings = getCompilerOptions(); |
36898 |
settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
36899 |
this.runConformTest( |
36900 |
new String[] { |
36901 |
"X.java", |
36902 |
"class A<T> {\n" + |
36903 |
" public T foo;\n" + |
36904 |
"}\n" + |
36905 |
"\n" + |
36906 |
"public class X extends A<X>{\n" + |
36907 |
" public static void main(String[] args) {\n" + |
36908 |
" new X().foo();\n" + |
36909 |
" }\n" + |
36910 |
" public void foo() {\n" + |
36911 |
" A ua = this;\n" + |
36912 |
" ua.foo = new Object();\n" + |
36913 |
" try {\n" + |
36914 |
" X s = this.foo;\n" + |
36915 |
" } catch(ClassCastException e) {\n" + |
36916 |
" System.out.println(\"SUCCESS\");\n" + |
36917 |
" return;\n" + |
36918 |
" }\n" + |
36919 |
" System.out.println(\"FAILED\");\n" + |
36920 |
" }\n" + |
36921 |
"}\n", // ================= |
36922 |
}, |
36923 |
"SUCCESS", |
36924 |
null, |
36925 |
true, |
36926 |
null, |
36927 |
settings, |
36928 |
null); |
36929 |
} |
36930 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
36931 |
public void test1115() { |
36932 |
Map settings = getCompilerOptions(); |
36933 |
settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
36934 |
this.runConformTest( |
36935 |
new String[] { |
36936 |
"X.java", |
36937 |
"class A<T> {\n" + |
36938 |
" public T foo;\n" + |
36939 |
"}\n" + |
36940 |
"\n" + |
36941 |
"public class X {\n" + |
36942 |
" static X ROOT;\n" + |
36943 |
" public static void main(String[] args) {\n" + |
36944 |
" A<X> a = new A<X>();\n" + |
36945 |
" A ua = a;\n" + |
36946 |
" ua.foo = new Object();\n" + |
36947 |
" try {\n" + |
36948 |
" X s = a.foo.ROOT;\n" + |
36949 |
" } catch(ClassCastException e) {\n" + |
36950 |
" System.out.println(\"SUCCESS\");\n" + |
36951 |
" return;\n" + |
36952 |
" }\n" + |
36953 |
" System.out.println(\"FAILED\");\n" + |
36954 |
" }\n" + |
36955 |
"}\n", // ================= |
36956 |
}, |
36957 |
"SUCCESS", |
36958 |
null, |
36959 |
true, |
36960 |
null, |
36961 |
settings, |
36962 |
null); |
36963 |
} |
36964 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
36965 |
public void test1116() { |
36966 |
this.runConformTest( |
36967 |
new String[] { |
36968 |
"X.java", |
36969 |
"import java.io.Serializable;\n" + |
36970 |
"\n" + |
36971 |
"interface I {\n" + |
36972 |
" int CONST = 1;\n" + |
36973 |
"}\n" + |
36974 |
"\n" + |
36975 |
"class Z<T extends Serializable&I> {\n" + |
36976 |
" T c;\n" + |
36977 |
" Z(T c) {\n" + |
36978 |
" this.c = c;\n" + |
36979 |
" }\n" + |
36980 |
" int foo() {\n" + |
36981 |
" return c.CONST;\n" + |
36982 |
" }\n" + |
36983 |
"}\n" + |
36984 |
"\n" + |
36985 |
"public class X implements Serializable, I {\n" + |
36986 |
" public static void main(String argv[]) {\n" + |
36987 |
" Z<X> z = new Z<X>(new X());\n" + |
36988 |
" Z rawz = z;\n" + |
36989 |
" rawz.c = new Serializable(){};\n" + |
36990 |
" try {\n" + |
36991 |
" z.foo();\n" + |
36992 |
" } catch(ClassCastException e) {\n" + |
36993 |
" System.out.println(\"SUCCESS\");\n" + |
36994 |
" }\n" + |
36995 |
" }\n" + |
36996 |
"}\n", // ================= |
36997 |
}, |
36998 |
"SUCCESS"); |
36999 |
} |
37000 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation |
37001 |
public void test1117() { |
37002 |
Map options = getCompilerOptions(); |
37003 |
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT); |
37004 |
this.runConformTest( |
37005 |
new String[] { |
37006 |
"X.java", |
37007 |
"interface I<T> {\n" + |
37008 |
" Value<String> CONST = null;\n" + |
37009 |
"}\n" + |
37010 |
"class Value<V> {\n" + |
37011 |
" String NAME = \"VALUE\";\n" + |
37012 |
"}\n" + |
37013 |
"class B<V> implements I<V> {\n" + |
37014 |
" B(Value<String> param) {\n" + |
37015 |
" Value<String> v0 = CONST;\n" + |
37016 |
" Value<String> v1 = this.CONST;\n" + |
37017 |
" String s2 = CONST.NAME;\n" + |
37018 |
" Value<String> v3 = I.CONST;\n" + |
37019 |
" Value<String> v4 = B.CONST;\n" + |
37020 |
" }\n" + |
37021 |
"}\n" + |
37022 |
"public class X {\n" + |
37023 |
" public static void main(String[] args) {\n" + |
37024 |
" try {\n" + |
37025 |
" new B<String>(new Value<String>());\n" + |
37026 |
" } catch(NullPointerException e) {\n" + |
37027 |
" System.out.println(\"SUCCESS\");\n" + |
37028 |
" }\n" + |
37029 |
" }\n" + |
37030 |
"}\n", // ================= |
37031 |
}, |
37032 |
"SUCCESS", |
37033 |
null, |
37034 |
false, |
37035 |
null, |
37036 |
options, |
37037 |
null); |
37038 |
// check the reference to I.CONST is generated as B.CONST, except for v3 still issuing I.CONST |
37039 |
String expectedOutput = |
37040 |
" // Method descriptor #8 (LValue;)V\n" + |
37041 |
" // Signature: (LValue<Ljava/lang/String;>;)V\n" + |
37042 |
" // Stack: 1, Locals: 2\n" + |
37043 |
" B(Value param);\n" + |
37044 |
" 0 aload_0 [this]\n" + |
37045 |
" 1 invokespecial java.lang.Object() [12]\n" + |
37046 |
" 4 getstatic B.CONST : Value [15]\n" + |
37047 |
" 7 pop\n" + |
37048 |
" 8 getstatic B.CONST : Value [15]\n" + |
37049 |
" 11 pop\n" + |
37050 |
" 12 getstatic B.CONST : Value [15]\n" + |
37051 |
" 15 getfield Value.NAME : java.lang.String [19]\n" + |
37052 |
" 18 pop\n" + |
37053 |
" 19 getstatic I.CONST : Value [25]\n" + |
37054 |
" 22 pop\n" + |
37055 |
" 23 getstatic B.CONST : Value [15]\n" + |
37056 |
" 26 pop\n" + |
37057 |
" 27 return\n" + |
37058 |
" Line numbers:\n" + |
37059 |
" [pc: 0, line: 8]\n" + |
37060 |
" [pc: 4, line: 9]\n" + |
37061 |
" [pc: 8, line: 10]\n" + |
37062 |
" [pc: 12, line: 11]\n" + |
37063 |
" [pc: 19, line: 12]\n" + |
37064 |
" [pc: 23, line: 13]\n" + |
37065 |
" [pc: 27, line: 14]\n" + |
37066 |
" Local variable table:\n" + |
37067 |
" [pc: 0, pc: 28] local: this index: 0 type: B\n" + |
37068 |
" [pc: 0, pc: 28] local: param index: 1 type: Value\n" + |
37069 |
" Local variable type table:\n" + |
37070 |
" [pc: 0, pc: 28] local: this index: 0 type: B<V>\n" + |
37071 |
" [pc: 0, pc: 28] local: param index: 1 type: Value<java.lang.String>\n"; |
37072 |
|
37073 |
try { |
37074 |
File f = new File(OUTPUT_DIR + File.separator + "B.class"); |
37075 |
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f); |
37076 |
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
37077 |
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED); |
37078 |
int index = result.indexOf(expectedOutput); |
37079 |
if (index == -1 || expectedOutput.length() == 0) { |
37080 |
System.out.println(Util.displayString(result, 3)); |
37081 |
} |
37082 |
if (index == -1) { |
37083 |
assertEquals("Wrong contents", expectedOutput, result); |
37084 |
} |
37085 |
} catch (org.eclipse.jdt.core.util.ClassFormatException e) { |
37086 |
assertTrue(false); |
37087 |
} catch (IOException e) { |
37088 |
assertTrue(false); |
37089 |
} |
37090 |
} |
37091 |
|
36788 |
} |
37092 |
} |