1 /*
2  * Copyright (c) 2001, 2013, 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.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 package sun.jvm.hotspot.utilities;
26 
27 import sun.jvm.hotspot.runtime.BasicType;
28 
29 public class ConstantTag {
30   // These replicated from the VM to save space
31   private static final int JVM_CONSTANT_Utf8                    = 1;
32   private static final int JVM_CONSTANT_Unicode                 = 2; // unused
33   private static final int JVM_CONSTANT_Integer                 = 3;
34   private static final int JVM_CONSTANT_Float                   = 4;
35   private static final int JVM_CONSTANT_Long                    = 5;
36   private static final int JVM_CONSTANT_Double                  = 6;
37   private static final int JVM_CONSTANT_Class                   = 7;
38   private static final int JVM_CONSTANT_String                  = 8;
39   private static final int JVM_CONSTANT_Fieldref                = 9;
40   private static final int JVM_CONSTANT_Methodref               = 10;
41   private static final int JVM_CONSTANT_InterfaceMethodref      = 11;
42   private static final int JVM_CONSTANT_NameAndType             = 12;
43   private static final int JVM_CONSTANT_MethodHandle            = 15;  // JSR 292
44   private static final int JVM_CONSTANT_MethodType              = 16;  // JSR 292
45   private static final int JVM_CONSTANT_Dynamic                 = 17;  // JSR 292 early drafts only
46   private static final int JVM_CONSTANT_InvokeDynamic           = 18;  // JSR 292
47   private static final int JVM_CONSTANT_Invalid                 = 0;   // For bad value initialization
48   private static final int JVM_CONSTANT_UnresolvedClass         = 100; // Temporary tag until actual use
49   private static final int JVM_CONSTANT_ClassIndex              = 101; // Temporary tag while constructing constant pool
50   private static final int JVM_CONSTANT_StringIndex             = 102; // Temporary tag while constructing constant pool
51   private static final int JVM_CONSTANT_UnresolvedClassInError  = 103; // Resolution failed
52   private static final int JVM_CONSTANT_MethodHandleInError     = 104; // Error tag due to resolution error
53   private static final int JVM_CONSTANT_MethodTypeInError       = 105; // Error tag due to resolution error
54 
55   // JVM_CONSTANT_MethodHandle subtypes //FIXME: connect these to data structure
56   private static int JVM_REF_getField                = 1;
57   private static int JVM_REF_getStatic               = 2;
58   private static int JVM_REF_putField                = 3;
59   private static int JVM_REF_putStatic               = 4;
60   private static int JVM_REF_invokeVirtual           = 5;
61   private static int JVM_REF_invokeStatic            = 6;
62   private static int JVM_REF_invokeSpecial           = 7;
63   private static int JVM_REF_newInvokeSpecial        = 8;
64   private static int JVM_REF_invokeInterface         = 9;
65 
66   private byte tag;
67 
ConstantTag(byte tag)68   public ConstantTag(byte tag) {
69     this.tag = tag;
70   }
71 
value()72   public int value() { return tag; }
73 
isKlass()74   public boolean isKlass()            { return tag == JVM_CONSTANT_Class; }
isField()75   public boolean isField ()           { return tag == JVM_CONSTANT_Fieldref; }
isMethod()76   public boolean isMethod()           { return tag == JVM_CONSTANT_Methodref; }
isInterfaceMethod()77   public boolean isInterfaceMethod()  { return tag == JVM_CONSTANT_InterfaceMethodref; }
isString()78   public boolean isString()           { return tag == JVM_CONSTANT_String; }
isInt()79   public boolean isInt()              { return tag == JVM_CONSTANT_Integer; }
isFloat()80   public boolean isFloat()            { return tag == JVM_CONSTANT_Float; }
isLong()81   public boolean isLong()             { return tag == JVM_CONSTANT_Long; }
isDouble()82   public boolean isDouble()           { return tag == JVM_CONSTANT_Double; }
isNameAndType()83   public boolean isNameAndType()      { return tag == JVM_CONSTANT_NameAndType; }
isUtf8()84   public boolean isUtf8()             { return tag == JVM_CONSTANT_Utf8; }
isMethodHandle()85   public boolean isMethodHandle()     { return tag == JVM_CONSTANT_MethodHandle; }
isMethodType()86   public boolean isMethodType()       { return tag == JVM_CONSTANT_MethodType; }
isDynamicConstant()87   public boolean isDynamicConstant()  { return tag == JVM_CONSTANT_Dynamic; }
isInvokeDynamic()88   public boolean isInvokeDynamic()    { return tag == JVM_CONSTANT_InvokeDynamic; }
89 
isInvalid()90   public boolean isInvalid()          { return tag == JVM_CONSTANT_Invalid; }
91 
isUnresolvedKlass()92   public boolean isUnresolvedKlass()  {
93     return tag == JVM_CONSTANT_UnresolvedClass || tag == JVM_CONSTANT_UnresolvedClassInError;
94   }
isUnresolveKlassInError()95   public boolean isUnresolveKlassInError()  { return tag == JVM_CONSTANT_UnresolvedClassInError; }
isKlassIndex()96   public boolean isKlassIndex()             { return tag == JVM_CONSTANT_ClassIndex; }
isStringIndex()97   public boolean isStringIndex()            { return tag == JVM_CONSTANT_StringIndex; }
98 
isKlassReference()99   public boolean isKlassReference()   { return isKlassIndex() || isUnresolvedKlass(); }
isFieldOrMethod()100   public boolean isFieldOrMethod()    { return isField() || isMethod() || isInterfaceMethod(); }
isSymbol()101   public boolean isSymbol()           { return isUtf8(); }
102 
basicType()103   public BasicType basicType() {
104     switch (tag) {
105     case JVM_CONSTANT_Integer :
106       return BasicType.T_INT;
107     case JVM_CONSTANT_Float :
108       return BasicType.T_FLOAT;
109     case JVM_CONSTANT_Long :
110       return BasicType.T_LONG;
111     case JVM_CONSTANT_Double :
112       return BasicType.T_DOUBLE;
113 
114     case JVM_CONSTANT_Class :
115     case JVM_CONSTANT_String :
116     case JVM_CONSTANT_UnresolvedClass :
117     case JVM_CONSTANT_UnresolvedClassInError :
118     case JVM_CONSTANT_MethodHandleInError :
119     case JVM_CONSTANT_MethodTypeInError :
120     case JVM_CONSTANT_ClassIndex :
121     case JVM_CONSTANT_StringIndex :
122     case JVM_CONSTANT_MethodHandle :
123     case JVM_CONSTANT_MethodType :
124       return BasicType.T_OBJECT;
125     default:
126       throw new InternalError("unexpected tag: " + tag);
127     }
128   }
129 
toString()130   public String toString() {
131     return "ConstantTag:" + Integer.toString(tag);
132 }
133 }
134