Fri, 14 Jun 2013 16:25:09 +0100
8016569: javac, add new flag for polymorphic method signatures
Reviewed-by: jjg
Contributed-by: maurizio.cimadamore@oracle.com
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.code.Types;
30 import com.sun.tools.javac.code.Types.UniqueType;
31 import com.sun.tools.javac.util.Name;
34 /** A JVM class file.
35 *
36 * <p>Generic Java classfiles have one additional attribute for classes,
37 * methods and fields:
38 * <pre>
39 * "Signature" (u4 attr-length, u2 signature-index)
40 * </pre>
41 *
42 * <p>A signature gives the full Java type of a method or field. When
43 * used as a class attribute, it indicates type parameters, followed
44 * by supertype, followed by all interfaces.
45 * <pre>
46 * methodOrFieldSignature ::= type
47 * classSignature ::= [ typeparams ] supertype { interfacetype }
48 * </pre>
49 * <p>The type syntax in signatures is extended as follows:
50 * <pre>{@literal
51 * type ::= ... | classtype | methodtype | typevar
52 * classtype ::= classsig { '.' classsig }
53 * classig ::= 'L' name [typeargs] ';'
54 * methodtype ::= [ typeparams ] '(' { type } ')' type
55 * typevar ::= 'T' name ';'
56 * typeargs ::= '<' type { type } '>'
57 * typeparams ::= '<' typeparam { typeparam } '>'
58 * typeparam ::= name ':' type
59 * }</pre>
60 * <p>This class defines constants used in class files as well
61 * as routines to convert between internal ``.'' and external ``/''
62 * separators in class names.
63 *
64 * <p><b>This is NOT part of any supported API.
65 * If you write code that depends on this, you do so at your own risk.
66 * This code and its internal interfaces are subject to change or
67 * deletion without notice.</b> */
68 public class ClassFile {
70 public final static int JAVA_MAGIC = 0xCAFEBABE;
72 // see Target
73 public final static int CONSTANT_Utf8 = 1;
74 public final static int CONSTANT_Unicode = 2;
75 public final static int CONSTANT_Integer = 3;
76 public final static int CONSTANT_Float = 4;
77 public final static int CONSTANT_Long = 5;
78 public final static int CONSTANT_Double = 6;
79 public final static int CONSTANT_Class = 7;
80 public final static int CONSTANT_String = 8;
81 public final static int CONSTANT_Fieldref = 9;
82 public final static int CONSTANT_Methodref = 10;
83 public final static int CONSTANT_InterfaceMethodref = 11;
84 public final static int CONSTANT_NameandType = 12;
85 public final static int CONSTANT_MethodHandle = 15;
86 public final static int CONSTANT_MethodType = 16;
87 public final static int CONSTANT_InvokeDynamic = 18;
89 public final static int REF_getField = 1;
90 public final static int REF_getStatic = 2;
91 public final static int REF_putField = 3;
92 public final static int REF_putStatic = 4;
93 public final static int REF_invokeVirtual = 5;
94 public final static int REF_invokeStatic = 6;
95 public final static int REF_invokeSpecial = 7;
96 public final static int REF_newInvokeSpecial = 8;
97 public final static int REF_invokeInterface = 9;
99 public final static int MAX_PARAMETERS = 0xff;
100 public final static int MAX_DIMENSIONS = 0xff;
101 public final static int MAX_CODE = 0xffff;
102 public final static int MAX_LOCALS = 0xffff;
103 public final static int MAX_STACK = 0xffff;
105 public enum Version {
106 V45_3(45, 3), // base level for all attributes
107 V49(49, 0), // JDK 1.5: enum, generics, annotations
108 V50(50, 0), // JDK 1.6: stackmaps
109 V51(51, 0), // JDK 1.7
110 V52(52, 0); // JDK 1.8: lambda, type annos, param names
111 Version(int major, int minor) {
112 this.major = major;
113 this.minor = minor;
114 }
115 public final int major, minor;
116 }
119 /************************************************************************
120 * String Translation Routines
121 ***********************************************************************/
123 /** Return internal representation of buf[offset..offset+len-1],
124 * converting '/' to '.'.
125 */
126 public static byte[] internalize(byte[] buf, int offset, int len) {
127 byte[] translated = new byte[len];
128 for (int j = 0; j < len; j++) {
129 byte b = buf[offset + j];
130 if (b == '/') translated[j] = (byte) '.';
131 else translated[j] = b;
132 }
133 return translated;
134 }
136 /** Return internal representation of given name,
137 * converting '/' to '.'.
138 */
139 public static byte[] internalize(Name name) {
140 return internalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
141 }
143 /** Return external representation of buf[offset..offset+len-1],
144 * converting '.' to '/'.
145 */
146 public static byte[] externalize(byte[] buf, int offset, int len) {
147 byte[] translated = new byte[len];
148 for (int j = 0; j < len; j++) {
149 byte b = buf[offset + j];
150 if (b == '.') translated[j] = (byte) '/';
151 else translated[j] = b;
152 }
153 return translated;
154 }
156 /** Return external representation of given name,
157 * converting '/' to '.'.
158 */
159 public static byte[] externalize(Name name) {
160 return externalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
161 }
163 /************************************************************************
164 * Name-and-type
165 ***********************************************************************/
167 /** A class for the name-and-type signature of a method or field.
168 */
169 public static class NameAndType {
170 Name name;
171 UniqueType uniqueType;
172 Types types;
174 NameAndType(Name name, Type type, Types types) {
175 this.name = name;
176 this.uniqueType = new UniqueType(type, types);
177 this.types = types;
178 }
180 void setType(Type type) {
181 this.uniqueType = new UniqueType(type, types);
182 }
184 @Override
185 public boolean equals(Object other) {
186 return (other instanceof NameAndType &&
187 name == ((NameAndType) other).name &&
188 uniqueType.equals(((NameAndType) other).uniqueType));
189 }
191 @Override
192 public int hashCode() {
193 return name.hashCode() * uniqueType.hashCode();
194 }
195 }
196 }