1 /*
2  * Copyright (c) 1997, 2018, 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 #ifndef SHARE_VM_UTILITIES_CONSTANTTAG_HPP
26 #define SHARE_VM_UTILITIES_CONSTANTTAG_HPP
27 
28 #include "jvm.h"
29 #include "utilities/globalDefinitions.hpp"
30 
31 // constant tags in Java .class files
32 
33 
34 enum {
35   // See jvm.h for shared JVM_CONSTANT_XXX tags
36   // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/utilities/ConstantTag.java
37   // Hotspot specific tags
38   JVM_CONSTANT_Invalid                  = 0,    // For bad value initialization
39   JVM_CONSTANT_InternalMin              = 100,  // First implementation tag (aside from bad value of course)
40   JVM_CONSTANT_UnresolvedClass          = 100,  // Temporary tag until actual use
41   JVM_CONSTANT_ClassIndex               = 101,  // Temporary tag while constructing constant pool
42   JVM_CONSTANT_StringIndex              = 102,  // Temporary tag while constructing constant pool
43   JVM_CONSTANT_UnresolvedClassInError   = 103,  // Error tag due to resolution error
44   JVM_CONSTANT_MethodHandleInError      = 104,  // Error tag due to resolution error
45   JVM_CONSTANT_MethodTypeInError        = 105,  // Error tag due to resolution error
46   JVM_CONSTANT_DynamicInError           = 106,  // Error tag due to resolution error
47   JVM_CONSTANT_InternalMax              = 106   // Last implementation tag
48 };
49 
50 
51 class constantTag {
52  private:
53   jbyte _tag;
54  public:
is_klass() const55   bool is_klass() const             { return _tag == JVM_CONSTANT_Class; }
is_field() const56   bool is_field () const            { return _tag == JVM_CONSTANT_Fieldref; }
is_method() const57   bool is_method() const            { return _tag == JVM_CONSTANT_Methodref; }
is_interface_method() const58   bool is_interface_method() const  { return _tag == JVM_CONSTANT_InterfaceMethodref; }
is_string() const59   bool is_string() const            { return _tag == JVM_CONSTANT_String; }
is_int() const60   bool is_int() const               { return _tag == JVM_CONSTANT_Integer; }
is_float() const61   bool is_float() const             { return _tag == JVM_CONSTANT_Float; }
is_long() const62   bool is_long() const              { return _tag == JVM_CONSTANT_Long; }
is_double() const63   bool is_double() const            { return _tag == JVM_CONSTANT_Double; }
is_name_and_type() const64   bool is_name_and_type() const     { return _tag == JVM_CONSTANT_NameAndType; }
is_utf8() const65   bool is_utf8() const              { return _tag == JVM_CONSTANT_Utf8; }
66 
is_invalid() const67   bool is_invalid() const           { return _tag == JVM_CONSTANT_Invalid; }
68 
is_unresolved_klass() const69   bool is_unresolved_klass() const {
70     return _tag == JVM_CONSTANT_UnresolvedClass || _tag == JVM_CONSTANT_UnresolvedClassInError;
71   }
72 
is_unresolved_klass_in_error() const73   bool is_unresolved_klass_in_error() const {
74     return _tag == JVM_CONSTANT_UnresolvedClassInError;
75   }
76 
is_method_handle_in_error() const77   bool is_method_handle_in_error() const {
78     return _tag == JVM_CONSTANT_MethodHandleInError;
79   }
is_method_type_in_error() const80   bool is_method_type_in_error() const {
81     return _tag == JVM_CONSTANT_MethodTypeInError;
82   }
83 
is_dynamic_constant_in_error() const84   bool is_dynamic_constant_in_error() const {
85     return _tag == JVM_CONSTANT_DynamicInError;
86   }
87 
is_klass_index() const88   bool is_klass_index() const       { return _tag == JVM_CONSTANT_ClassIndex; }
is_string_index() const89   bool is_string_index() const      { return _tag == JVM_CONSTANT_StringIndex; }
90 
is_klass_reference() const91   bool is_klass_reference() const   { return is_klass_index() || is_unresolved_klass(); }
is_klass_or_reference() const92   bool is_klass_or_reference() const{ return is_klass() || is_klass_reference(); }
is_field_or_method() const93   bool is_field_or_method() const   { return is_field() || is_method() || is_interface_method(); }
is_symbol() const94   bool is_symbol() const            { return is_utf8(); }
95 
is_method_type() const96   bool is_method_type() const       { return _tag == JVM_CONSTANT_MethodType; }
is_method_handle() const97   bool is_method_handle() const     { return _tag == JVM_CONSTANT_MethodHandle; }
is_dynamic_constant() const98   bool is_dynamic_constant() const  { return _tag == JVM_CONSTANT_Dynamic; }
is_invoke_dynamic() const99   bool is_invoke_dynamic() const    { return _tag == JVM_CONSTANT_InvokeDynamic; }
100 
is_loadable_constant() const101   bool is_loadable_constant() const {
102     return ((_tag >= JVM_CONSTANT_Integer && _tag <= JVM_CONSTANT_String) ||
103             is_method_type() || is_method_handle() || is_dynamic_constant() ||
104             is_unresolved_klass());
105   }
106 
constantTag()107   constantTag() {
108     _tag = JVM_CONSTANT_Invalid;
109   }
constantTag(jbyte tag)110   constantTag(jbyte tag) {
111     assert((tag >= 0 && tag <= JVM_CONSTANT_NameAndType) ||
112            (tag >= JVM_CONSTANT_MethodHandle && tag <= JVM_CONSTANT_InvokeDynamic) ||
113            (tag >= JVM_CONSTANT_InternalMin && tag <= JVM_CONSTANT_InternalMax), "Invalid constant tag");
114     _tag = tag;
115   }
116 
ofBasicType(BasicType bt)117   static constantTag ofBasicType(BasicType bt) {
118     if (is_subword_type(bt))  bt = T_INT;
119     switch (bt) {
120       case T_OBJECT: return constantTag(JVM_CONSTANT_String);
121       case T_INT:    return constantTag(JVM_CONSTANT_Integer);
122       case T_LONG:   return constantTag(JVM_CONSTANT_Long);
123       case T_FLOAT:  return constantTag(JVM_CONSTANT_Float);
124       case T_DOUBLE: return constantTag(JVM_CONSTANT_Double);
125       default:       break;
126     }
127     assert(false, "bad basic type for tag");
128     return constantTag();
129   }
130 
value() const131   jbyte value() const                { return _tag; }
132   jbyte error_value() const;
133   jbyte non_error_value() const;
134 
135   BasicType basic_type() const;        // if used with ldc, what kind of value gets pushed?
136 
137   const char* internal_name() const;  // for error reporting
138 
139   void print_on(outputStream* st) const PRODUCT_RETURN;
140 };
141 
142 #endif // SHARE_VM_UTILITIES_CONSTANTTAG_HPP
143