Wed, 02 Jul 2008 12:56:02 -0700
6719955: Update copyright year
Summary: Update copyright year for files that have been modified in 2008
Reviewed-by: ohair, tbell
duke@1 | 1 | /* |
xdono@54 | 2 | * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. |
duke@1 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
duke@1 | 4 | * |
duke@1 | 5 | * This code is free software; you can redistribute it and/or modify it |
duke@1 | 6 | * under the terms of the GNU General Public License version 2 only, as |
duke@1 | 7 | * published by the Free Software Foundation. Sun designates this |
duke@1 | 8 | * particular file as subject to the "Classpath" exception as provided |
duke@1 | 9 | * by Sun in the LICENSE file that accompanied this code. |
duke@1 | 10 | * |
duke@1 | 11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
duke@1 | 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
duke@1 | 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
duke@1 | 14 | * version 2 for more details (a copy is included in the LICENSE file that |
duke@1 | 15 | * accompanied this code). |
duke@1 | 16 | * |
duke@1 | 17 | * You should have received a copy of the GNU General Public License version |
duke@1 | 18 | * 2 along with this work; if not, write to the Free Software Foundation, |
duke@1 | 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
duke@1 | 20 | * |
duke@1 | 21 | * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
duke@1 | 22 | * CA 95054 USA or visit www.sun.com if you need additional information or |
duke@1 | 23 | * have any questions. |
duke@1 | 24 | */ |
duke@1 | 25 | |
duke@1 | 26 | |
duke@1 | 27 | package sun.tools.javap; |
duke@1 | 28 | |
duke@1 | 29 | import java.util.Hashtable; |
duke@1 | 30 | import java.util.Vector; |
duke@1 | 31 | |
duke@1 | 32 | |
duke@1 | 33 | public class Tables implements Constants { |
duke@1 | 34 | /** |
duke@1 | 35 | * Define mnemocodes table. |
duke@1 | 36 | */ |
jjg@37 | 37 | static Hashtable<String,Integer> mnemocodes = new Hashtable<String,Integer>(301, 0.5f); |
duke@1 | 38 | static String opcExtNamesTab[]=new String[128]; |
duke@1 | 39 | static String opcPrivExtNamesTab[]=new String[128]; |
duke@1 | 40 | static void defineNonPriv(int opc, String mnem) { |
jjg@37 | 41 | mnemocodes.put(opcExtNamesTab[opc]=mnem, opc_nonpriv*256+opc); |
duke@1 | 42 | } |
duke@1 | 43 | static void definePriv(int opc, String mnem) { |
jjg@37 | 44 | mnemocodes.put(opcPrivExtNamesTab[opc]="priv_"+mnem, opc_priv*256+opc); |
duke@1 | 45 | } |
duke@1 | 46 | static void defineExt(int opc, String mnem) { |
duke@1 | 47 | defineNonPriv(opc, mnem); |
duke@1 | 48 | definePriv(opc, mnem); |
duke@1 | 49 | } |
duke@1 | 50 | static { int k; |
duke@1 | 51 | for (k=0; k<opc_wide; k++) { |
jjg@37 | 52 | mnemocodes.put(opcNamesTab[k], k); |
duke@1 | 53 | } |
duke@1 | 54 | for (k=opc_wide+1; k<opcNamesTab.length; k++) { |
jjg@37 | 55 | mnemocodes.put(opcNamesTab[k], k); |
duke@1 | 56 | } |
jjg@37 | 57 | mnemocodes.put("invokenonvirtual", opc_invokespecial); |
duke@1 | 58 | |
jjg@37 | 59 | mnemocodes.put("iload_w", opc_iload_w); |
jjg@37 | 60 | mnemocodes.put("lload_w", opc_lload_w); |
jjg@37 | 61 | mnemocodes.put("fload_w", opc_fload_w); |
jjg@37 | 62 | mnemocodes.put("dload_w", opc_dload_w); |
jjg@37 | 63 | mnemocodes.put("aload_w", opc_aload_w); |
jjg@37 | 64 | mnemocodes.put("istore_w", opc_istore_w); |
jjg@37 | 65 | mnemocodes.put("lstore_w", opc_lstore_w); |
jjg@37 | 66 | mnemocodes.put("fstore_w", opc_fstore_w); |
jjg@37 | 67 | mnemocodes.put("dstore_w", opc_dstore_w); |
jjg@37 | 68 | mnemocodes.put("astore_w", opc_astore_w); |
jjg@37 | 69 | mnemocodes.put("ret_w", opc_ret_w); |
jjg@37 | 70 | mnemocodes.put("iinc_w", opc_iinc_w); |
duke@1 | 71 | |
jjg@37 | 72 | mnemocodes.put("nonpriv", opc_nonpriv); |
jjg@37 | 73 | mnemocodes.put("priv", opc_priv); |
duke@1 | 74 | |
duke@1 | 75 | defineExt(0, "load_ubyte"); |
duke@1 | 76 | defineExt(1, "load_byte"); |
duke@1 | 77 | defineExt(2, "load_char"); |
duke@1 | 78 | defineExt(3, "load_short"); |
duke@1 | 79 | defineExt(4, "load_word"); |
duke@1 | 80 | defineExt(10, "load_char_oe"); |
duke@1 | 81 | defineExt(11, "load_short_oe"); |
duke@1 | 82 | defineExt(12, "load_word_oe"); |
duke@1 | 83 | defineExt(16, "ncload_ubyte"); |
duke@1 | 84 | defineExt(17, "ncload_byte"); |
duke@1 | 85 | defineExt(18, "ncload_char"); |
duke@1 | 86 | defineExt(19, "ncload_short"); |
duke@1 | 87 | defineExt(20, "ncload_word"); |
duke@1 | 88 | defineExt(26, "ncload_char_oe"); |
duke@1 | 89 | defineExt(27, "ncload_short_oe"); |
duke@1 | 90 | defineExt(28, "ncload_word_oe"); |
duke@1 | 91 | defineExt(30, "cache_flush"); |
duke@1 | 92 | defineExt(32, "store_byte"); |
duke@1 | 93 | defineExt(34, "store_short"); |
duke@1 | 94 | defineExt(36, "store_word"); |
duke@1 | 95 | defineExt(42, "store_short_oe"); |
duke@1 | 96 | defineExt(44, "store_word_oe"); |
duke@1 | 97 | defineExt(48, "ncstore_byte"); |
duke@1 | 98 | defineExt(50, "ncstore_short"); |
duke@1 | 99 | defineExt(52, "ncstore_word"); |
duke@1 | 100 | defineExt(58, "ncstore_short_oe"); |
duke@1 | 101 | defineExt(60, "ncstore_word_oe"); |
duke@1 | 102 | defineExt(62, "zero_line"); |
duke@1 | 103 | defineNonPriv(5, "ret_from_sub"); |
duke@1 | 104 | defineNonPriv(63, "enter_sync_method"); |
duke@1 | 105 | definePriv(5, "ret_from_trap"); |
duke@1 | 106 | definePriv(6, "read_dcache_tag"); |
duke@1 | 107 | definePriv(7, "read_dcache_data"); |
duke@1 | 108 | definePriv(14, "read_icache_tag"); |
duke@1 | 109 | definePriv(15, "read_icache_data"); |
duke@1 | 110 | definePriv(22, "powerdown"); |
duke@1 | 111 | definePriv(23, "read_scache_data"); |
duke@1 | 112 | definePriv(31, "cache_index_flush"); |
duke@1 | 113 | definePriv(38, "write_dcache_tag"); |
duke@1 | 114 | definePriv(39, "write_dcache_data"); |
duke@1 | 115 | definePriv(46, "write_icache_tag"); |
duke@1 | 116 | definePriv(47, "write_icache_data"); |
duke@1 | 117 | definePriv(54, "reset"); |
duke@1 | 118 | definePriv(55, "write_scache_data"); |
duke@1 | 119 | for (k=0; k<32; k++) { |
duke@1 | 120 | definePriv(k+64, "read_reg_"+k); |
duke@1 | 121 | } |
duke@1 | 122 | for (k=0; k<32; k++) { |
duke@1 | 123 | definePriv(k+96, "write_reg_"+k); |
duke@1 | 124 | } |
duke@1 | 125 | } |
duke@1 | 126 | |
duke@1 | 127 | public static int opcLength(int opc) throws ArrayIndexOutOfBoundsException { |
duke@1 | 128 | switch (opc>>8) { |
duke@1 | 129 | case 0: |
duke@1 | 130 | return opcLengthsTab[opc]; |
duke@1 | 131 | case opc_wide: |
duke@1 | 132 | switch (opc&0xFF) { |
duke@1 | 133 | case opc_aload: case opc_astore: |
duke@1 | 134 | case opc_fload: case opc_fstore: |
duke@1 | 135 | case opc_iload: case opc_istore: |
duke@1 | 136 | case opc_lload: case opc_lstore: |
duke@1 | 137 | case opc_dload: case opc_dstore: |
duke@1 | 138 | case opc_ret: |
duke@1 | 139 | return 4; |
duke@1 | 140 | case opc_iinc: |
duke@1 | 141 | return 6; |
duke@1 | 142 | default: |
duke@1 | 143 | throw new ArrayIndexOutOfBoundsException(); |
duke@1 | 144 | } |
duke@1 | 145 | case opc_nonpriv: |
duke@1 | 146 | case opc_priv: |
duke@1 | 147 | return 2; |
duke@1 | 148 | default: |
duke@1 | 149 | throw new ArrayIndexOutOfBoundsException(); |
duke@1 | 150 | } |
duke@1 | 151 | } |
duke@1 | 152 | |
duke@1 | 153 | public static String opcName(int opc) { |
duke@1 | 154 | try { |
duke@1 | 155 | switch (opc>>8) { |
duke@1 | 156 | case 0: |
duke@1 | 157 | return opcNamesTab[opc]; |
duke@1 | 158 | case opc_wide: { |
duke@1 | 159 | String mnem=opcNamesTab[opc&0xFF]+"_w"; |
duke@1 | 160 | if (mnemocodes.get(mnem) == null) |
duke@1 | 161 | return null; // non-existent opcode |
duke@1 | 162 | return mnem; |
duke@1 | 163 | } |
duke@1 | 164 | case opc_nonpriv: |
duke@1 | 165 | return opcExtNamesTab[opc&0xFF]; |
duke@1 | 166 | case opc_priv: |
duke@1 | 167 | return opcPrivExtNamesTab[opc&0xFF]; |
duke@1 | 168 | default: |
duke@1 | 169 | return null; |
duke@1 | 170 | } |
duke@1 | 171 | } catch (ArrayIndexOutOfBoundsException e) { |
duke@1 | 172 | switch (opc) { |
duke@1 | 173 | case opc_nonpriv: |
duke@1 | 174 | return "nonpriv"; |
duke@1 | 175 | case opc_priv: |
duke@1 | 176 | return "priv"; |
duke@1 | 177 | default: |
duke@1 | 178 | return null; |
duke@1 | 179 | } |
duke@1 | 180 | } |
duke@1 | 181 | } |
duke@1 | 182 | |
duke@1 | 183 | public static int opcode(String mnem) { |
jjg@37 | 184 | Integer Val=mnemocodes.get(mnem); |
duke@1 | 185 | if (Val == null) return -1; |
duke@1 | 186 | return Val.intValue(); |
duke@1 | 187 | } |
duke@1 | 188 | |
duke@1 | 189 | /** |
duke@1 | 190 | * Initialized keyword and token Hashtables |
duke@1 | 191 | */ |
jjg@37 | 192 | static Vector<String> keywordNames = new Vector<String>(40); |
duke@1 | 193 | private static void defineKeywordName(String id, int token) { |
duke@1 | 194 | |
duke@1 | 195 | if (token>=keywordNames.size()) { |
duke@1 | 196 | keywordNames.setSize(token+1); |
duke@1 | 197 | } |
duke@1 | 198 | keywordNames.setElementAt(id, token); |
duke@1 | 199 | } |
duke@1 | 200 | public static String keywordName(int token) { |
duke@1 | 201 | if (token==-1) return "EOF"; |
duke@1 | 202 | if (token>=keywordNames.size()) return null; |
jjg@37 | 203 | return keywordNames.elementAt(token); |
duke@1 | 204 | } |
duke@1 | 205 | static { |
duke@1 | 206 | defineKeywordName("ident", IDENT); |
duke@1 | 207 | defineKeywordName("STRINGVAL", STRINGVAL); |
duke@1 | 208 | defineKeywordName("intVal", INTVAL); |
duke@1 | 209 | defineKeywordName("longVal", LONGVAL); |
duke@1 | 210 | defineKeywordName("floatVal", FLOATVAL); |
duke@1 | 211 | defineKeywordName("doubleVal", DOUBLEVAL); |
duke@1 | 212 | defineKeywordName("SEMICOLON", SEMICOLON); |
duke@1 | 213 | defineKeywordName("COLON", COLON); |
duke@1 | 214 | defineKeywordName("LBRACE", LBRACE); |
duke@1 | 215 | defineKeywordName("RBRACE", RBRACE); |
duke@1 | 216 | } |
duke@1 | 217 | |
jjg@37 | 218 | static Hashtable<String,Integer> keywords = new Hashtable<String,Integer>(40); |
duke@1 | 219 | public static int keyword(String idValue) { |
jjg@37 | 220 | Integer val=keywords.get(idValue); |
jjg@37 | 221 | if (val == null) return IDENT; |
jjg@37 | 222 | return val.intValue(); |
duke@1 | 223 | } |
duke@1 | 224 | |
duke@1 | 225 | private static void defineKeyword(String id, int token) { |
jjg@37 | 226 | keywords.put(id, token); |
duke@1 | 227 | defineKeywordName(id, token); |
duke@1 | 228 | } |
duke@1 | 229 | static { |
duke@1 | 230 | // Modifier keywords |
duke@1 | 231 | defineKeyword("private", PRIVATE); |
duke@1 | 232 | defineKeyword("public", PUBLIC); |
duke@1 | 233 | defineKeyword("protected", PROTECTED); |
duke@1 | 234 | defineKeyword("static", STATIC); |
duke@1 | 235 | defineKeyword("transient", TRANSIENT); |
duke@1 | 236 | defineKeyword("synchronized", SYNCHRONIZED); |
duke@1 | 237 | defineKeyword("super", SUPER); |
duke@1 | 238 | defineKeyword("native", NATIVE); |
duke@1 | 239 | defineKeyword("abstract", ABSTRACT); |
duke@1 | 240 | defineKeyword("volatile", VOLATILE); |
duke@1 | 241 | defineKeyword("final", FINAL); |
duke@1 | 242 | defineKeyword("interface",INTERFACE); |
duke@1 | 243 | defineKeyword("synthetic",SYNTHETIC); |
duke@1 | 244 | defineKeyword("strict",STRICT); |
duke@1 | 245 | |
duke@1 | 246 | // Declaration keywords |
duke@1 | 247 | defineKeyword("package",PACKAGE); |
duke@1 | 248 | defineKeyword("class",CLASS); |
duke@1 | 249 | defineKeyword("extends",EXTENDS); |
duke@1 | 250 | defineKeyword("implements",IMPLEMENTS); |
duke@1 | 251 | defineKeyword("const", CONST); |
duke@1 | 252 | defineKeyword("throws",THROWS); |
duke@1 | 253 | defineKeyword("interface",INTERFACE); |
duke@1 | 254 | defineKeyword("Method",METHODREF); |
duke@1 | 255 | defineKeyword("Field",FIELDREF); |
duke@1 | 256 | defineKeyword("stack",STACK); |
duke@1 | 257 | defineKeyword("locals",LOCAL); |
duke@1 | 258 | |
duke@1 | 259 | // used in switchtables |
duke@1 | 260 | defineKeyword("default", DEFAULT); |
duke@1 | 261 | |
duke@1 | 262 | // used in inner class declarations |
duke@1 | 263 | defineKeyword("InnerClass", INNERCLASS); |
duke@1 | 264 | defineKeyword("of", OF); |
duke@1 | 265 | |
duke@1 | 266 | // misc |
duke@1 | 267 | defineKeyword("bits",BITS); |
duke@1 | 268 | defineKeyword("Infinity",INF); |
duke@1 | 269 | defineKeyword("Inf",INF); |
duke@1 | 270 | defineKeyword("NaN",NAN); |
duke@1 | 271 | } |
duke@1 | 272 | |
duke@1 | 273 | /** |
duke@1 | 274 | * Define tag table. |
duke@1 | 275 | */ |
jjg@37 | 276 | private static Vector<String> tagNames = new Vector<String>(10); |
jjg@37 | 277 | private static Hashtable<String,Integer> Tags = new Hashtable<String,Integer>(10); |
duke@1 | 278 | static { |
duke@1 | 279 | defineTag("Asciz",CONSTANT_UTF8); |
duke@1 | 280 | defineTag("int",CONSTANT_INTEGER); |
duke@1 | 281 | defineTag("float",CONSTANT_FLOAT); |
duke@1 | 282 | defineTag("long",CONSTANT_LONG); |
duke@1 | 283 | defineTag("double",CONSTANT_DOUBLE); |
duke@1 | 284 | defineTag("class",CONSTANT_CLASS); |
duke@1 | 285 | defineTag("String",CONSTANT_STRING); |
duke@1 | 286 | defineTag("Field",CONSTANT_FIELD); |
duke@1 | 287 | defineTag("Method",CONSTANT_METHOD); |
duke@1 | 288 | defineTag("InterfaceMethod",CONSTANT_INTERFACEMETHOD); |
duke@1 | 289 | defineTag("NameAndType",CONSTANT_NAMEANDTYPE); |
duke@1 | 290 | } |
duke@1 | 291 | private static void defineTag(String id, int val) { |
jjg@37 | 292 | Tags.put(id, val); |
duke@1 | 293 | if (val>=tagNames.size()) { |
duke@1 | 294 | tagNames.setSize(val+1); |
duke@1 | 295 | } |
duke@1 | 296 | tagNames.setElementAt(id, val); |
duke@1 | 297 | } |
duke@1 | 298 | public static String tagName(int tag) { |
duke@1 | 299 | if (tag>=tagNames.size()) return null; |
jjg@37 | 300 | return tagNames.elementAt(tag); |
duke@1 | 301 | } |
duke@1 | 302 | public static int tagValue(String idValue) { |
jjg@37 | 303 | Integer Val=Tags.get(idValue); |
duke@1 | 304 | if (Val == null) return 0; |
duke@1 | 305 | return Val.intValue(); |
duke@1 | 306 | } |
duke@1 | 307 | |
duke@1 | 308 | /** |
duke@1 | 309 | * Define type table. These types used in "newarray" instruction only. |
duke@1 | 310 | */ |
jjg@37 | 311 | private static Vector<String> typeNames = new Vector<String>(10); |
jjg@37 | 312 | private static Hashtable<String,Integer> Types = new Hashtable<String,Integer>(10); |
duke@1 | 313 | static { |
duke@1 | 314 | defineType("int",T_INT); |
duke@1 | 315 | defineType("long",T_LONG); |
duke@1 | 316 | defineType("float",T_FLOAT); |
duke@1 | 317 | defineType("double",T_DOUBLE); |
duke@1 | 318 | defineType("class",T_CLASS); |
duke@1 | 319 | defineType("boolean",T_BOOLEAN); |
duke@1 | 320 | defineType("char",T_CHAR); |
duke@1 | 321 | defineType("byte",T_BYTE); |
duke@1 | 322 | defineType("short",T_SHORT); |
duke@1 | 323 | } |
duke@1 | 324 | private static void defineType(String id, int val) { |
jjg@37 | 325 | Types.put(id, val); |
duke@1 | 326 | if (val>=typeNames.size()) { |
duke@1 | 327 | typeNames.setSize(val+1); |
duke@1 | 328 | } |
duke@1 | 329 | typeNames.setElementAt(id, val); |
duke@1 | 330 | } |
duke@1 | 331 | public static int typeValue(String idValue) { |
jjg@37 | 332 | Integer Val=Types.get(idValue); |
duke@1 | 333 | if (Val == null) return -1; |
duke@1 | 334 | return Val.intValue(); |
duke@1 | 335 | } |
duke@1 | 336 | public static String typeName(int type) { |
duke@1 | 337 | if (type>=typeNames.size()) return null; |
jjg@37 | 338 | return typeNames.elementAt(type); |
duke@1 | 339 | } |
duke@1 | 340 | |
duke@1 | 341 | /** |
duke@1 | 342 | * Define MapTypes table. |
duke@1 | 343 | * These constants used in stackmap tables only. |
duke@1 | 344 | */ |
jjg@37 | 345 | private static Vector<String> mapTypeNames = new Vector<String>(10); |
jjg@37 | 346 | private static Hashtable<String,Integer> MapTypes = new Hashtable<String,Integer>(10); |
duke@1 | 347 | static { |
duke@1 | 348 | defineMapType("bogus", ITEM_Bogus); |
duke@1 | 349 | defineMapType("int", ITEM_Integer); |
duke@1 | 350 | defineMapType("float", ITEM_Float); |
duke@1 | 351 | defineMapType("double", ITEM_Double); |
duke@1 | 352 | defineMapType("long", ITEM_Long); |
duke@1 | 353 | defineMapType("null", ITEM_Null); |
duke@1 | 354 | defineMapType("this", ITEM_InitObject); |
duke@1 | 355 | defineMapType("CP", ITEM_Object); |
duke@1 | 356 | defineMapType("uninitialized", ITEM_NewObject); |
duke@1 | 357 | } |
duke@1 | 358 | private static void defineMapType(String id, int val) { |
jjg@37 | 359 | MapTypes.put(id, val); |
duke@1 | 360 | if (val>=mapTypeNames.size()) { |
duke@1 | 361 | mapTypeNames.setSize(val+1); |
duke@1 | 362 | } |
duke@1 | 363 | mapTypeNames.setElementAt(id, val); |
duke@1 | 364 | } |
duke@1 | 365 | public static int mapTypeValue(String idValue) { |
jjg@37 | 366 | Integer Val=MapTypes.get(idValue); |
duke@1 | 367 | if (Val == null) return -1; |
duke@1 | 368 | return Val.intValue(); |
duke@1 | 369 | } |
duke@1 | 370 | public static String mapTypeName(int type) { |
duke@1 | 371 | if (type>=mapTypeNames.size()) return null; |
jjg@37 | 372 | return mapTypeNames.elementAt(type); |
duke@1 | 373 | } |
duke@1 | 374 | |
duke@1 | 375 | } |