Mon, 07 Feb 2011 18:10:13 +0000
7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
Summary: override clash algorithm is not implemented correctly
Reviewed-by: jjg
1 /*
2 * Copyright (c) 1999, 2011, 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;
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 MAX_PARAMETERS = 0xff;
88 public final static int MAX_DIMENSIONS = 0xff;
89 public final static int MAX_CODE = 0xffff;
90 public final static int MAX_LOCALS = 0xffff;
91 public final static int MAX_STACK = 0xffff;
93 public enum Version {
94 V45_3(45, 3), // base level for all attributes
95 V49(49, 0), // JDK 1.5: enum, generics, annotations
96 V50(50, 0), // JDK 1.6: stackmaps
97 V51(51, 0); // JDK 1.7
98 Version(int major, int minor) {
99 this.major = major;
100 this.minor = minor;
101 }
102 public final int major, minor;
103 }
106 /************************************************************************
107 * String Translation Routines
108 ***********************************************************************/
110 /** Return internal representation of buf[offset..offset+len-1],
111 * converting '/' to '.'.
112 */
113 public static byte[] internalize(byte[] buf, int offset, int len) {
114 byte[] translated = new byte[len];
115 for (int j = 0; j < len; j++) {
116 byte b = buf[offset + j];
117 if (b == '/') translated[j] = (byte) '.';
118 else translated[j] = b;
119 }
120 return translated;
121 }
123 /** Return internal representation of given name,
124 * converting '/' to '.'.
125 */
126 public static byte[] internalize(Name name) {
127 return internalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
128 }
130 /** Return external representation of buf[offset..offset+len-1],
131 * converting '.' to '/'.
132 */
133 public static byte[] externalize(byte[] buf, int offset, int len) {
134 byte[] translated = new byte[len];
135 for (int j = 0; j < len; j++) {
136 byte b = buf[offset + j];
137 if (b == '.') translated[j] = (byte) '/';
138 else translated[j] = b;
139 }
140 return translated;
141 }
143 /** Return external representation of given name,
144 * converting '/' to '.'.
145 */
146 public static byte[] externalize(Name name) {
147 return externalize(name.getByteArray(), name.getByteOffset(), name.getByteLength());
148 }
150 /************************************************************************
151 * Name-and-type
152 ***********************************************************************/
154 /** A class for the name-and-type signature of a method or field.
155 */
156 public static class NameAndType {
157 Name name;
158 Type type;
160 NameAndType(Name name, Type type) {
161 this.name = name;
162 this.type = type;
163 }
165 public boolean equals(Object other) {
166 return
167 other instanceof NameAndType &&
168 name == ((NameAndType) other).name &&
169 type.equals(((NameAndType) other).type);
170 }
172 public int hashCode() {
173 return name.hashCode() * type.hashCode();
174 }
175 }
176 }