src/share/classes/sun/tools/javap/Tables.java

Wed, 02 Jul 2008 12:56:02 -0700

author
xdono
date
Wed, 02 Jul 2008 12:56:02 -0700
changeset 54
eaf608c64fec
parent 37
b8c8259e0d2b
permissions
-rw-r--r--

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 }

mercurial