Thu, 04 Oct 2012 13:04:53 +0100
7177387: Add target-typing support in method context
Summary: Add support for deferred types and speculative attribution
Reviewed-by: jjg, dlsmith
1 /*
2 * Copyright (c) 1999, 2012, 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>{@literal
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;
83 public final static int CONSTANT_MethodHandle = 15;
84 public final static int CONSTANT_MethodType = 16;
85 public final static int CONSTANT_InvokeDynamic = 18;
87 public final static int REF_getField = 1;
88 public final static int REF_getStatic = 2;
89 public final static int REF_putField = 3;
90 public final static int REF_putStatic = 4;
91 public final static int REF_invokeVirtual = 5;
92 public final static int REF_invokeStatic = 6;
93 public final static int REF_invokeSpecial = 7;
94 public final static int REF_newInvokeSpecial = 8;
95 public final static int REF_invokeInterface = 9;
97 public final static int MAX_PARAMETERS = 0xff;
98 public final static int MAX_DIMENSIONS = 0xff;
99 public final static int MAX_CODE = 0xffff;
100 public final static int MAX_LOCALS = 0xffff;
101 public final static int MAX_STACK = 0xffff;
103 public enum Version {
104 V45_3(45, 3), // base level for all attributes
105 V49(49, 0), // JDK 1.5: enum, generics, annotations
106 V50(50, 0), // JDK 1.6: stackmaps
107 V51(51, 0); // JDK 1.7
108 Version(int major, int minor) {
109 this.major = major;
110 this.minor = minor;
111 }
112 public final int major, minor;
113 }
116 /************************************************************************
117 * String Translation Routines
118 ***********************************************************************/
120 /** Return internal representation of buf[offset..offset+len-1],
121 * converting '/' to '.'.
122 */
123 public static byte[] internalize(byte[] buf, int offset, int len) {
124 byte[] translated = new byte[len];
125 for (int j = 0; j < len; j++) {
126 byte b = buf[offset + j];
127 if (b == '/') translated[j] = (byte) '.';
128 else translated[j] = b;
129 }
130 return translated;
131 }
133 /** Return internal representation of given name,
134 * converting '/' to '.'.
135 */
136 public static byte[] internalize(Name name) {
137 return internalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
138 }
140 /** Return external representation of buf[offset..offset+len-1],
141 * converting '.' to '/'.
142 */
143 public static byte[] externalize(byte[] buf, int offset, int len) {
144 byte[] translated = new byte[len];
145 for (int j = 0; j < len; j++) {
146 byte b = buf[offset + j];
147 if (b == '.') translated[j] = (byte) '/';
148 else translated[j] = b;
149 }
150 return translated;
151 }
153 /** Return external representation of given name,
154 * converting '/' to '.'.
155 */
156 public static byte[] externalize(Name name) {
157 return externalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
158 }
160 /************************************************************************
161 * Name-and-type
162 ***********************************************************************/
164 /** A class for the name-and-type signature of a method or field.
165 */
166 public static class NameAndType {
167 Name name;
168 Type type;
170 NameAndType(Name name, Type type) {
171 this.name = name;
172 this.type = type;
173 }
175 public boolean equals(Object other) {
176 return
177 other instanceof NameAndType &&
178 name == ((NameAndType) other).name &&
179 type.equals(((NameAndType) other).type);
180 }
182 public int hashCode() {
183 return name.hashCode() * type.hashCode();
184 }
185 }
186 }