1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/share/vm/utilities/accessFlags.hpp Wed Apr 27 01:25:04 2016 +0800 1.3 @@ -0,0 +1,261 @@ 1.4 +/* 1.5 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 1.23 + * or visit www.oracle.com if you need additional information or have any 1.24 + * questions. 1.25 + * 1.26 + */ 1.27 + 1.28 +#ifndef SHARE_VM_UTILITIES_ACCESSFLAGS_HPP 1.29 +#define SHARE_VM_UTILITIES_ACCESSFLAGS_HPP 1.30 + 1.31 +#include "prims/jvm.h" 1.32 +#include "utilities/top.hpp" 1.33 + 1.34 +// AccessFlags is an abstraction over Java access flags. 1.35 + 1.36 + 1.37 +enum { 1.38 + // See jvm.h for shared JVM_ACC_XXX access flags 1.39 + 1.40 + // HotSpot-specific access flags 1.41 + 1.42 + // flags actually put in .class file 1.43 + JVM_ACC_WRITTEN_FLAGS = 0x00007FFF, 1.44 + 1.45 + // Method* flags 1.46 + JVM_ACC_MONITOR_MATCH = 0x10000000, // True if we know that monitorenter/monitorexit bytecodes match 1.47 + JVM_ACC_HAS_MONITOR_BYTECODES = 0x20000000, // Method contains monitorenter/monitorexit bytecodes 1.48 + JVM_ACC_HAS_LOOPS = 0x40000000, // Method has loops 1.49 + JVM_ACC_LOOPS_FLAG_INIT = (int)0x80000000,// The loop flag has been initialized 1.50 + JVM_ACC_QUEUED = 0x01000000, // Queued for compilation 1.51 + JVM_ACC_NOT_C2_COMPILABLE = 0x02000000, 1.52 + JVM_ACC_NOT_C1_COMPILABLE = 0x04000000, 1.53 + JVM_ACC_NOT_C2_OSR_COMPILABLE = 0x08000000, 1.54 + JVM_ACC_HAS_LINE_NUMBER_TABLE = 0x00100000, 1.55 + JVM_ACC_HAS_CHECKED_EXCEPTIONS = 0x00400000, 1.56 + JVM_ACC_HAS_JSRS = 0x00800000, 1.57 + JVM_ACC_IS_OLD = 0x00010000, // RedefineClasses() has replaced this method 1.58 + JVM_ACC_IS_OBSOLETE = 0x00020000, // RedefineClasses() has made method obsolete 1.59 + JVM_ACC_IS_PREFIXED_NATIVE = 0x00040000, // JVMTI has prefixed this native method 1.60 + JVM_ACC_ON_STACK = 0x00080000, // RedefinedClasses() is used on the stack 1.61 + 1.62 + // Klass* flags 1.63 + JVM_ACC_HAS_MIRANDA_METHODS = 0x10000000, // True if this class has miranda methods in it's vtable 1.64 + JVM_ACC_HAS_VANILLA_CONSTRUCTOR = 0x20000000, // True if klass has a vanilla default constructor 1.65 + JVM_ACC_HAS_FINALIZER = 0x40000000, // True if klass has a non-empty finalize() method 1.66 + JVM_ACC_IS_CLONEABLE = (int)0x80000000,// True if klass supports the Clonable interface 1.67 + JVM_ACC_HAS_FINAL_METHOD = 0x01000000, // True if klass has final method 1.68 + 1.69 + // Klass* and Method* flags 1.70 + JVM_ACC_HAS_LOCAL_VARIABLE_TABLE= 0x00200000, 1.71 + 1.72 + JVM_ACC_PROMOTED_FLAGS = 0x00200000, // flags promoted from methods to the holding klass 1.73 + 1.74 + // field flags 1.75 + // Note: these flags must be defined in the low order 16 bits because 1.76 + // InstanceKlass only stores a ushort worth of information from the 1.77 + // AccessFlags value. 1.78 + // These bits must not conflict with any other field-related access flags 1.79 + // (e.g., ACC_ENUM). 1.80 + // Note that the class-related ACC_ANNOTATION bit conflicts with these flags. 1.81 + JVM_ACC_FIELD_ACCESS_WATCHED = 0x00002000, // field access is watched by JVMTI 1.82 + JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000, // field modification is watched by JVMTI 1.83 + JVM_ACC_FIELD_INTERNAL = 0x00000400, // internal field, same as JVM_ACC_ABSTRACT 1.84 + JVM_ACC_FIELD_STABLE = 0x00000020, // @Stable field, same as JVM_ACC_SYNCHRONIZED 1.85 + JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE = 0x00000800, // field has generic signature 1.86 + 1.87 + JVM_ACC_FIELD_INTERNAL_FLAGS = JVM_ACC_FIELD_ACCESS_WATCHED | 1.88 + JVM_ACC_FIELD_MODIFICATION_WATCHED | 1.89 + JVM_ACC_FIELD_INTERNAL | 1.90 + JVM_ACC_FIELD_STABLE | 1.91 + JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE, 1.92 + 1.93 + // flags accepted by set_field_flags() 1.94 + JVM_ACC_FIELD_FLAGS = JVM_RECOGNIZED_FIELD_MODIFIERS | JVM_ACC_FIELD_INTERNAL_FLAGS 1.95 + 1.96 +}; 1.97 + 1.98 + 1.99 +class AccessFlags VALUE_OBJ_CLASS_SPEC { 1.100 + friend class VMStructs; 1.101 + private: 1.102 + jint _flags; 1.103 + 1.104 + public: 1.105 + // Java access flags 1.106 + bool is_public () const { return (_flags & JVM_ACC_PUBLIC ) != 0; } 1.107 + bool is_private () const { return (_flags & JVM_ACC_PRIVATE ) != 0; } 1.108 + bool is_protected () const { return (_flags & JVM_ACC_PROTECTED ) != 0; } 1.109 + bool is_static () const { return (_flags & JVM_ACC_STATIC ) != 0; } 1.110 + bool is_final () const { return (_flags & JVM_ACC_FINAL ) != 0; } 1.111 + bool is_synchronized() const { return (_flags & JVM_ACC_SYNCHRONIZED) != 0; } 1.112 + bool is_super () const { return (_flags & JVM_ACC_SUPER ) != 0; } 1.113 + bool is_volatile () const { return (_flags & JVM_ACC_VOLATILE ) != 0; } 1.114 + bool is_transient () const { return (_flags & JVM_ACC_TRANSIENT ) != 0; } 1.115 + bool is_native () const { return (_flags & JVM_ACC_NATIVE ) != 0; } 1.116 + bool is_interface () const { return (_flags & JVM_ACC_INTERFACE ) != 0; } 1.117 + bool is_abstract () const { return (_flags & JVM_ACC_ABSTRACT ) != 0; } 1.118 + bool is_strict () const { return (_flags & JVM_ACC_STRICT ) != 0; } 1.119 + 1.120 + // Attribute flags 1.121 + bool is_synthetic () const { return (_flags & JVM_ACC_SYNTHETIC ) != 0; } 1.122 + 1.123 + // Method* flags 1.124 + bool is_monitor_matching () const { return (_flags & JVM_ACC_MONITOR_MATCH ) != 0; } 1.125 + bool has_monitor_bytecodes () const { return (_flags & JVM_ACC_HAS_MONITOR_BYTECODES ) != 0; } 1.126 + bool has_loops () const { return (_flags & JVM_ACC_HAS_LOOPS ) != 0; } 1.127 + bool loops_flag_init () const { return (_flags & JVM_ACC_LOOPS_FLAG_INIT ) != 0; } 1.128 + bool queued_for_compilation () const { return (_flags & JVM_ACC_QUEUED ) != 0; } 1.129 + bool is_not_c1_compilable () const { return (_flags & JVM_ACC_NOT_C1_COMPILABLE ) != 0; } 1.130 + bool is_not_c2_compilable () const { return (_flags & JVM_ACC_NOT_C2_COMPILABLE ) != 0; } 1.131 + bool is_not_c2_osr_compilable() const { return (_flags & JVM_ACC_NOT_C2_OSR_COMPILABLE ) != 0; } 1.132 + bool has_linenumber_table () const { return (_flags & JVM_ACC_HAS_LINE_NUMBER_TABLE ) != 0; } 1.133 + bool has_checked_exceptions () const { return (_flags & JVM_ACC_HAS_CHECKED_EXCEPTIONS ) != 0; } 1.134 + bool has_jsrs () const { return (_flags & JVM_ACC_HAS_JSRS ) != 0; } 1.135 + bool is_old () const { return (_flags & JVM_ACC_IS_OLD ) != 0; } 1.136 + bool is_obsolete () const { return (_flags & JVM_ACC_IS_OBSOLETE ) != 0; } 1.137 + bool is_prefixed_native () const { return (_flags & JVM_ACC_IS_PREFIXED_NATIVE ) != 0; } 1.138 + 1.139 + // Klass* flags 1.140 + bool has_miranda_methods () const { return (_flags & JVM_ACC_HAS_MIRANDA_METHODS ) != 0; } 1.141 + bool has_vanilla_constructor () const { return (_flags & JVM_ACC_HAS_VANILLA_CONSTRUCTOR) != 0; } 1.142 + bool has_finalizer () const { return (_flags & JVM_ACC_HAS_FINALIZER ) != 0; } 1.143 + bool has_final_method () const { return (_flags & JVM_ACC_HAS_FINAL_METHOD ) != 0; } 1.144 + bool is_cloneable () const { return (_flags & JVM_ACC_IS_CLONEABLE ) != 0; } 1.145 + // Klass* and Method* flags 1.146 + bool has_localvariable_table () const { return (_flags & JVM_ACC_HAS_LOCAL_VARIABLE_TABLE) != 0; } 1.147 + void set_has_localvariable_table() { atomic_set_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); } 1.148 + void clear_has_localvariable_table() { atomic_clear_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); } 1.149 + 1.150 + // field flags 1.151 + bool is_field_access_watched() const { return (_flags & JVM_ACC_FIELD_ACCESS_WATCHED) != 0; } 1.152 + bool is_field_modification_watched() const 1.153 + { return (_flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; } 1.154 + bool on_stack() const { return (_flags & JVM_ACC_ON_STACK) != 0; } 1.155 + bool is_internal() const { return (_flags & JVM_ACC_FIELD_INTERNAL) != 0; } 1.156 + bool is_stable() const { return (_flags & JVM_ACC_FIELD_STABLE) != 0; } 1.157 + bool field_has_generic_signature() const 1.158 + { return (_flags & JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE) != 0; } 1.159 + 1.160 + // get .class file flags 1.161 + jint get_flags () const { return (_flags & JVM_ACC_WRITTEN_FLAGS); } 1.162 + 1.163 + // Initialization 1.164 + void add_promoted_flags(jint flags) { _flags |= (flags & JVM_ACC_PROMOTED_FLAGS); } 1.165 + void set_field_flags(jint flags) { 1.166 + assert((flags & JVM_ACC_FIELD_FLAGS) == flags, "only recognized flags"); 1.167 + _flags = (flags & JVM_ACC_FIELD_FLAGS); 1.168 + } 1.169 + void set_flags(jint flags) { _flags = (flags & JVM_ACC_WRITTEN_FLAGS); } 1.170 + 1.171 + void set_queued_for_compilation() { atomic_set_bits(JVM_ACC_QUEUED); } 1.172 + void clear_queued_for_compilation() { atomic_clear_bits(JVM_ACC_QUEUED); } 1.173 + 1.174 + // Atomic update of flags 1.175 + void atomic_set_bits(jint bits); 1.176 + void atomic_clear_bits(jint bits); 1.177 + 1.178 + private: 1.179 + friend class Method; 1.180 + friend class Klass; 1.181 + friend class ClassFileParser; 1.182 + // the functions below should only be called on the _access_flags inst var directly, 1.183 + // otherwise they are just changing a copy of the flags 1.184 + 1.185 + // attribute flags 1.186 + void set_is_synthetic() { atomic_set_bits(JVM_ACC_SYNTHETIC); } 1.187 + 1.188 + // Method* flags 1.189 + void set_monitor_matching() { atomic_set_bits(JVM_ACC_MONITOR_MATCH); } 1.190 + void set_has_monitor_bytecodes() { atomic_set_bits(JVM_ACC_HAS_MONITOR_BYTECODES); } 1.191 + void set_has_loops() { atomic_set_bits(JVM_ACC_HAS_LOOPS); } 1.192 + void set_loops_flag_init() { atomic_set_bits(JVM_ACC_LOOPS_FLAG_INIT); } 1.193 + void set_not_c1_compilable() { atomic_set_bits(JVM_ACC_NOT_C1_COMPILABLE); } 1.194 + void set_not_c2_compilable() { atomic_set_bits(JVM_ACC_NOT_C2_COMPILABLE); } 1.195 + void set_not_c2_osr_compilable() { atomic_set_bits(JVM_ACC_NOT_C2_OSR_COMPILABLE); } 1.196 + void set_has_linenumber_table() { atomic_set_bits(JVM_ACC_HAS_LINE_NUMBER_TABLE); } 1.197 + void set_has_checked_exceptions() { atomic_set_bits(JVM_ACC_HAS_CHECKED_EXCEPTIONS); } 1.198 + void set_has_jsrs() { atomic_set_bits(JVM_ACC_HAS_JSRS); } 1.199 + void set_is_old() { atomic_set_bits(JVM_ACC_IS_OLD); } 1.200 + void set_is_obsolete() { atomic_set_bits(JVM_ACC_IS_OBSOLETE); } 1.201 + void set_is_prefixed_native() { atomic_set_bits(JVM_ACC_IS_PREFIXED_NATIVE); } 1.202 + 1.203 + void clear_not_c1_compilable() { atomic_clear_bits(JVM_ACC_NOT_C1_COMPILABLE); } 1.204 + void clear_not_c2_compilable() { atomic_clear_bits(JVM_ACC_NOT_C2_COMPILABLE); } 1.205 + void clear_not_c2_osr_compilable() { atomic_clear_bits(JVM_ACC_NOT_C2_OSR_COMPILABLE); } 1.206 + // Klass* flags 1.207 + void set_has_vanilla_constructor() { atomic_set_bits(JVM_ACC_HAS_VANILLA_CONSTRUCTOR); } 1.208 + void set_has_finalizer() { atomic_set_bits(JVM_ACC_HAS_FINALIZER); } 1.209 + void set_has_final_method() { atomic_set_bits(JVM_ACC_HAS_FINAL_METHOD); } 1.210 + void set_is_cloneable() { atomic_set_bits(JVM_ACC_IS_CLONEABLE); } 1.211 + void set_has_miranda_methods() { atomic_set_bits(JVM_ACC_HAS_MIRANDA_METHODS); } 1.212 + 1.213 + public: 1.214 + // field flags 1.215 + void set_is_field_access_watched(const bool value) 1.216 + { 1.217 + if (value) { 1.218 + atomic_set_bits(JVM_ACC_FIELD_ACCESS_WATCHED); 1.219 + } else { 1.220 + atomic_clear_bits(JVM_ACC_FIELD_ACCESS_WATCHED); 1.221 + } 1.222 + } 1.223 + void set_is_field_modification_watched(const bool value) 1.224 + { 1.225 + if (value) { 1.226 + atomic_set_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED); 1.227 + } else { 1.228 + atomic_clear_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED); 1.229 + } 1.230 + } 1.231 + void set_field_has_generic_signature() 1.232 + { 1.233 + atomic_set_bits(JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE); 1.234 + } 1.235 + 1.236 + void set_on_stack(const bool value) 1.237 + { 1.238 + if (value) { 1.239 + atomic_set_bits(JVM_ACC_ON_STACK); 1.240 + } else { 1.241 + atomic_clear_bits(JVM_ACC_ON_STACK); 1.242 + } 1.243 + } 1.244 + // Conversion 1.245 + jshort as_short() const { return (jshort)_flags; } 1.246 + jint as_int() const { return _flags; } 1.247 + 1.248 + inline friend AccessFlags accessFlags_from(jint flags); 1.249 + 1.250 + // Printing/debugging 1.251 +#if INCLUDE_JVMTI 1.252 + void print_on(outputStream* st) const; 1.253 +#else 1.254 + void print_on(outputStream* st) const PRODUCT_RETURN; 1.255 +#endif 1.256 +}; 1.257 + 1.258 +inline AccessFlags accessFlags_from(jint flags) { 1.259 + AccessFlags af; 1.260 + af._flags = flags; 1.261 + return af; 1.262 +} 1.263 + 1.264 +#endif // SHARE_VM_UTILITIES_ACCESSFLAGS_HPP