Lines 6766-6771
Link Here
|
6766 |
}, |
6766 |
}, |
6767 |
"SUCCESS"); |
6767 |
"SUCCESS"); |
6768 |
} |
6768 |
} |
|
|
6769 |
|
6770 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=303448 |
6771 |
// To check that code gen is not optimized for an if statement |
6772 |
// where a local variable's definite nullness or otherwise is known because of |
6773 |
// an earlier assert expression |
6774 |
public void testBug303448a() throws Exception { |
6775 |
if (this.complianceLevel >= ClassFileConstants.JDK1_4) { |
6776 |
this.runConformTest( |
6777 |
new String[] { |
6778 |
"X.java", |
6779 |
"public class X {\n" + |
6780 |
" public void foo(String[] args, Object foo) {\n" + |
6781 |
" assert foo != null;" + |
6782 |
" if (foo!= null) {\n" + |
6783 |
" System.out.println(\"foo is not null\");\n" + |
6784 |
" } else {\n" + |
6785 |
" System.out.println(\"foo is null\");\n" + |
6786 |
" }\n" + |
6787 |
" }\n" + |
6788 |
"}\n", |
6789 |
}, |
6790 |
"", |
6791 |
null, |
6792 |
true, |
6793 |
null, |
6794 |
getCompilerOptions(), |
6795 |
null); // custom requestor |
6796 |
|
6797 |
String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_5 ? |
6798 |
" // Method descriptor #49 ([Ljava/lang/String;Ljava/lang/Object;)V\n" + |
6799 |
" // Stack: 2, Locals: 3\n" + |
6800 |
" public void foo(java.lang.String[] args, java.lang.Object foo);\n" + |
6801 |
" 0 getstatic X.$assertionsDisabled : boolean [38]\n" + |
6802 |
" 3 ifne 18\n" + |
6803 |
" 6 aload_2 [foo]\n" + |
6804 |
" 7 ifnonnull 18\n" + |
6805 |
" 10 new java.lang.AssertionError [50]\n" + |
6806 |
" 13 dup\n" + |
6807 |
" 14 invokespecial java.lang.AssertionError() [52]\n" + |
6808 |
" 17 athrow\n" + |
6809 |
" 18 aload_2 [foo]\n" + |
6810 |
" 19 ifnull 33\n" + |
6811 |
" 22 getstatic java.lang.System.out : java.io.PrintStream [53]\n" + |
6812 |
" 25 ldc <String \"foo is not null\"> [59]\n" + |
6813 |
" 27 invokevirtual java.io.PrintStream.println(java.lang.String) : void [61]\n" + |
6814 |
" 30 goto 41\n" + |
6815 |
" 33 getstatic java.lang.System.out : java.io.PrintStream [53]\n" + |
6816 |
" 36 ldc <String \"foo is null\"> [66]\n" + |
6817 |
" 38 invokevirtual java.io.PrintStream.println(java.lang.String) : void [61]\n" + |
6818 |
" 41 return\n" + |
6819 |
" Line numbers:\n" + |
6820 |
" [pc: 0, line: 3]\n" + |
6821 |
" [pc: 22, line: 4]\n" + |
6822 |
" [pc: 33, line: 6]\n" + |
6823 |
" [pc: 41, line: 8]\n" + |
6824 |
" Local variable table:\n" + |
6825 |
" [pc: 0, pc: 42] local: this index: 0 type: X\n" + |
6826 |
" [pc: 0, pc: 42] local: args index: 1 type: java.lang.String[]\n" + |
6827 |
" [pc: 0, pc: 42] local: foo index: 2 type: java.lang.Object\n" |
6828 |
: this.complianceLevel < ClassFileConstants.JDK1_6 ? |
6829 |
" // Method descriptor #26 ([Ljava/lang/String;Ljava/lang/Object;)V\n" + |
6830 |
" // Stack: 2, Locals: 3\n" + |
6831 |
" public void foo(java.lang.String[] args, java.lang.Object foo);\n" + |
6832 |
" 0 getstatic X.$assertionsDisabled : boolean [16]\n" + |
6833 |
" 3 ifne 18\n" + |
6834 |
" 6 aload_2 [foo]\n" + |
6835 |
" 7 ifnonnull 18\n" + |
6836 |
" 10 new java.lang.AssertionError [27]\n" + |
6837 |
" 13 dup\n" + |
6838 |
" 14 invokespecial java.lang.AssertionError() [29]\n" + |
6839 |
" 17 athrow\n" + |
6840 |
" 18 aload_2 [foo]\n" + |
6841 |
" 19 ifnull 33\n" + |
6842 |
" 22 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
6843 |
" 25 ldc <String \"foo is not null\"> [36]\n" + |
6844 |
" 27 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
6845 |
" 30 goto 41\n" + |
6846 |
" 33 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
6847 |
" 36 ldc <String \"foo is null\"> [44]\n" + |
6848 |
" 38 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
6849 |
" 41 return\n" + |
6850 |
" Line numbers:\n" + |
6851 |
" [pc: 0, line: 3]\n" + |
6852 |
" [pc: 22, line: 4]\n" + |
6853 |
" [pc: 33, line: 6]\n" + |
6854 |
" [pc: 41, line: 8]\n" + |
6855 |
" Local variable table:\n" + |
6856 |
" [pc: 0, pc: 42] local: this index: 0 type: X\n" + |
6857 |
" [pc: 0, pc: 42] local: args index: 1 type: java.lang.String[]\n" + |
6858 |
" [pc: 0, pc: 42] local: foo index: 2 type: java.lang.Object\n" |
6859 |
: " // Method descriptor #27 ([Ljava/lang/String;Ljava/lang/Object;)V\n" + |
6860 |
" // Stack: 2, Locals: 3\n" + |
6861 |
" public void foo(java.lang.String[] args, java.lang.Object foo);\n" + |
6862 |
" 0 getstatic X.$assertionsDisabled : boolean [16]\n" + |
6863 |
" 3 ifne 18\n" + |
6864 |
" 6 aload_2 [foo]\n" + |
6865 |
" 7 ifnonnull 18\n" + |
6866 |
" 10 new java.lang.AssertionError [28]\n" + |
6867 |
" 13 dup\n" + |
6868 |
" 14 invokespecial java.lang.AssertionError() [30]\n" + |
6869 |
" 17 athrow\n" + |
6870 |
" 18 aload_2 [foo]\n" + |
6871 |
" 19 ifnull 33\n" + |
6872 |
" 22 getstatic java.lang.System.out : java.io.PrintStream [31]\n" + |
6873 |
" 25 ldc <String \"foo is not null\"> [37]\n" + |
6874 |
" 27 invokevirtual java.io.PrintStream.println(java.lang.String) : void [39]\n" + |
6875 |
" 30 goto 41\n" + |
6876 |
" 33 getstatic java.lang.System.out : java.io.PrintStream [31]\n" + |
6877 |
" 36 ldc <String \"foo is null\"> [45]\n" + |
6878 |
" 38 invokevirtual java.io.PrintStream.println(java.lang.String) : void [39]\n" + |
6879 |
" 41 return\n" + |
6880 |
" Line numbers:\n" + |
6881 |
" [pc: 0, line: 3]\n" + |
6882 |
" [pc: 22, line: 4]\n" + |
6883 |
" [pc: 33, line: 6]\n" + |
6884 |
" [pc: 41, line: 8]\n" + |
6885 |
" Local variable table:\n" + |
6886 |
" [pc: 0, pc: 42] local: this index: 0 type: X\n" + |
6887 |
" [pc: 0, pc: 42] local: args index: 1 type: java.lang.String[]\n" + |
6888 |
" [pc: 0, pc: 42] local: foo index: 2 type: java.lang.Object\n" + |
6889 |
" Stack map table: number of frames 3\n" + |
6890 |
" [pc: 18, same]\n" + |
6891 |
" [pc: 33, same]\n" + |
6892 |
" [pc: 41, same]\n" ; |
6893 |
|
6894 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
6895 |
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f); |
6896 |
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
6897 |
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED); |
6898 |
int index = result.indexOf(expectedOutput); |
6899 |
if (index == -1 || expectedOutput.length() == 0) { |
6900 |
System.out.println(Util.displayString(result, 3)); |
6901 |
} |
6902 |
if (index == -1) { |
6903 |
assertEquals("Wrong contents", expectedOutput, result); |
6904 |
} |
6905 |
} |
6906 |
} |
6907 |
|
6908 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=303448 |
6909 |
// To check that code gen is not optimized for an if statement |
6910 |
// where a local variable's definite nullness or otherwise is known because of |
6911 |
// an earlier assert expression |
6912 |
public void testBug303448b() throws Exception { |
6913 |
if (this.complianceLevel >= ClassFileConstants.JDK1_4) { |
6914 |
this.runConformTest( |
6915 |
new String[] { |
6916 |
"X.java", |
6917 |
"public class X {\n" + |
6918 |
" public void foo() {\n" + |
6919 |
" Object foo = null;\n" + |
6920 |
" Object foo2 = null;\n" + |
6921 |
" assert (foo != null && foo2 != null);\n" + |
6922 |
" if (foo != null) {\n" + |
6923 |
" System.out.println(\"foo is not null\");\n" + |
6924 |
" } else {\n" + |
6925 |
" System.out.println(\"foo is null\");\n" + |
6926 |
" }\n" + |
6927 |
" if (foo2 != null) {\n" + |
6928 |
" System.out.println(\"foo2 is not null\");\n" + |
6929 |
" } else {\n" + |
6930 |
" System.out.println(\"foo2 is null\");\n" + |
6931 |
" }\n" + |
6932 |
" }\n" + |
6933 |
"}\n", |
6934 |
}, |
6935 |
"", |
6936 |
null, |
6937 |
true, |
6938 |
null, |
6939 |
getCompilerOptions(), |
6940 |
null); // custom requestor |
6941 |
|
6942 |
String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_5? |
6943 |
" // Method descriptor #11 ()V\n" + |
6944 |
" // Stack: 2, Locals: 3\n" + |
6945 |
" public void foo();\n" + |
6946 |
" 0 aconst_null\n" + |
6947 |
" 1 astore_1 [foo]\n" + |
6948 |
" 2 aconst_null\n" + |
6949 |
" 3 astore_2 [foo2]\n" + |
6950 |
" 4 getstatic X.$assertionsDisabled : boolean [38]\n" + |
6951 |
" 7 ifne 26\n" + |
6952 |
" 10 aload_1 [foo]\n" + |
6953 |
" 11 ifnull 18\n" + |
6954 |
" 14 aload_2 [foo2]\n" + |
6955 |
" 15 ifnonnull 26\n" + |
6956 |
" 18 new java.lang.AssertionError [49]\n" + |
6957 |
" 21 dup\n" + |
6958 |
" 22 invokespecial java.lang.AssertionError() [51]\n" + |
6959 |
" 25 athrow\n" + |
6960 |
" 26 aload_1 [foo]\n" + |
6961 |
" 27 ifnull 41\n" + |
6962 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
6963 |
" 33 ldc <String \"foo is not null\"> [58]\n" + |
6964 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
6965 |
" 38 goto 49\n" + |
6966 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
6967 |
" 44 ldc <String \"foo is null\"> [65]\n" + |
6968 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
6969 |
" 49 aload_2 [foo2]\n" + |
6970 |
" 50 ifnull 64\n" + |
6971 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
6972 |
" 56 ldc <String \"foo2 is not null\"> [67]\n" + |
6973 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
6974 |
" 61 goto 72\n" + |
6975 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
6976 |
" 67 ldc <String \"foo2 is null\"> [69]\n" + |
6977 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
6978 |
" 72 return\n" + |
6979 |
" Line numbers:\n" + |
6980 |
" [pc: 0, line: 3]\n" + |
6981 |
" [pc: 2, line: 4]\n" + |
6982 |
" [pc: 4, line: 5]\n" + |
6983 |
" [pc: 26, line: 6]\n" + |
6984 |
" [pc: 30, line: 7]\n" + |
6985 |
" [pc: 41, line: 9]\n" + |
6986 |
" [pc: 49, line: 11]\n" + |
6987 |
" [pc: 53, line: 12]\n" + |
6988 |
" [pc: 64, line: 14]\n" + |
6989 |
" [pc: 72, line: 16]\n" + |
6990 |
" Local variable table:\n" + |
6991 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
6992 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
6993 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" |
6994 |
: this.complianceLevel < ClassFileConstants.JDK1_6? |
6995 |
" // Method descriptor #8 ()V\n" + |
6996 |
" // Stack: 2, Locals: 3\n" + |
6997 |
" public void foo();\n" + |
6998 |
" 0 aconst_null\n" + |
6999 |
" 1 astore_1 [foo]\n" + |
7000 |
" 2 aconst_null\n" + |
7001 |
" 3 astore_2 [foo2]\n" + |
7002 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7003 |
" 7 ifne 26\n" + |
7004 |
" 10 aload_1 [foo]\n" + |
7005 |
" 11 ifnull 18\n" + |
7006 |
" 14 aload_2 [foo2]\n" + |
7007 |
" 15 ifnonnull 26\n" + |
7008 |
" 18 new java.lang.AssertionError [26]\n" + |
7009 |
" 21 dup\n" + |
7010 |
" 22 invokespecial java.lang.AssertionError() [28]\n" + |
7011 |
" 25 athrow\n" + |
7012 |
" 26 aload_1 [foo]\n" + |
7013 |
" 27 ifnull 41\n" + |
7014 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7015 |
" 33 ldc <String \"foo is not null\"> [35]\n" + |
7016 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7017 |
" 38 goto 49\n" + |
7018 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7019 |
" 44 ldc <String \"foo is null\"> [43]\n" + |
7020 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7021 |
" 49 aload_2 [foo2]\n" + |
7022 |
" 50 ifnull 64\n" + |
7023 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7024 |
" 56 ldc <String \"foo2 is not null\"> [45]\n" + |
7025 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7026 |
" 61 goto 72\n" + |
7027 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7028 |
" 67 ldc <String \"foo2 is null\"> [47]\n" + |
7029 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7030 |
" 72 return\n" + |
7031 |
" Line numbers:\n" + |
7032 |
" [pc: 0, line: 3]\n" + |
7033 |
" [pc: 2, line: 4]\n" + |
7034 |
" [pc: 4, line: 5]\n" + |
7035 |
" [pc: 26, line: 6]\n" + |
7036 |
" [pc: 30, line: 7]\n" + |
7037 |
" [pc: 41, line: 9]\n" + |
7038 |
" [pc: 49, line: 11]\n" + |
7039 |
" [pc: 53, line: 12]\n" + |
7040 |
" [pc: 64, line: 14]\n" + |
7041 |
" [pc: 72, line: 16]\n" + |
7042 |
" Local variable table:\n" + |
7043 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
7044 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
7045 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" |
7046 |
: " // Method descriptor #8 ()V\n" + |
7047 |
" // Stack: 2, Locals: 3\n" + |
7048 |
" public void foo();\n" + |
7049 |
" 0 aconst_null\n" + |
7050 |
" 1 astore_1 [foo]\n" + |
7051 |
" 2 aconst_null\n" + |
7052 |
" 3 astore_2 [foo2]\n" + |
7053 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7054 |
" 7 ifne 26\n" + |
7055 |
" 10 aload_1 [foo]\n" + |
7056 |
" 11 ifnull 18\n" + |
7057 |
" 14 aload_2 [foo2]\n" + |
7058 |
" 15 ifnonnull 26\n" + |
7059 |
" 18 new java.lang.AssertionError [27]\n" + |
7060 |
" 21 dup\n" + |
7061 |
" 22 invokespecial java.lang.AssertionError() [29]\n" + |
7062 |
" 25 athrow\n" + |
7063 |
" 26 aload_1 [foo]\n" + |
7064 |
" 27 ifnull 41\n" + |
7065 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7066 |
" 33 ldc <String \"foo is not null\"> [36]\n" + |
7067 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7068 |
" 38 goto 49\n" + |
7069 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7070 |
" 44 ldc <String \"foo is null\"> [44]\n" + |
7071 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7072 |
" 49 aload_2 [foo2]\n" + |
7073 |
" 50 ifnull 64\n" + |
7074 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7075 |
" 56 ldc <String \"foo2 is not null\"> [46]\n" + |
7076 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7077 |
" 61 goto 72\n" + |
7078 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7079 |
" 67 ldc <String \"foo2 is null\"> [48]\n" + |
7080 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7081 |
" 72 return\n" + |
7082 |
" Line numbers:\n" + |
7083 |
" [pc: 0, line: 3]\n" + |
7084 |
" [pc: 2, line: 4]\n" + |
7085 |
" [pc: 4, line: 5]\n" + |
7086 |
" [pc: 26, line: 6]\n" + |
7087 |
" [pc: 30, line: 7]\n" + |
7088 |
" [pc: 41, line: 9]\n" + |
7089 |
" [pc: 49, line: 11]\n" + |
7090 |
" [pc: 53, line: 12]\n" + |
7091 |
" [pc: 64, line: 14]\n" + |
7092 |
" [pc: 72, line: 16]\n" + |
7093 |
" Local variable table:\n" + |
7094 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
7095 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
7096 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" + |
7097 |
" Stack map table: number of frames 6\n" + |
7098 |
" [pc: 18, append: {java.lang.Object, java.lang.Object}]\n" + |
7099 |
" [pc: 26, same]\n" + |
7100 |
" [pc: 41, same]\n" + |
7101 |
" [pc: 49, same]\n" + |
7102 |
" [pc: 64, same]\n" + |
7103 |
" [pc: 72, same]\n"; |
7104 |
|
7105 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
7106 |
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f); |
7107 |
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
7108 |
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED); |
7109 |
int index = result.indexOf(expectedOutput); |
7110 |
if (index == -1 || expectedOutput.length() == 0) { |
7111 |
System.out.println(Util.displayString(result, 3)); |
7112 |
} |
7113 |
if (index == -1) { |
7114 |
assertEquals("Wrong contents", expectedOutput, result); |
7115 |
} |
7116 |
} |
7117 |
} |
7118 |
|
7119 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=303448 |
7120 |
// To check that code gen is not optimized for an if statement |
7121 |
// where a local variable's definite nullness or otherwise is known because of |
7122 |
// an earlier assert expression (inside looping context) |
7123 |
public void testBug303448c() throws Exception { |
7124 |
if (this.complianceLevel >= ClassFileConstants.JDK1_4) { |
7125 |
this.runConformTest( |
7126 |
new String[] { |
7127 |
"X.java", |
7128 |
"public class X {\n" + |
7129 |
" public void foo() {\n" + |
7130 |
" Object foo = null;\n" + |
7131 |
" Object foo2 = null;\n" + |
7132 |
" while(true){\n" + |
7133 |
" assert (foo != null && foo2 != null);\n" + |
7134 |
" if (foo != null) {\n" + |
7135 |
" System.out.println(\"foo is not null\");\n" + |
7136 |
" } else {\n" + |
7137 |
" System.out.println(\"foo is null\");\n" + |
7138 |
" }\n" + |
7139 |
" if (foo2 != null) {\n" + |
7140 |
" System.out.println(\"foo2 is not null\");\n" + |
7141 |
" } else {\n" + |
7142 |
" System.out.println(\"foo2 is null\");\n" + |
7143 |
" }\n" + |
7144 |
" }\n" + |
7145 |
" }\n" + |
7146 |
"}\n", |
7147 |
}, |
7148 |
"", |
7149 |
null, |
7150 |
true, |
7151 |
null, |
7152 |
getCompilerOptions(), |
7153 |
null); // custom requestor |
7154 |
|
7155 |
String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_5? |
7156 |
" // Method descriptor #11 ()V\n" + |
7157 |
" // Stack: 2, Locals: 3\n" + |
7158 |
" public void foo();\n" + |
7159 |
" 0 aconst_null\n" + |
7160 |
" 1 astore_1 [foo]\n" + |
7161 |
" 2 aconst_null\n" + |
7162 |
" 3 astore_2 [foo2]\n" + |
7163 |
" 4 getstatic X.$assertionsDisabled : boolean [38]\n" + |
7164 |
" 7 ifne 26\n" + |
7165 |
" 10 aload_1 [foo]\n" + |
7166 |
" 11 ifnull 18\n" + |
7167 |
" 14 aload_2 [foo2]\n" + |
7168 |
" 15 ifnonnull 26\n" + |
7169 |
" 18 new java.lang.AssertionError [49]\n" + |
7170 |
" 21 dup\n" + |
7171 |
" 22 invokespecial java.lang.AssertionError() [51]\n" + |
7172 |
" 25 athrow\n" + |
7173 |
" 26 aload_1 [foo]\n" + |
7174 |
" 27 ifnull 41\n" + |
7175 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7176 |
" 33 ldc <String \"foo is not null\"> [58]\n" + |
7177 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7178 |
" 38 goto 49\n" + |
7179 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7180 |
" 44 ldc <String \"foo is null\"> [65]\n" + |
7181 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7182 |
" 49 aload_2 [foo2]\n" + |
7183 |
" 50 ifnull 64\n" + |
7184 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7185 |
" 56 ldc <String \"foo2 is not null\"> [67]\n" + |
7186 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7187 |
" 61 goto 4\n" + |
7188 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7189 |
" 67 ldc <String \"foo2 is null\"> [69]\n" + |
7190 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7191 |
" 72 goto 4\n" + |
7192 |
" Line numbers:\n" + |
7193 |
" [pc: 0, line: 3]\n" + |
7194 |
" [pc: 2, line: 4]\n" + |
7195 |
" [pc: 4, line: 6]\n" + |
7196 |
" [pc: 26, line: 7]\n" + |
7197 |
" [pc: 30, line: 8]\n" + |
7198 |
" [pc: 41, line: 10]\n" + |
7199 |
" [pc: 49, line: 12]\n" + |
7200 |
" [pc: 53, line: 13]\n" + |
7201 |
" [pc: 64, line: 15]\n" + |
7202 |
" [pc: 72, line: 5]\n" + |
7203 |
" Local variable table:\n" + |
7204 |
" [pc: 0, pc: 75] local: this index: 0 type: X\n" + |
7205 |
" [pc: 2, pc: 75] local: foo index: 1 type: java.lang.Object\n" + |
7206 |
" [pc: 4, pc: 75] local: foo2 index: 2 type: java.lang.Object\n" |
7207 |
: this.complianceLevel < ClassFileConstants.JDK1_6? |
7208 |
" // Method descriptor #8 ()V\n" + |
7209 |
" // Stack: 2, Locals: 3\n" + |
7210 |
" public void foo();\n" + |
7211 |
" 0 aconst_null\n" + |
7212 |
" 1 astore_1 [foo]\n" + |
7213 |
" 2 aconst_null\n" + |
7214 |
" 3 astore_2 [foo2]\n" + |
7215 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7216 |
" 7 ifne 26\n" + |
7217 |
" 10 aload_1 [foo]\n" + |
7218 |
" 11 ifnull 18\n" + |
7219 |
" 14 aload_2 [foo2]\n" + |
7220 |
" 15 ifnonnull 26\n" + |
7221 |
" 18 new java.lang.AssertionError [26]\n" + |
7222 |
" 21 dup\n" + |
7223 |
" 22 invokespecial java.lang.AssertionError() [28]\n" + |
7224 |
" 25 athrow\n" + |
7225 |
" 26 aload_1 [foo]\n" + |
7226 |
" 27 ifnull 41\n" + |
7227 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7228 |
" 33 ldc <String \"foo is not null\"> [35]\n" + |
7229 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7230 |
" 38 goto 49\n" + |
7231 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7232 |
" 44 ldc <String \"foo is null\"> [43]\n" + |
7233 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7234 |
" 49 aload_2 [foo2]\n" + |
7235 |
" 50 ifnull 64\n" + |
7236 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7237 |
" 56 ldc <String \"foo2 is not null\"> [45]\n" + |
7238 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7239 |
" 61 goto 4\n" + |
7240 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7241 |
" 67 ldc <String \"foo2 is null\"> [47]\n" + |
7242 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7243 |
" 72 goto 4\n" + |
7244 |
" Line numbers:\n" + |
7245 |
" [pc: 0, line: 3]\n" + |
7246 |
" [pc: 2, line: 4]\n" + |
7247 |
" [pc: 4, line: 6]\n" + |
7248 |
" [pc: 26, line: 7]\n" + |
7249 |
" [pc: 30, line: 8]\n" + |
7250 |
" [pc: 41, line: 10]\n" + |
7251 |
" [pc: 49, line: 12]\n" + |
7252 |
" [pc: 53, line: 13]\n" + |
7253 |
" [pc: 64, line: 15]\n" + |
7254 |
" [pc: 72, line: 5]\n" + |
7255 |
" Local variable table:\n" + |
7256 |
" [pc: 0, pc: 75] local: this index: 0 type: X\n" + |
7257 |
" [pc: 2, pc: 75] local: foo index: 1 type: java.lang.Object\n" + |
7258 |
" [pc: 4, pc: 75] local: foo2 index: 2 type: java.lang.Object\n" |
7259 |
: " // Method descriptor #8 ()V\n" + |
7260 |
" // Stack: 2, Locals: 3\n" + |
7261 |
" public void foo();\n" + |
7262 |
" 0 aconst_null\n" + |
7263 |
" 1 astore_1 [foo]\n" + |
7264 |
" 2 aconst_null\n" + |
7265 |
" 3 astore_2 [foo2]\n" + |
7266 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7267 |
" 7 ifne 26\n" + |
7268 |
" 10 aload_1 [foo]\n" + |
7269 |
" 11 ifnull 18\n" + |
7270 |
" 14 aload_2 [foo2]\n" + |
7271 |
" 15 ifnonnull 26\n" + |
7272 |
" 18 new java.lang.AssertionError [27]\n" + |
7273 |
" 21 dup\n" + |
7274 |
" 22 invokespecial java.lang.AssertionError() [29]\n" + |
7275 |
" 25 athrow\n" + |
7276 |
" 26 aload_1 [foo]\n" + |
7277 |
" 27 ifnull 41\n" + |
7278 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7279 |
" 33 ldc <String \"foo is not null\"> [36]\n" + |
7280 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7281 |
" 38 goto 49\n" + |
7282 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7283 |
" 44 ldc <String \"foo is null\"> [44]\n" + |
7284 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7285 |
" 49 aload_2 [foo2]\n" + |
7286 |
" 50 ifnull 64\n" + |
7287 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7288 |
" 56 ldc <String \"foo2 is not null\"> [46]\n" + |
7289 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7290 |
" 61 goto 4\n" + |
7291 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7292 |
" 67 ldc <String \"foo2 is null\"> [48]\n" + |
7293 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7294 |
" 72 goto 4\n" + |
7295 |
" Line numbers:\n" + |
7296 |
" [pc: 0, line: 3]\n" + |
7297 |
" [pc: 2, line: 4]\n" + |
7298 |
" [pc: 4, line: 6]\n" + |
7299 |
" [pc: 26, line: 7]\n" + |
7300 |
" [pc: 30, line: 8]\n" + |
7301 |
" [pc: 41, line: 10]\n" + |
7302 |
" [pc: 49, line: 12]\n" + |
7303 |
" [pc: 53, line: 13]\n" + |
7304 |
" [pc: 64, line: 15]\n" + |
7305 |
" [pc: 72, line: 5]\n" + |
7306 |
" Local variable table:\n" + |
7307 |
" [pc: 0, pc: 75] local: this index: 0 type: X\n" + |
7308 |
" [pc: 2, pc: 75] local: foo index: 1 type: java.lang.Object\n" + |
7309 |
" [pc: 4, pc: 75] local: foo2 index: 2 type: java.lang.Object\n" + |
7310 |
" Stack map table: number of frames 7\n" + |
7311 |
" [pc: 4, append: {java.lang.Object, java.lang.Object}]\n" + |
7312 |
" [pc: 18, same]\n" + |
7313 |
" [pc: 26, same]\n" + |
7314 |
" [pc: 41, same]\n" + |
7315 |
" [pc: 49, same]\n" + |
7316 |
" [pc: 64, same]\n" + |
7317 |
" [pc: 72, same]\n"; |
7318 |
|
7319 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
7320 |
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f); |
7321 |
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
7322 |
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED); |
7323 |
int index = result.indexOf(expectedOutput); |
7324 |
if (index == -1 || expectedOutput.length() == 0) { |
7325 |
System.out.println(Util.displayString(result, 3)); |
7326 |
} |
7327 |
if (index == -1) { |
7328 |
assertEquals("Wrong contents", expectedOutput, result); |
7329 |
} |
7330 |
} |
7331 |
} |
7332 |
|
7333 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=303448 |
7334 |
// To check that code gen is not optimized for an if statement |
7335 |
// where a local variable's definite nullness or otherwise is known because of |
7336 |
// an earlier assert expression (inside finally context) |
7337 |
public void testBug303448d() throws Exception { |
7338 |
if (this.complianceLevel >= ClassFileConstants.JDK1_4) { |
7339 |
this.runConformTest( |
7340 |
new String[] { |
7341 |
"X.java", |
7342 |
"public class X {\n" + |
7343 |
" public void foo() {\n" + |
7344 |
" Object foo = null;\n" + |
7345 |
" Object foo2 = null;\n" + |
7346 |
" try {} \n" + |
7347 |
" finally {\n" + |
7348 |
" assert (foo != null && foo2 != null);\n" + |
7349 |
" if (foo != null) {\n" + |
7350 |
" System.out.println(\"foo is not null\");\n" + |
7351 |
" } else {\n" + |
7352 |
" System.out.println(\"foo is null\");\n" + |
7353 |
" }\n" + |
7354 |
" if (foo2 != null) {\n" + |
7355 |
" System.out.println(\"foo2 is not null\");\n" + |
7356 |
" } else {\n" + |
7357 |
" System.out.println(\"foo2 is null\");\n" + |
7358 |
" }\n" + |
7359 |
" }\n" + |
7360 |
" }\n" + |
7361 |
"}\n", |
7362 |
}, |
7363 |
"", |
7364 |
null, |
7365 |
true, |
7366 |
null, |
7367 |
getCompilerOptions(), |
7368 |
null); // custom requestor |
7369 |
|
7370 |
String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_5? |
7371 |
" // Method descriptor #11 ()V\n" + |
7372 |
" // Stack: 2, Locals: 3\n" + |
7373 |
" public void foo();\n" + |
7374 |
" 0 aconst_null\n" + |
7375 |
" 1 astore_1 [foo]\n" + |
7376 |
" 2 aconst_null\n" + |
7377 |
" 3 astore_2 [foo2]\n" + |
7378 |
" 4 getstatic X.$assertionsDisabled : boolean [38]\n" + |
7379 |
" 7 ifne 26\n" + |
7380 |
" 10 aload_1 [foo]\n" + |
7381 |
" 11 ifnull 18\n" + |
7382 |
" 14 aload_2 [foo2]\n" + |
7383 |
" 15 ifnonnull 26\n" + |
7384 |
" 18 new java.lang.AssertionError [49]\n" + |
7385 |
" 21 dup\n" + |
7386 |
" 22 invokespecial java.lang.AssertionError() [51]\n" + |
7387 |
" 25 athrow\n" + |
7388 |
" 26 aload_1 [foo]\n" + |
7389 |
" 27 ifnull 41\n" + |
7390 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7391 |
" 33 ldc <String \"foo is not null\"> [58]\n" + |
7392 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7393 |
" 38 goto 49\n" + |
7394 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7395 |
" 44 ldc <String \"foo is null\"> [65]\n" + |
7396 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7397 |
" 49 aload_2 [foo2]\n" + |
7398 |
" 50 ifnull 64\n" + |
7399 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7400 |
" 56 ldc <String \"foo2 is not null\"> [67]\n" + |
7401 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7402 |
" 61 goto 72\n" + |
7403 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [52]\n" + |
7404 |
" 67 ldc <String \"foo2 is null\"> [69]\n" + |
7405 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [60]\n" + |
7406 |
" 72 return\n" + |
7407 |
" Line numbers:\n" + |
7408 |
" [pc: 0, line: 3]\n" + |
7409 |
" [pc: 2, line: 4]\n" + |
7410 |
" [pc: 4, line: 7]\n" + |
7411 |
" [pc: 26, line: 8]\n" + |
7412 |
" [pc: 30, line: 9]\n" + |
7413 |
" [pc: 41, line: 11]\n" + |
7414 |
" [pc: 49, line: 13]\n" + |
7415 |
" [pc: 53, line: 14]\n" + |
7416 |
" [pc: 64, line: 16]\n" + |
7417 |
" [pc: 72, line: 19]\n" + |
7418 |
" Local variable table:\n" + |
7419 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
7420 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
7421 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" |
7422 |
: this.complianceLevel < ClassFileConstants.JDK1_6? |
7423 |
" // Method descriptor #8 ()V\n" + |
7424 |
" // Stack: 2, Locals: 3\n" + |
7425 |
" public void foo();\n" + |
7426 |
" 0 aconst_null\n" + |
7427 |
" 1 astore_1 [foo]\n" + |
7428 |
" 2 aconst_null\n" + |
7429 |
" 3 astore_2 [foo2]\n" + |
7430 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7431 |
" 7 ifne 26\n" + |
7432 |
" 10 aload_1 [foo]\n" + |
7433 |
" 11 ifnull 18\n" + |
7434 |
" 14 aload_2 [foo2]\n" + |
7435 |
" 15 ifnonnull 26\n" + |
7436 |
" 18 new java.lang.AssertionError [26]\n" + |
7437 |
" 21 dup\n" + |
7438 |
" 22 invokespecial java.lang.AssertionError() [28]\n" + |
7439 |
" 25 athrow\n" + |
7440 |
" 26 aload_1 [foo]\n" + |
7441 |
" 27 ifnull 41\n" + |
7442 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7443 |
" 33 ldc <String \"foo is not null\"> [35]\n" + |
7444 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7445 |
" 38 goto 49\n" + |
7446 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7447 |
" 44 ldc <String \"foo is null\"> [43]\n" + |
7448 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7449 |
" 49 aload_2 [foo2]\n" + |
7450 |
" 50 ifnull 64\n" + |
7451 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7452 |
" 56 ldc <String \"foo2 is not null\"> [45]\n" + |
7453 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7454 |
" 61 goto 72\n" + |
7455 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [29]\n" + |
7456 |
" 67 ldc <String \"foo2 is null\"> [47]\n" + |
7457 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]\n" + |
7458 |
" 72 return\n" + |
7459 |
" Line numbers:\n" + |
7460 |
" [pc: 0, line: 3]\n" + |
7461 |
" [pc: 2, line: 4]\n" + |
7462 |
" [pc: 4, line: 7]\n" + |
7463 |
" [pc: 26, line: 8]\n" + |
7464 |
" [pc: 30, line: 9]\n" + |
7465 |
" [pc: 41, line: 11]\n" + |
7466 |
" [pc: 49, line: 13]\n" + |
7467 |
" [pc: 53, line: 14]\n" + |
7468 |
" [pc: 64, line: 16]\n" + |
7469 |
" [pc: 72, line: 19]\n" + |
7470 |
" Local variable table:\n" + |
7471 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
7472 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
7473 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" |
7474 |
: " // Method descriptor #8 ()V\n" + |
7475 |
" // Stack: 2, Locals: 3\n" + |
7476 |
" public void foo();\n" + |
7477 |
" 0 aconst_null\n" + |
7478 |
" 1 astore_1 [foo]\n" + |
7479 |
" 2 aconst_null\n" + |
7480 |
" 3 astore_2 [foo2]\n" + |
7481 |
" 4 getstatic X.$assertionsDisabled : boolean [16]\n" + |
7482 |
" 7 ifne 26\n" + |
7483 |
" 10 aload_1 [foo]\n" + |
7484 |
" 11 ifnull 18\n" + |
7485 |
" 14 aload_2 [foo2]\n" + |
7486 |
" 15 ifnonnull 26\n" + |
7487 |
" 18 new java.lang.AssertionError [27]\n" + |
7488 |
" 21 dup\n" + |
7489 |
" 22 invokespecial java.lang.AssertionError() [29]\n" + |
7490 |
" 25 athrow\n" + |
7491 |
" 26 aload_1 [foo]\n" + |
7492 |
" 27 ifnull 41\n" + |
7493 |
" 30 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7494 |
" 33 ldc <String \"foo is not null\"> [36]\n" + |
7495 |
" 35 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7496 |
" 38 goto 49\n" + |
7497 |
" 41 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7498 |
" 44 ldc <String \"foo is null\"> [44]\n" + |
7499 |
" 46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7500 |
" 49 aload_2 [foo2]\n" + |
7501 |
" 50 ifnull 64\n" + |
7502 |
" 53 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7503 |
" 56 ldc <String \"foo2 is not null\"> [46]\n" + |
7504 |
" 58 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7505 |
" 61 goto 72\n" + |
7506 |
" 64 getstatic java.lang.System.out : java.io.PrintStream [30]\n" + |
7507 |
" 67 ldc <String \"foo2 is null\"> [48]\n" + |
7508 |
" 69 invokevirtual java.io.PrintStream.println(java.lang.String) : void [38]\n" + |
7509 |
" 72 return\n" + |
7510 |
" Line numbers:\n" + |
7511 |
" [pc: 0, line: 3]\n" + |
7512 |
" [pc: 2, line: 4]\n" + |
7513 |
" [pc: 4, line: 7]\n" + |
7514 |
" [pc: 26, line: 8]\n" + |
7515 |
" [pc: 30, line: 9]\n" + |
7516 |
" [pc: 41, line: 11]\n" + |
7517 |
" [pc: 49, line: 13]\n" + |
7518 |
" [pc: 53, line: 14]\n" + |
7519 |
" [pc: 64, line: 16]\n" + |
7520 |
" [pc: 72, line: 19]\n" + |
7521 |
" Local variable table:\n" + |
7522 |
" [pc: 0, pc: 73] local: this index: 0 type: X\n" + |
7523 |
" [pc: 2, pc: 73] local: foo index: 1 type: java.lang.Object\n" + |
7524 |
" [pc: 4, pc: 73] local: foo2 index: 2 type: java.lang.Object\n" + |
7525 |
" Stack map table: number of frames 6\n" + |
7526 |
" [pc: 18, append: {java.lang.Object, java.lang.Object}]\n" + |
7527 |
" [pc: 26, same]\n" + |
7528 |
" [pc: 41, same]\n" + |
7529 |
" [pc: 49, same]\n" + |
7530 |
" [pc: 64, same]\n" + |
7531 |
" [pc: 72, same]\n"; |
7532 |
|
7533 |
File f = new File(OUTPUT_DIR + File.separator + "X.class"); |
7534 |
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f); |
7535 |
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
7536 |
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED); |
7537 |
int index = result.indexOf(expectedOutput); |
7538 |
if (index == -1 || expectedOutput.length() == 0) { |
7539 |
System.out.println(Util.displayString(result, 3)); |
7540 |
} |
7541 |
if (index == -1) { |
7542 |
assertEquals("Wrong contents", expectedOutput, result); |
7543 |
} |
7544 |
} |
7545 |
} |
7546 |
|
6769 |
public static Class testClass() { |
7547 |
public static Class testClass() { |
6770 |
return ConformTest.class; |
7548 |
return ConformTest.class; |
6771 |
} |
7549 |
} |