Tue, 28 Dec 2010 15:54:52 -0800
6962318: Update copyright year
Reviewed-by: xdono
1 /*
2 * Copyright (c) 1999, 2008, 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. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
26 package com.sun.tools.javac.jvm;
28 import com.sun.tools.javac.code.Type;
29 import com.sun.tools.javac.util.Name;
32 /** A JVM class file.
33 *
34 * <p>Generic Java classfiles have one additional attribute for classes,
35 * methods and fields:
36 * <pre>
37 * "Signature" (u4 attr-length, u2 signature-index)
38 * </pre>
39 *
40 * <p>A signature gives the full Java type of a method or field. When
41 * used as a class attribute, it indicates type parameters, followed
42 * by supertype, followed by all interfaces.
43 * <pre>
44 * methodOrFieldSignature ::= type
45 * classSignature ::= [ typeparams ] supertype { interfacetype }
46 * </pre>
47 * <p>The type syntax in signatures is extended as follows:
48 * <pre>
49 * type ::= ... | classtype | methodtype | typevar
50 * classtype ::= classsig { '.' classsig }
51 * classig ::= 'L' name [typeargs] ';'
52 * methodtype ::= [ typeparams ] '(' { type } ')' type
53 * typevar ::= 'T' name ';'
54 * typeargs ::= '<' type { type } '>'
55 * typeparams ::= '<' typeparam { typeparam } '>'
56 * typeparam ::= name ':' type
57 * </pre>
58 * <p>This class defines constants used in class files as well
59 * as routines to convert between internal ``.'' and external ``/''
60 * separators in class names.
61 *
62 * <p><b>This is NOT part of any supported API.
63 * If you write code that depends on this, you do so at your own risk.
64 * This code and its internal interfaces are subject to change or
65 * deletion without notice.</b> */
66 public class ClassFile {
68 public final static int JAVA_MAGIC = 0xCAFEBABE;
70 // see Target
71 public final static int CONSTANT_Utf8 = 1;
72 public final static int CONSTANT_Unicode = 2;
73 public final static int CONSTANT_Integer = 3;
74 public final static int CONSTANT_Float = 4;
75 public final static int CONSTANT_Long = 5;
76 public final static int CONSTANT_Double = 6;
77 public final static int CONSTANT_Class = 7;
78 public final static int CONSTANT_String = 8;
79 public final static int CONSTANT_Fieldref = 9;
80 public final static int CONSTANT_Methodref = 10;
81 public final static int CONSTANT_InterfaceMethodref = 11;
82 public final static int CONSTANT_NameandType = 12;
84 public final static int MAX_PARAMETERS = 0xff;
85 public final static int MAX_DIMENSIONS = 0xff;
86 public final static int MAX_CODE = 0xffff;
87 public final static int MAX_LOCALS = 0xffff;
88 public final static int MAX_STACK = 0xffff;
90 public enum Version {
91 V45_3(45, 3), // base level for all attributes
92 V49(49, 0), // JDK 1.5: enum, generics, annotations
93 V50(50, 0), // JDK 1.6: stackmaps
94 V51(51, 0); // JDK 1.7
95 Version(int major, int minor) {
96 this.major = major;
97 this.minor = minor;
98 }
99 public final int major, minor;
100 }
103 /************************************************************************
104 * String Translation Routines
105 ***********************************************************************/
107 /** Return internal representation of buf[offset..offset+len-1],
108 * converting '/' to '.'.
109 */
110 public static byte[] internalize(byte[] buf, int offset, int len) {
111 byte[] translated = new byte[len];
112 for (int j = 0; j < len; j++) {
113 byte b = buf[offset + j];
114 if (b == '/') translated[j] = (byte) '.';
115 else translated[j] = b;
116 }
117 return translated;
118 }
120 /** Return internal representation of given name,
121 * converting '/' to '.'.
122 */
123 public static byte[] internalize(Name name) {
124 return internalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
125 }
127 /** Return external representation of buf[offset..offset+len-1],
128 * converting '.' to '/'.
129 */
130 public static byte[] externalize(byte[] buf, int offset, int len) {
131 byte[] translated = new byte[len];
132 for (int j = 0; j < len; j++) {
133 byte b = buf[offset + j];
134 if (b == '.') translated[j] = (byte) '/';
135 else translated[j] = b;
136 }
137 return translated;
138 }
140 /** Return external representation of given name,
141 * converting '/' to '.'.
142 */
143 public static byte[] externalize(Name name) {
144 return externalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
145 }
147 /************************************************************************
148 * Name-and-type
149 ***********************************************************************/
151 /** A class for the name-and-type signature of a method or field.
152 */
153 public static class NameAndType {
154 Name name;
155 Type type;
157 NameAndType(Name name, Type type) {
158 this.name = name;
159 this.type = type;
160 }
162 public boolean equals(Object other) {
163 return
164 other instanceof NameAndType &&
165 name == ((NameAndType) other).name &&
166 type.equals(((NameAndType) other).type);
167 }
169 public int hashCode() {
170 return name.hashCode() * type.hashCode();
171 }
172 }
173 }