LocalVariableTypeTableTest.java revision 2942:08092deced3f
1/* 2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @summary local variable type table attribute test. 27 * @bug 8040097 28 * @library /tools/lib /tools/javac/lib ../lib 29 * @modules jdk.jdeps/com.sun.tools.classfile 30 * jdk.compiler/com.sun.tools.javac.api 31 * jdk.compiler/com.sun.tools.javac.file 32 * jdk.compiler/com.sun.tools.javac.main 33 * @build ToolBox LocalVariableTestBase TestBase InMemoryFileManager 34 * @compile -g LocalVariableTypeTableTest.java 35 * @run main LocalVariableTypeTableTest 36 */ 37 38import com.sun.tools.classfile.Code_attribute; 39import com.sun.tools.classfile.LocalVariableTypeTable_attribute; 40 41import java.io.IOException; 42import java.util.Arrays; 43import java.util.Collection; 44import java.util.List; 45import java.util.function.Supplier; 46import java.util.stream.Stream; 47 48import static java.util.stream.Collectors.toList; 49 50public class LocalVariableTypeTableTest<THIS> extends LocalVariableTestBase { 51 52 public LocalVariableTypeTableTest(Class<?> clazz) { 53 super(clazz); 54 } 55 56 public static void main(String[] args) throws IOException { 57 new LocalVariableTypeTableTest(LocalVariableTypeTableTest.class).test(); 58 } 59 60 @Override 61 protected List<VariableTable> getVariableTables(Code_attribute codeAttribute) { 62 return Stream.of(codeAttribute.attributes.attrs) 63 .filter(at -> at instanceof LocalVariableTypeTable_attribute) 64 .map(at -> (LocalVariableTypeTable_attribute) at) 65 .map(LocalVariableTypeTable::new).collect(toList()); 66 } 67 68 @ExpectedLocals(name = "list", type = "TT;") 69 @ExpectedLocals(name = "p", type = "[TP;") 70 @ExpectedLocals(name = "k", type = "TK;") 71 @ExpectedLocals(name = "c1", type = "Ljava/util/Collection<-Ljava/lang/Integer;>;") 72 @ExpectedLocals(name = "c2", type = "Ljava/util/Collection<*>;") 73 @ExpectedLocals(name = "c3", type = "Ljava/util/Collection<+TE;>;") 74 public <T extends List<Integer>, P, K extends Integer, E extends Supplier & Runnable> 75 void genericTypeWithParametersOnly(K k, T list, P[] p, 76 Collection<? super Integer> c1, 77 Collection<?> c2, Collection<? extends E> c3) { 78 } 79 80 @ExpectedLocals(name = "list", type = "TT;") 81 @ExpectedLocals(name = "p", type = "[TP;") 82 @ExpectedLocals(name = "k", type = "TK;") 83 @ExpectedLocals(name = "c1", type = "Ljava/util/Collection<-Ljava/lang/Integer;>;") 84 @ExpectedLocals(name = "c2", type = "Ljava/util/Collection<*>;") 85 @ExpectedLocals(name = "c3", type = "Ljava/util/Collection<+TE;>;") 86 public <T extends List<Integer>, P, K extends Integer, E extends Supplier & Runnable> 87 void genericType(K k, T list, P[] p) { 88 Collection<? super Integer> c1 = null; 89 Collection<?> c2 = null; 90 Collection<? extends E> c3 = null; 91 } 92 93 @ExpectedLocals(name = "list", type = "TT;") 94 @ExpectedLocals(name = "p", type = "[[TP;") 95 public <T extends List<Integer>, P, K extends Integer> void genericTypeWithoutParameters() { 96 T list = null; 97 list.add(1); 98 int i = 0; 99 P[][] p = null; 100 } 101 102 @ExpectedLocals(name = "this", type = "LLocalVariableTypeTableTest<TTHIS;>;") 103 public void genericThis() { 104 } 105 106 @ExpectedLocals(name = "this", type = "LLocalVariableTypeTableTest<TTHIS;>;") 107 @ExpectedLocals(name = "inWhile", type = "TTHIS;") 108 @ExpectedLocals(name = "inTry", type = "TTHIS;") 109 @ExpectedLocals(name = "inSync", type = "TTHIS;") 110 @ExpectedLocals(name = "inDo", type = "TTHIS;") 111 @ExpectedLocals(name = "inFor", type = "LLocalVariableTypeTableTest<-TTHIS;>;") 112 @ExpectedLocals(name = "s", type = "Ljava/util/stream/Stream<+Ljava/lang/Integer;>;") 113 public void deepScope() { 114 { 115 while (true) { 116 THIS inWhile = null; 117 for (LocalVariableTypeTableTest<? super THIS> inFor : Arrays.asList(this)) { 118 try (Stream<? extends Integer> s = Stream.of(0)) { 119 THIS inTry = null; 120 synchronized (this) { 121 THIS inSync = null; 122 do { 123 THIS inDo = null; 124 switch (1) { 125 default: 126 THIS inSwitch = null; 127 } 128 } while (true); 129 } 130 } 131 } 132 } 133 } 134 } 135 136 class LocalVariableTypeTable implements VariableTable { 137 138 final LocalVariableTypeTable_attribute att; 139 140 141 public LocalVariableTypeTable(LocalVariableTypeTable_attribute att) { 142 this.att = att; 143 } 144 145 @Override 146 public int localVariableTableLength() { 147 return att.local_variable_table_length; 148 } 149 150 @Override 151 public List<Entry> entries() { 152 return Stream.of(att.local_variable_table).map(LocalVariableTypeTableEntry::new).collect(toList()); 153 } 154 155 @Override 156 public int attributeLength() { 157 return att.attribute_length; 158 } 159 160 private class LocalVariableTypeTableEntry implements Entry { 161 162 final LocalVariableTypeTable_attribute.Entry entry; 163 164 private LocalVariableTypeTableEntry(LocalVariableTypeTable_attribute.Entry entry) { 165 this.entry = entry; 166 } 167 168 @Override 169 public int index() { 170 return entry.index; 171 } 172 173 @Override 174 public int startPC() { 175 return entry.start_pc; 176 } 177 178 @Override 179 public int length() { 180 return entry.length; 181 } 182 183 @Override 184 public String name() { 185 return getString(entry.name_index); 186 } 187 188 @Override 189 public String type() { 190 return getString(entry.signature_index); 191 } 192 193 @Override 194 public String toString() { 195 return dump(); 196 } 197 } 198 } 199} 200