Home » openjdk-7 » com.sun.tools » javac » jvm » [javadoc | source]

    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    */
   25   
   26   package com.sun.tools.javac.jvm;
   27   
   28   import com.sun.tools.javac.code.Type;
   29   import com.sun.tools.javac.util.Name;
   30   
   31   
   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 {
   67   
   68       public final static int JAVA_MAGIC = 0xCAFEBABE;
   69   
   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;
   86   
   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;
   92   
   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       }
  104   
  105   
  106   /************************************************************************
  107    * String Translation Routines
  108    ***********************************************************************/
  109   
  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       }
  122   
  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       }
  129   
  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       }
  142   
  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       }
  149   
  150   /************************************************************************
  151    * Name-and-type
  152    ***********************************************************************/
  153   
  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;
  159   
  160           NameAndType(Name name, Type type) {
  161               this.name = name;
  162               this.type = type;
  163           }
  164   
  165           public boolean equals(Object other) {
  166               return
  167                   other instanceof NameAndType &&
  168                   name == ((NameAndType) other).name &&
  169                   type.equals(((NameAndType) other).type);
  170           }
  171   
  172           public int hashCode() {
  173               return name.hashCode() * type.hashCode();
  174           }
  175       }
  176   }

Home » openjdk-7 » com.sun.tools » javac » jvm » [javadoc | source]