src/share/vm/oops/instanceKlass.hpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2658
c7f3d0b4570f
child 2784
92add02409c9
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
stefank@2534 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_OOPS_INSTANCEKLASS_HPP
stefank@2314 26 #define SHARE_VM_OOPS_INSTANCEKLASS_HPP
stefank@2314 27
stefank@2314 28 #include "oops/constMethodOop.hpp"
stefank@2314 29 #include "oops/constantPoolOop.hpp"
stefank@2314 30 #include "oops/instanceOop.hpp"
stefank@2314 31 #include "oops/klassOop.hpp"
stefank@2314 32 #include "oops/klassVtable.hpp"
stefank@2314 33 #include "oops/objArrayOop.hpp"
stefank@2314 34 #include "runtime/handles.hpp"
stefank@2314 35 #include "runtime/os.hpp"
stefank@2314 36 #include "utilities/accessFlags.hpp"
stefank@2314 37 #include "utilities/bitMap.inline.hpp"
stefank@2314 38
duke@435 39 // An instanceKlass is the VM level representation of a Java class.
duke@435 40 // It contains all information needed for at class at execution runtime.
duke@435 41
duke@435 42 // instanceKlass layout:
duke@435 43 // [header ] klassOop
duke@435 44 // [klass pointer ] klassOop
duke@435 45 // [C++ vtbl pointer ] Klass
duke@435 46 // [subtype cache ] Klass
duke@435 47 // [instance size ] Klass
duke@435 48 // [java mirror ] Klass
duke@435 49 // [super ] Klass
duke@435 50 // [access_flags ] Klass
duke@435 51 // [name ] Klass
duke@435 52 // [first subklass ] Klass
duke@435 53 // [next sibling ] Klass
duke@435 54 // [array klasses ]
duke@435 55 // [methods ]
duke@435 56 // [local interfaces ]
duke@435 57 // [transitive interfaces ]
duke@435 58 // [number of implementors ]
duke@435 59 // [implementors ] klassOop[2]
duke@435 60 // [fields ]
duke@435 61 // [constants ]
duke@435 62 // [class loader ]
duke@435 63 // [protection domain ]
duke@435 64 // [signers ]
duke@435 65 // [source file name ]
duke@435 66 // [inner classes ]
duke@435 67 // [static field size ]
duke@435 68 // [nonstatic field size ]
duke@435 69 // [static oop fields size ]
duke@435 70 // [nonstatic oop maps size ]
duke@435 71 // [has finalize method ]
duke@435 72 // [deoptimization mark bit ]
duke@435 73 // [initialization state ]
duke@435 74 // [initializing thread ]
duke@435 75 // [Java vtable length ]
duke@435 76 // [oop map cache (stack maps) ]
duke@435 77 // [EMBEDDED Java vtable ] size in words = vtable_len
duke@435 78 // [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size
duke@435 79 //
duke@435 80 // The embedded nonstatic oop-map blocks are short pairs (offset, length) indicating
duke@435 81 // where oops are located in instances of this klass.
duke@435 82
duke@435 83
duke@435 84 // forward declaration for class -- see below for definition
duke@435 85 class SuperTypeClosure;
duke@435 86 class JNIid;
duke@435 87 class jniIdMapBase;
duke@435 88 class BreakpointInfo;
duke@435 89 class fieldDescriptor;
duke@435 90 class DepChange;
duke@435 91 class nmethodBucket;
duke@435 92 class PreviousVersionNode;
duke@435 93 class JvmtiCachedClassFieldMap;
duke@435 94
duke@435 95 // This is used in iterators below.
duke@435 96 class FieldClosure: public StackObj {
duke@435 97 public:
duke@435 98 virtual void do_field(fieldDescriptor* fd) = 0;
duke@435 99 };
duke@435 100
duke@435 101 #ifndef PRODUCT
duke@435 102 // Print fields.
duke@435 103 // If "obj" argument to constructor is NULL, prints static fields, otherwise prints non-static fields.
duke@435 104 class FieldPrinter: public FieldClosure {
duke@435 105 oop _obj;
duke@435 106 outputStream* _st;
duke@435 107 public:
duke@435 108 FieldPrinter(outputStream* st, oop obj = NULL) : _obj(obj), _st(st) {}
duke@435 109 void do_field(fieldDescriptor* fd);
duke@435 110 };
duke@435 111 #endif // !PRODUCT
duke@435 112
jcoomes@1373 113 // ValueObjs embedded in klass. Describes where oops are located in instances of
jcoomes@1373 114 // this klass.
jcoomes@1373 115 class OopMapBlock VALUE_OBJ_CLASS_SPEC {
jcoomes@1373 116 public:
jcoomes@1373 117 // Byte offset of the first oop mapped by this block.
jcoomes@1374 118 int offset() const { return _offset; }
jcoomes@1374 119 void set_offset(int offset) { _offset = offset; }
jcoomes@1373 120
jcoomes@1373 121 // Number of oops in this block.
jcoomes@1374 122 uint count() const { return _count; }
jcoomes@1374 123 void set_count(uint count) { _count = count; }
jcoomes@1373 124
jcoomes@1373 125 // sizeof(OopMapBlock) in HeapWords.
jcoomes@1373 126 static const int size_in_words() {
jcoomes@1373 127 return align_size_up(int(sizeof(OopMapBlock)), HeapWordSize) >>
jcoomes@1373 128 LogHeapWordSize;
jcoomes@1373 129 }
jcoomes@1373 130
jcoomes@1373 131 private:
jcoomes@1374 132 int _offset;
jcoomes@1374 133 uint _count;
jcoomes@1373 134 };
jcoomes@1373 135
duke@435 136 class instanceKlass: public Klass {
duke@435 137 friend class VMStructs;
duke@435 138 public:
duke@435 139 // See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed description
duke@435 140 // of the class loading & initialization procedure, and the use of the states.
duke@435 141 enum ClassState {
duke@435 142 unparsable_by_gc = 0, // object is not yet parsable by gc. Value of _init_state at object allocation.
duke@435 143 allocated, // allocated (but not yet linked)
duke@435 144 loaded, // loaded and inserted in class hierarchy (but not linked yet)
duke@435 145 linked, // successfully linked/verified (but not initialized yet)
duke@435 146 being_initialized, // currently running class initializer
duke@435 147 fully_initialized, // initialized (successfull final state)
duke@435 148 initialization_error // error happened during initialization
duke@435 149 };
duke@435 150
duke@435 151 public:
duke@435 152 oop* oop_block_beg() const { return adr_array_klasses(); }
duke@435 153 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; }
duke@435 154
duke@435 155 enum {
duke@435 156 implementors_limit = 2 // how many implems can we track?
duke@435 157 };
duke@435 158
duke@435 159 protected:
duke@435 160 //
duke@435 161 // The oop block. See comment in klass.hpp before making changes.
duke@435 162 //
duke@435 163
duke@435 164 // Array classes holding elements of this class.
duke@435 165 klassOop _array_klasses;
duke@435 166 // Method array.
duke@435 167 objArrayOop _methods;
duke@435 168 // Int array containing the original order of method in the class file (for
duke@435 169 // JVMTI).
duke@435 170 typeArrayOop _method_ordering;
duke@435 171 // Interface (klassOops) this class declares locally to implement.
duke@435 172 objArrayOop _local_interfaces;
duke@435 173 // Interface (klassOops) this class implements transitively.
duke@435 174 objArrayOop _transitive_interfaces;
duke@435 175 // Instance and static variable information, 5-tuples of shorts [access, name
duke@435 176 // index, sig index, initval index, offset].
duke@435 177 typeArrayOop _fields;
duke@435 178 // Constant pool for this class.
duke@435 179 constantPoolOop _constants;
duke@435 180 // Class loader used to load this class, NULL if VM loader used.
duke@435 181 oop _class_loader;
duke@435 182 // Protection domain.
duke@435 183 oop _protection_domain;
jrose@866 184 // Host class, which grants its access privileges to this class also.
jrose@866 185 // This is only non-null for an anonymous class (AnonymousClasses enabled).
jrose@866 186 // The host class is either named, or a previously loaded anonymous class.
jrose@866 187 klassOop _host_klass;
duke@435 188 // Class signers.
duke@435 189 objArrayOop _signers;
duke@435 190 // inner_classes attribute.
duke@435 191 typeArrayOop _inner_classes;
duke@435 192 // Implementors of this interface (not valid if it overflows)
duke@435 193 klassOop _implementors[implementors_limit];
jrose@2639 194 // invokedynamic bootstrap method (a java.lang.invoke.MethodHandle)
jrose@2638 195 oop _bootstrap_method; // AllowTransitionalJSR292 ONLY
duke@435 196 // Annotations for this class, or null if none.
duke@435 197 typeArrayOop _class_annotations;
duke@435 198 // Annotation objects (byte arrays) for fields, or null if no annotations.
duke@435 199 // Indices correspond to entries (not indices) in fields array.
duke@435 200 objArrayOop _fields_annotations;
duke@435 201 // Annotation objects (byte arrays) for methods, or null if no annotations.
duke@435 202 // Index is the idnum, which is initially the same as the methods array index.
duke@435 203 objArrayOop _methods_annotations;
duke@435 204 // Annotation objects (byte arrays) for methods' parameters, or null if no
duke@435 205 // such annotations.
duke@435 206 // Index is the idnum, which is initially the same as the methods array index.
duke@435 207 objArrayOop _methods_parameter_annotations;
duke@435 208 // Annotation objects (byte arrays) for methods' default values, or null if no
duke@435 209 // such annotations.
duke@435 210 // Index is the idnum, which is initially the same as the methods array index.
duke@435 211 objArrayOop _methods_default_annotations;
duke@435 212
duke@435 213 //
duke@435 214 // End of the oop block.
duke@435 215 //
duke@435 216
coleenp@2497 217 // Name of source file containing this klass, NULL if not specified.
coleenp@2497 218 Symbol* _source_file_name;
coleenp@2497 219 // the source debug extension for this klass, NULL if not specified.
coleenp@2497 220 Symbol* _source_debug_extension;
coleenp@2497 221 // Generic signature, or null if none.
coleenp@2497 222 Symbol* _generic_signature;
coleenp@2497 223 // Array name derived from this class which needs unreferencing
coleenp@2497 224 // if this class is unloaded.
coleenp@2497 225 Symbol* _array_name;
coleenp@2497 226
kvn@600 227 // Number of heapOopSize words used by non-static fields in this klass
kvn@600 228 // (including inherited fields but after header_size()).
coleenp@548 229 int _nonstatic_field_size;
coleenp@548 230 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass
never@2658 231 int _static_oop_field_count;// number of static oop fields in this klass
jcoomes@1373 232 int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks
acorn@1410 233 bool _is_marked_dependent; // used for marking during flushing and deoptimization
acorn@1410 234 bool _rewritten; // methods rewritten.
acorn@1410 235 bool _has_nonstatic_fields; // for sizing with UseCompressedOops
acorn@1410 236 bool _should_verify_class; // allow caching of preverification
duke@435 237 u2 _minor_version; // minor version number of class file
duke@435 238 u2 _major_version; // major version number of class file
duke@435 239 ClassState _init_state; // state of class
duke@435 240 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization)
duke@435 241 int _vtable_len; // length of Java vtable (in words)
duke@435 242 int _itable_len; // length of Java itable (in words)
duke@435 243 ReferenceType _reference_type; // reference type
duke@435 244 OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily)
duke@435 245 JNIid* _jni_ids; // First JNI identifier for static fields in this class
duke@435 246 jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none
duke@435 247 int* _methods_cached_itable_indices; // itable_index cache for JNI invoke corresponding to methods idnum, or NULL
duke@435 248 nmethodBucket* _dependencies; // list of dependent nmethods
duke@435 249 nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class
duke@435 250 BreakpointInfo* _breakpoints; // bpt lists, managed by methodOop
duke@435 251 int _nof_implementors; // No of implementors of this interface (zero if not an interface)
duke@435 252 // Array of interesting part(s) of the previous version(s) of this
duke@435 253 // instanceKlass. See PreviousVersionWalker below.
duke@435 254 GrowableArray<PreviousVersionNode *>* _previous_versions;
duke@435 255 u2 _enclosing_method_class_index; // Constant pool index for class of enclosing method, or 0 if none
duke@435 256 u2 _enclosing_method_method_index; // Constant pool index for name and type of enclosing method, or 0 if none
duke@435 257 // JVMTI fields can be moved to their own structure - see 6315920
duke@435 258 unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH
duke@435 259 jint _cached_class_file_len; // JVMTI: length of above
duke@435 260 JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration
duke@435 261 volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change
duke@435 262
duke@435 263 // embedded Java vtable follows here
duke@435 264 // embedded Java itables follows here
duke@435 265 // embedded static fields follows here
duke@435 266 // embedded nonstatic oop-map blocks follows here
duke@435 267
duke@435 268 friend class instanceKlassKlass;
duke@435 269 friend class SystemDictionary;
duke@435 270
duke@435 271 public:
acorn@1410 272 bool has_nonstatic_fields() const { return _has_nonstatic_fields; }
acorn@1410 273 void set_has_nonstatic_fields(bool b) { _has_nonstatic_fields = b; }
coleenp@548 274
duke@435 275 // field sizes
duke@435 276 int nonstatic_field_size() const { return _nonstatic_field_size; }
duke@435 277 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; }
duke@435 278
duke@435 279 int static_field_size() const { return _static_field_size; }
duke@435 280 void set_static_field_size(int size) { _static_field_size = size; }
duke@435 281
never@2658 282 int static_oop_field_count() const { return _static_oop_field_count; }
never@2658 283 void set_static_oop_field_count(int size) { _static_oop_field_count = size; }
duke@435 284
duke@435 285 // Java vtable
duke@435 286 int vtable_length() const { return _vtable_len; }
duke@435 287 void set_vtable_length(int len) { _vtable_len = len; }
duke@435 288
duke@435 289 // Java itable
duke@435 290 int itable_length() const { return _itable_len; }
duke@435 291 void set_itable_length(int len) { _itable_len = len; }
duke@435 292
duke@435 293 // array klasses
duke@435 294 klassOop array_klasses() const { return _array_klasses; }
duke@435 295 void set_array_klasses(klassOop k) { oop_store_without_check((oop*) &_array_klasses, (oop) k); }
duke@435 296
duke@435 297 // methods
duke@435 298 objArrayOop methods() const { return _methods; }
duke@435 299 void set_methods(objArrayOop a) { oop_store_without_check((oop*) &_methods, (oop) a); }
duke@435 300 methodOop method_with_idnum(int idnum);
duke@435 301
duke@435 302 // method ordering
duke@435 303 typeArrayOop method_ordering() const { return _method_ordering; }
duke@435 304 void set_method_ordering(typeArrayOop m) { oop_store_without_check((oop*) &_method_ordering, (oop) m); }
duke@435 305
duke@435 306 // interfaces
duke@435 307 objArrayOop local_interfaces() const { return _local_interfaces; }
duke@435 308 void set_local_interfaces(objArrayOop a) { oop_store_without_check((oop*) &_local_interfaces, (oop) a); }
duke@435 309 objArrayOop transitive_interfaces() const { return _transitive_interfaces; }
duke@435 310 void set_transitive_interfaces(objArrayOop a) { oop_store_without_check((oop*) &_transitive_interfaces, (oop) a); }
duke@435 311
duke@435 312 // fields
duke@435 313 // Field info extracted from the class file and stored
duke@435 314 // as an array of 7 shorts
duke@435 315 enum FieldOffset {
duke@435 316 access_flags_offset = 0,
duke@435 317 name_index_offset = 1,
duke@435 318 signature_index_offset = 2,
duke@435 319 initval_index_offset = 3,
duke@435 320 low_offset = 4,
duke@435 321 high_offset = 5,
duke@435 322 generic_signature_offset = 6,
duke@435 323 next_offset = 7
duke@435 324 };
duke@435 325
duke@435 326 typeArrayOop fields() const { return _fields; }
duke@435 327 int offset_from_fields( int index ) const {
duke@435 328 return build_int_from_shorts( fields()->ushort_at(index + low_offset),
duke@435 329 fields()->ushort_at(index + high_offset) );
duke@435 330 }
duke@435 331
duke@435 332 void set_fields(typeArrayOop f) { oop_store_without_check((oop*) &_fields, (oop) f); }
duke@435 333
duke@435 334 // inner classes
duke@435 335 typeArrayOop inner_classes() const { return _inner_classes; }
duke@435 336 void set_inner_classes(typeArrayOop f) { oop_store_without_check((oop*) &_inner_classes, (oop) f); }
duke@435 337
duke@435 338 enum InnerClassAttributeOffset {
duke@435 339 // From http://mirror.eng/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc10.html#18814
duke@435 340 inner_class_inner_class_info_offset = 0,
duke@435 341 inner_class_outer_class_info_offset = 1,
duke@435 342 inner_class_inner_name_offset = 2,
duke@435 343 inner_class_access_flags_offset = 3,
duke@435 344 inner_class_next_offset = 4
duke@435 345 };
duke@435 346
acorn@1087 347 // method override check
coleenp@2497 348 bool is_override(methodHandle super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS);
acorn@1087 349
duke@435 350 // package
duke@435 351 bool is_same_class_package(klassOop class2);
coleenp@2497 352 bool is_same_class_package(oop classloader2, Symbol* classname2);
coleenp@2497 353 static bool is_same_class_package(oop class_loader1, Symbol* class_name1, oop class_loader2, Symbol* class_name2);
duke@435 354
jrose@1100 355 // find an enclosing class (defined where original code was, in jvm.cpp!)
xlu@1561 356 klassOop compute_enclosing_class(bool* inner_is_member, TRAPS) {
jrose@1100 357 instanceKlassHandle self(THREAD, this->as_klassOop());
xlu@1561 358 return compute_enclosing_class_impl(self, inner_is_member, THREAD);
jrose@1100 359 }
jrose@1100 360 static klassOop compute_enclosing_class_impl(instanceKlassHandle self,
xlu@1561 361 bool* inner_is_member, TRAPS);
jrose@1100 362
jrose@1100 363 // tell if two classes have the same enclosing class (at package level)
jrose@1100 364 bool is_same_package_member(klassOop class2, TRAPS) {
jrose@1100 365 instanceKlassHandle self(THREAD, this->as_klassOop());
jrose@1100 366 return is_same_package_member_impl(self, class2, THREAD);
jrose@1100 367 }
jrose@1100 368 static bool is_same_package_member_impl(instanceKlassHandle self,
jrose@1100 369 klassOop class2, TRAPS);
jrose@1100 370
duke@435 371 // initialization state
duke@435 372 bool is_loaded() const { return _init_state >= loaded; }
duke@435 373 bool is_linked() const { return _init_state >= linked; }
duke@435 374 bool is_initialized() const { return _init_state == fully_initialized; }
duke@435 375 bool is_not_initialized() const { return _init_state < being_initialized; }
duke@435 376 bool is_being_initialized() const { return _init_state == being_initialized; }
duke@435 377 bool is_in_error_state() const { return _init_state == initialization_error; }
duke@435 378 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; }
duke@435 379 int get_init_state() { return _init_state; } // Useful for debugging
acorn@1410 380 bool is_rewritten() const { return _rewritten; }
acorn@1408 381
acorn@1408 382 // defineClass specified verification
acorn@1410 383 bool should_verify_class() const { return _should_verify_class; }
acorn@1410 384 void set_should_verify_class(bool value) { _should_verify_class = value; }
duke@435 385
duke@435 386 // marking
acorn@1410 387 bool is_marked_dependent() const { return _is_marked_dependent; }
acorn@1410 388 void set_is_marked_dependent(bool value) { _is_marked_dependent = value; }
duke@435 389
duke@435 390 // initialization (virtuals from Klass)
duke@435 391 bool should_be_initialized() const; // means that initialize should be called
duke@435 392 void initialize(TRAPS);
duke@435 393 void link_class(TRAPS);
duke@435 394 bool link_class_or_fail(TRAPS); // returns false on failure
duke@435 395 void unlink_class();
duke@435 396 void rewrite_class(TRAPS);
duke@435 397 methodOop class_initializer();
duke@435 398
duke@435 399 // set the class to initialized if no static initializer is present
duke@435 400 void eager_initialize(Thread *thread);
duke@435 401
duke@435 402 // reference type
duke@435 403 ReferenceType reference_type() const { return _reference_type; }
duke@435 404 void set_reference_type(ReferenceType t) { _reference_type = t; }
duke@435 405
johnc@2781 406 static int reference_type_offset_in_bytes() { return offset_of(instanceKlass, _reference_type); }
johnc@2781 407
duke@435 408 // find local field, returns true if found
coleenp@2497 409 bool find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 410 // find field in direct superinterfaces, returns the interface in which the field is defined
coleenp@2497 411 klassOop find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 412 // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined
coleenp@2497 413 klassOop find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 414 // find instance or static fields according to JVM spec 5.4.3.2, returns the klass in which the field is defined
coleenp@2497 415 klassOop find_field(Symbol* name, Symbol* sig, bool is_static, fieldDescriptor* fd) const;
duke@435 416
duke@435 417 // find a non-static or static field given its offset within the class.
duke@435 418 bool contains_field_offset(int offset) {
coleenp@548 419 return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size());
duke@435 420 }
duke@435 421
duke@435 422 bool find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
duke@435 423 bool find_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
duke@435 424
duke@435 425 // find a local method (returns NULL if not found)
coleenp@2497 426 methodOop find_method(Symbol* name, Symbol* signature) const;
coleenp@2497 427 static methodOop find_method(objArrayOop methods, Symbol* name, Symbol* signature);
duke@435 428
duke@435 429 // lookup operation (returns NULL if not found)
coleenp@2497 430 methodOop uncached_lookup_method(Symbol* name, Symbol* signature) const;
duke@435 431
duke@435 432 // lookup a method in all the interfaces that this class implements
duke@435 433 // (returns NULL if not found)
coleenp@2497 434 methodOop lookup_method_in_all_interfaces(Symbol* name, Symbol* signature) const;
duke@435 435
duke@435 436 // constant pool
duke@435 437 constantPoolOop constants() const { return _constants; }
duke@435 438 void set_constants(constantPoolOop c) { oop_store_without_check((oop*) &_constants, (oop) c); }
duke@435 439
duke@435 440 // class loader
duke@435 441 oop class_loader() const { return _class_loader; }
duke@435 442 void set_class_loader(oop l) { oop_store((oop*) &_class_loader, l); }
duke@435 443
duke@435 444 // protection domain
duke@435 445 oop protection_domain() { return _protection_domain; }
duke@435 446 void set_protection_domain(oop pd) { oop_store((oop*) &_protection_domain, pd); }
duke@435 447
jrose@866 448 // host class
jrose@866 449 oop host_klass() const { return _host_klass; }
jrose@866 450 void set_host_klass(oop host) { oop_store((oop*) &_host_klass, host); }
jrose@866 451 bool is_anonymous() const { return _host_klass != NULL; }
jrose@866 452
duke@435 453 // signers
duke@435 454 objArrayOop signers() const { return _signers; }
duke@435 455 void set_signers(objArrayOop s) { oop_store((oop*) &_signers, oop(s)); }
duke@435 456
duke@435 457 // source file name
coleenp@2497 458 Symbol* source_file_name() const { return _source_file_name; }
coleenp@2497 459 void set_source_file_name(Symbol* n);
duke@435 460
duke@435 461 // minor and major version numbers of class file
duke@435 462 u2 minor_version() const { return _minor_version; }
duke@435 463 void set_minor_version(u2 minor_version) { _minor_version = minor_version; }
duke@435 464 u2 major_version() const { return _major_version; }
duke@435 465 void set_major_version(u2 major_version) { _major_version = major_version; }
duke@435 466
duke@435 467 // source debug extension
coleenp@2497 468 Symbol* source_debug_extension() const { return _source_debug_extension; }
coleenp@2497 469 void set_source_debug_extension(Symbol* n);
coleenp@2497 470
coleenp@2497 471 // symbol unloading support (refcount already added)
coleenp@2497 472 Symbol* array_name() { return _array_name; }
coleenp@2497 473 void set_array_name(Symbol* name) { assert(_array_name == NULL, "name already created"); _array_name = name; }
duke@435 474
duke@435 475 // nonstatic oop-map blocks
jcoomes@1374 476 static int nonstatic_oop_map_size(unsigned int oop_map_count) {
jcoomes@1373 477 return oop_map_count * OopMapBlock::size_in_words();
jcoomes@1373 478 }
jcoomes@1374 479 unsigned int nonstatic_oop_map_count() const {
jcoomes@1373 480 return _nonstatic_oop_map_size / OopMapBlock::size_in_words();
jcoomes@1373 481 }
jcoomes@1373 482 int nonstatic_oop_map_size() const { return _nonstatic_oop_map_size; }
jcoomes@1373 483 void set_nonstatic_oop_map_size(int words) {
jcoomes@1373 484 _nonstatic_oop_map_size = words;
jcoomes@1373 485 }
duke@435 486
duke@435 487 // RedefineClasses() support for previous versions:
duke@435 488 void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods,
duke@435 489 int emcp_method_count);
dcubed@1412 490 // If the _previous_versions array is non-NULL, then this klass
dcubed@1412 491 // has been redefined at least once even if we aren't currently
dcubed@1412 492 // tracking a previous version.
dcubed@1412 493 bool has_been_redefined() const { return _previous_versions != NULL; }
duke@435 494 bool has_previous_version() const;
duke@435 495 void init_previous_versions() {
duke@435 496 _previous_versions = NULL;
duke@435 497 }
duke@435 498 GrowableArray<PreviousVersionNode *>* previous_versions() const {
duke@435 499 return _previous_versions;
duke@435 500 }
duke@435 501
duke@435 502 // JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation
duke@435 503 void set_cached_class_file(unsigned char *class_file_bytes,
duke@435 504 jint class_file_len) { _cached_class_file_len = class_file_len;
duke@435 505 _cached_class_file_bytes = class_file_bytes; }
duke@435 506 jint get_cached_class_file_len() { return _cached_class_file_len; }
duke@435 507 unsigned char * get_cached_class_file_bytes() { return _cached_class_file_bytes; }
duke@435 508
duke@435 509 // JVMTI: Support for caching of field indices, types, and offsets
duke@435 510 void set_jvmti_cached_class_field_map(JvmtiCachedClassFieldMap* descriptor) {
duke@435 511 _jvmti_cached_class_field_map = descriptor;
duke@435 512 }
duke@435 513 JvmtiCachedClassFieldMap* jvmti_cached_class_field_map() const {
duke@435 514 return _jvmti_cached_class_field_map;
duke@435 515 }
duke@435 516
duke@435 517 // for adding methods, constMethodOopDesc::UNSET_IDNUM means no more ids available
duke@435 518 inline u2 next_method_idnum();
duke@435 519 void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; }
duke@435 520
duke@435 521 // generics support
coleenp@2497 522 Symbol* generic_signature() const { return _generic_signature; }
coleenp@2497 523 void set_generic_signature(Symbol* sig) { _generic_signature = sig; }
coleenp@2497 524
duke@435 525 u2 enclosing_method_class_index() const { return _enclosing_method_class_index; }
duke@435 526 u2 enclosing_method_method_index() const { return _enclosing_method_method_index; }
duke@435 527 void set_enclosing_method_indices(u2 class_index,
duke@435 528 u2 method_index) { _enclosing_method_class_index = class_index;
duke@435 529 _enclosing_method_method_index = method_index; }
duke@435 530
jrose@1161 531 // JSR 292 support
jrose@2638 532 oop bootstrap_method() const { return _bootstrap_method; } // AllowTransitionalJSR292 ONLY
jrose@1161 533 void set_bootstrap_method(oop mh) { oop_store(&_bootstrap_method, mh); }
jrose@1161 534
duke@435 535 // jmethodID support
dcubed@1412 536 static jmethodID get_jmethod_id(instanceKlassHandle ik_h,
dcubed@1412 537 methodHandle method_h);
dcubed@1412 538 static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h,
dcubed@1412 539 size_t idnum, jmethodID new_id, jmethodID* new_jmeths,
dcubed@1412 540 jmethodID* to_dealloc_id_p,
dcubed@1412 541 jmethodID** to_dealloc_jmeths_p);
dcubed@1412 542 static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum,
dcubed@1412 543 size_t *length_p, jmethodID* id_p);
duke@435 544 jmethodID jmethod_id_or_null(methodOop method);
duke@435 545
duke@435 546 // cached itable index support
duke@435 547 void set_cached_itable_index(size_t idnum, int index);
duke@435 548 int cached_itable_index(size_t idnum);
duke@435 549
duke@435 550 // annotations support
duke@435 551 typeArrayOop class_annotations() const { return _class_annotations; }
duke@435 552 objArrayOop fields_annotations() const { return _fields_annotations; }
duke@435 553 objArrayOop methods_annotations() const { return _methods_annotations; }
duke@435 554 objArrayOop methods_parameter_annotations() const { return _methods_parameter_annotations; }
duke@435 555 objArrayOop methods_default_annotations() const { return _methods_default_annotations; }
duke@435 556 void set_class_annotations(typeArrayOop md) { oop_store_without_check((oop*)&_class_annotations, (oop)md); }
duke@435 557 void set_fields_annotations(objArrayOop md) { set_annotations(md, &_fields_annotations); }
duke@435 558 void set_methods_annotations(objArrayOop md) { set_annotations(md, &_methods_annotations); }
duke@435 559 void set_methods_parameter_annotations(objArrayOop md) { set_annotations(md, &_methods_parameter_annotations); }
duke@435 560 void set_methods_default_annotations(objArrayOop md) { set_annotations(md, &_methods_default_annotations); }
duke@435 561 typeArrayOop get_method_annotations_of(int idnum)
duke@435 562 { return get_method_annotations_from(idnum, _methods_annotations); }
duke@435 563 typeArrayOop get_method_parameter_annotations_of(int idnum)
duke@435 564 { return get_method_annotations_from(idnum, _methods_parameter_annotations); }
duke@435 565 typeArrayOop get_method_default_annotations_of(int idnum)
duke@435 566 { return get_method_annotations_from(idnum, _methods_default_annotations); }
duke@435 567 void set_method_annotations_of(int idnum, typeArrayOop anno)
duke@435 568 { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
duke@435 569 void set_method_parameter_annotations_of(int idnum, typeArrayOop anno)
duke@435 570 { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
duke@435 571 void set_method_default_annotations_of(int idnum, typeArrayOop anno)
duke@435 572 { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
duke@435 573
duke@435 574 // allocation
duke@435 575 DEFINE_ALLOCATE_PERMANENT(instanceKlass);
duke@435 576 instanceOop allocate_instance(TRAPS);
duke@435 577 instanceOop allocate_permanent_instance(TRAPS);
duke@435 578
duke@435 579 // additional member function to return a handle
duke@435 580 instanceHandle allocate_instance_handle(TRAPS) { return instanceHandle(THREAD, allocate_instance(THREAD)); }
duke@435 581
duke@435 582 objArrayOop allocate_objArray(int n, int length, TRAPS);
duke@435 583 // Helper function
duke@435 584 static instanceOop register_finalizer(instanceOop i, TRAPS);
duke@435 585
duke@435 586 // Check whether reflection/jni/jvm code is allowed to instantiate this class;
duke@435 587 // if not, throw either an Error or an Exception.
duke@435 588 virtual void check_valid_for_instantiation(bool throwError, TRAPS);
duke@435 589
duke@435 590 // initialization
duke@435 591 void call_class_initializer(TRAPS);
duke@435 592 void set_initialization_state_and_notify(ClassState state, TRAPS);
duke@435 593
duke@435 594 // OopMapCache support
duke@435 595 OopMapCache* oop_map_cache() { return _oop_map_cache; }
duke@435 596 void set_oop_map_cache(OopMapCache *cache) { _oop_map_cache = cache; }
duke@435 597 void mask_for(methodHandle method, int bci, InterpreterOopMap* entry);
duke@435 598
duke@435 599 // JNI identifier support (for static fields - for jni performance)
duke@435 600 JNIid* jni_ids() { return _jni_ids; }
duke@435 601 void set_jni_ids(JNIid* ids) { _jni_ids = ids; }
duke@435 602 JNIid* jni_id_for(int offset);
duke@435 603
duke@435 604 // maintenance of deoptimization dependencies
duke@435 605 int mark_dependent_nmethods(DepChange& changes);
duke@435 606 void add_dependent_nmethod(nmethod* nm);
duke@435 607 void remove_dependent_nmethod(nmethod* nm);
duke@435 608
duke@435 609 // On-stack replacement support
duke@435 610 nmethod* osr_nmethods_head() const { return _osr_nmethods_head; };
duke@435 611 void set_osr_nmethods_head(nmethod* h) { _osr_nmethods_head = h; };
duke@435 612 void add_osr_nmethod(nmethod* n);
duke@435 613 void remove_osr_nmethod(nmethod* n);
iveresov@2138 614 nmethod* lookup_osr_nmethod(const methodOop m, int bci, int level, bool match_level) const;
duke@435 615
duke@435 616 // Breakpoint support (see methods on methodOop for details)
duke@435 617 BreakpointInfo* breakpoints() const { return _breakpoints; };
duke@435 618 void set_breakpoints(BreakpointInfo* bps) { _breakpoints = bps; };
duke@435 619
duke@435 620 // support for stub routines
duke@435 621 static int init_state_offset_in_bytes() { return offset_of(instanceKlass, _init_state); }
duke@435 622 static int init_thread_offset_in_bytes() { return offset_of(instanceKlass, _init_thread); }
duke@435 623
duke@435 624 // subclass/subinterface checks
duke@435 625 bool implements_interface(klassOop k) const;
duke@435 626
duke@435 627 // Access to implementors of an interface. We only store the count
duke@435 628 // of implementors, and in case, there are only a few
duke@435 629 // implementors, we store them in a short list.
duke@435 630 // This accessor returns NULL if we walk off the end of the list.
duke@435 631 klassOop implementor(int i) const {
duke@435 632 return (i < implementors_limit)? _implementors[i]: (klassOop) NULL;
duke@435 633 }
duke@435 634 int nof_implementors() const { return _nof_implementors; }
duke@435 635 void add_implementor(klassOop k); // k is a new class that implements this interface
duke@435 636 void init_implementor(); // initialize
duke@435 637
duke@435 638 // link this class into the implementors list of every interface it implements
duke@435 639 void process_interfaces(Thread *thread);
duke@435 640
duke@435 641 // virtual operations from Klass
duke@435 642 bool is_leaf_class() const { return _subklass == NULL; }
duke@435 643 objArrayOop compute_secondary_supers(int num_extra_slots, TRAPS);
duke@435 644 bool compute_is_subtype_of(klassOop k);
duke@435 645 bool can_be_primary_super_slow() const;
duke@435 646 klassOop java_super() const { return super(); }
duke@435 647 int oop_size(oop obj) const { return size_helper(); }
duke@435 648 int klass_oop_size() const { return object_size(); }
duke@435 649 bool oop_is_instance_slow() const { return true; }
duke@435 650
duke@435 651 // Iterators
duke@435 652 void do_local_static_fields(FieldClosure* cl);
duke@435 653 void do_nonstatic_fields(FieldClosure* cl); // including inherited fields
duke@435 654 void do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS);
duke@435 655
duke@435 656 void methods_do(void f(methodOop method));
duke@435 657 void array_klasses_do(void f(klassOop k));
duke@435 658 void with_array_klasses_do(void f(klassOop k));
duke@435 659 bool super_types_do(SuperTypeClosure* blk);
duke@435 660
duke@435 661 // Casting from klassOop
duke@435 662 static instanceKlass* cast(klassOop k) {
never@2658 663 assert(k->is_klass(), "must be");
duke@435 664 Klass* kp = k->klass_part();
duke@435 665 assert(kp->null_vtbl() || kp->oop_is_instance_slow(), "cast to instanceKlass");
duke@435 666 return (instanceKlass*) kp;
duke@435 667 }
duke@435 668
duke@435 669 // Sizing (in words)
duke@435 670 static int header_size() { return align_object_offset(oopDesc::header_size() + sizeof(instanceKlass)/HeapWordSize); }
never@2658 671 int object_size() const { return object_size(align_object_offset(vtable_length()) + align_object_offset(itable_length()) + nonstatic_oop_map_size()); }
duke@435 672 static int vtable_start_offset() { return header_size(); }
duke@435 673 static int vtable_length_offset() { return oopDesc::header_size() + offset_of(instanceKlass, _vtable_len) / HeapWordSize; }
duke@435 674 static int object_size(int extra) { return align_object_size(header_size() + extra); }
duke@435 675
duke@435 676 intptr_t* start_of_vtable() const { return ((intptr_t*)as_klassOop()) + vtable_start_offset(); }
duke@435 677 intptr_t* start_of_itable() const { return start_of_vtable() + align_object_offset(vtable_length()); }
duke@435 678 int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)as_klassOop(); }
duke@435 679
duke@435 680 intptr_t* end_of_itable() const { return start_of_itable() + itable_length(); }
duke@435 681
never@2658 682 address static_field_addr(int offset);
coleenp@548 683
coleenp@548 684 OopMapBlock* start_of_nonstatic_oop_maps() const {
never@2658 685 return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length()));
coleenp@548 686 }
duke@435 687
duke@435 688 // Allocation profiling support
duke@435 689 juint alloc_size() const { return _alloc_count * size_helper(); }
duke@435 690 void set_alloc_size(juint n) {}
duke@435 691
duke@435 692 // Use this to return the size of an instance in heap words:
duke@435 693 int size_helper() const {
duke@435 694 return layout_helper_to_size_helper(layout_helper());
duke@435 695 }
duke@435 696
duke@435 697 // This bit is initialized in classFileParser.cpp.
duke@435 698 // It is false under any of the following conditions:
duke@435 699 // - the class is abstract (including any interface)
duke@435 700 // - the class has a finalizer (if !RegisterFinalizersAtInit)
duke@435 701 // - the class size is larger than FastAllocateSizeLimit
duke@435 702 // - the class is java/lang/Class, which cannot be allocated directly
duke@435 703 bool can_be_fastpath_allocated() const {
duke@435 704 return !layout_helper_needs_slow_path(layout_helper());
duke@435 705 }
duke@435 706
duke@435 707 // Java vtable/itable
duke@435 708 klassVtable* vtable() const; // return new klassVtable wrapper
duke@435 709 inline methodOop method_at_vtable(int index);
duke@435 710 klassItable* itable() const; // return new klassItable wrapper
duke@435 711 methodOop method_at_itable(klassOop holder, int index, TRAPS);
duke@435 712
duke@435 713 // Garbage collection
duke@435 714 void oop_follow_contents(oop obj);
duke@435 715 int oop_adjust_pointers(oop obj);
duke@435 716 bool object_is_parsable() const { return _init_state != unparsable_by_gc; }
duke@435 717 // Value of _init_state must be zero (unparsable_by_gc) when klass field is set.
duke@435 718
duke@435 719 void follow_weak_klass_links(
duke@435 720 BoolObjectClosure* is_alive, OopClosure* keep_alive);
duke@435 721 void release_C_heap_structures();
duke@435 722
duke@435 723 // Parallel Scavenge and Parallel Old
duke@435 724 PARALLEL_GC_DECLS
duke@435 725
duke@435 726 // Naming
jrose@1474 727 const char* signature_name() const;
duke@435 728
duke@435 729 // Iterators
duke@435 730 int oop_oop_iterate(oop obj, OopClosure* blk) {
duke@435 731 return oop_oop_iterate_v(obj, blk);
duke@435 732 }
duke@435 733
duke@435 734 int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
duke@435 735 return oop_oop_iterate_v_m(obj, blk, mr);
duke@435 736 }
duke@435 737
ysr@777 738 #define InstanceKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
ysr@777 739 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \
ysr@777 740 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, \
duke@435 741 MemRegion mr);
duke@435 742
duke@435 743 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_DECL)
ysr@777 744 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_DECL)
ysr@777 745
ysr@777 746 #ifndef SERIALGC
ysr@777 747 #define InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
ysr@777 748 int oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* blk);
ysr@777 749
ysr@777 750 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
ysr@777 751 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
ysr@777 752 #endif // !SERIALGC
duke@435 753
duke@435 754 private:
duke@435 755 // initialization state
duke@435 756 #ifdef ASSERT
duke@435 757 void set_init_state(ClassState state);
duke@435 758 #else
duke@435 759 void set_init_state(ClassState state) { _init_state = state; }
duke@435 760 #endif
acorn@1410 761 void set_rewritten() { _rewritten = true; }
duke@435 762 void set_init_thread(Thread *thread) { _init_thread = thread; }
duke@435 763
duke@435 764 u2 idnum_allocated_count() const { return _idnum_allocated_count; }
dcubed@1412 765 // The RedefineClasses() API can cause new method idnums to be needed
dcubed@1412 766 // which will cause the caches to grow. Safety requires different
dcubed@1412 767 // cache management logic if the caches can grow instead of just
dcubed@1412 768 // going from NULL to non-NULL.
dcubed@1412 769 bool idnum_can_increment() const { return has_been_redefined(); }
duke@435 770 jmethodID* methods_jmethod_ids_acquire() const
duke@435 771 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); }
duke@435 772 void release_set_methods_jmethod_ids(jmethodID* jmeths)
duke@435 773 { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); }
duke@435 774
duke@435 775 int* methods_cached_itable_indices_acquire() const
duke@435 776 { return (int*)OrderAccess::load_ptr_acquire(&_methods_cached_itable_indices); }
duke@435 777 void release_set_methods_cached_itable_indices(int* indices)
duke@435 778 { OrderAccess::release_store_ptr(&_methods_cached_itable_indices, indices); }
duke@435 779
duke@435 780 inline typeArrayOop get_method_annotations_from(int idnum, objArrayOop annos);
duke@435 781 void set_annotations(objArrayOop md, objArrayOop* md_p) { oop_store_without_check((oop*)md_p, (oop)md); }
duke@435 782 void set_methods_annotations_of(int idnum, typeArrayOop anno, objArrayOop* md_p);
duke@435 783
duke@435 784 // Offsets for memory management
duke@435 785 oop* adr_array_klasses() const { return (oop*)&this->_array_klasses;}
duke@435 786 oop* adr_methods() const { return (oop*)&this->_methods;}
duke@435 787 oop* adr_method_ordering() const { return (oop*)&this->_method_ordering;}
duke@435 788 oop* adr_local_interfaces() const { return (oop*)&this->_local_interfaces;}
duke@435 789 oop* adr_transitive_interfaces() const { return (oop*)&this->_transitive_interfaces;}
duke@435 790 oop* adr_fields() const { return (oop*)&this->_fields;}
duke@435 791 oop* adr_constants() const { return (oop*)&this->_constants;}
duke@435 792 oop* adr_class_loader() const { return (oop*)&this->_class_loader;}
duke@435 793 oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;}
jrose@866 794 oop* adr_host_klass() const { return (oop*)&this->_host_klass;}
duke@435 795 oop* adr_signers() const { return (oop*)&this->_signers;}
duke@435 796 oop* adr_inner_classes() const { return (oop*)&this->_inner_classes;}
duke@435 797 oop* adr_implementors() const { return (oop*)&this->_implementors[0];}
jrose@2638 798 oop* adr_bootstrap_method() const { return (oop*)&this->_bootstrap_method;} // AllowTransitionalJSR292 ONLY
duke@435 799 oop* adr_methods_jmethod_ids() const { return (oop*)&this->_methods_jmethod_ids;}
duke@435 800 oop* adr_methods_cached_itable_indices() const { return (oop*)&this->_methods_cached_itable_indices;}
duke@435 801 oop* adr_class_annotations() const { return (oop*)&this->_class_annotations;}
duke@435 802 oop* adr_fields_annotations() const { return (oop*)&this->_fields_annotations;}
duke@435 803 oop* adr_methods_annotations() const { return (oop*)&this->_methods_annotations;}
duke@435 804 oop* adr_methods_parameter_annotations() const { return (oop*)&this->_methods_parameter_annotations;}
duke@435 805 oop* adr_methods_default_annotations() const { return (oop*)&this->_methods_default_annotations;}
duke@435 806
duke@435 807 // Static methods that are used to implement member methods where an exposed this pointer
duke@435 808 // is needed due to possible GCs
duke@435 809 static bool link_class_impl (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
duke@435 810 static bool verify_code (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
duke@435 811 static void initialize_impl (instanceKlassHandle this_oop, TRAPS);
duke@435 812 static void eager_initialize_impl (instanceKlassHandle this_oop);
duke@435 813 static void set_initialization_state_and_notify_impl (instanceKlassHandle this_oop, ClassState state, TRAPS);
duke@435 814 static void call_class_initializer_impl (instanceKlassHandle this_oop, TRAPS);
duke@435 815 static klassOop array_klass_impl (instanceKlassHandle this_oop, bool or_null, int n, TRAPS);
duke@435 816 static void do_local_static_fields_impl (instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS);
duke@435 817 /* jni_id_for_impl for jfieldID only */
duke@435 818 static JNIid* jni_id_for_impl (instanceKlassHandle this_oop, int offset);
duke@435 819
duke@435 820 // Returns the array class for the n'th dimension
duke@435 821 klassOop array_klass_impl(bool or_null, int n, TRAPS);
duke@435 822
duke@435 823 // Returns the array class with this class as element type
duke@435 824 klassOop array_klass_impl(bool or_null, TRAPS);
duke@435 825
duke@435 826 public:
duke@435 827 // sharing support
duke@435 828 virtual void remove_unshareable_info();
coleenp@2497 829 virtual void shared_symbols_iterate(SymbolClosure* closure);
duke@435 830
duke@435 831 // jvm support
duke@435 832 jint compute_modifier_flags(TRAPS) const;
duke@435 833
duke@435 834 public:
duke@435 835 // JVMTI support
duke@435 836 jint jvmti_class_status() const;
duke@435 837
duke@435 838 public:
duke@435 839 // Printing
jrose@1590 840 void oop_print_value_on(oop obj, outputStream* st);
jrose@1590 841 #ifndef PRODUCT
duke@435 842 void oop_print_on (oop obj, outputStream* st);
duke@435 843
duke@435 844 void print_dependent_nmethods(bool verbose = false);
duke@435 845 bool is_dependent_nmethod(nmethod* nm);
duke@435 846 #endif
duke@435 847
duke@435 848 // Verification
duke@435 849 const char* internal_name() const;
duke@435 850 void oop_verify_on(oop obj, outputStream* st);
duke@435 851
duke@435 852 #ifndef PRODUCT
duke@435 853 static void verify_class_klass_nonstatic_oop_maps(klassOop k) PRODUCT_RETURN;
duke@435 854 #endif
duke@435 855 };
duke@435 856
duke@435 857 inline methodOop instanceKlass::method_at_vtable(int index) {
duke@435 858 #ifndef PRODUCT
duke@435 859 assert(index >= 0, "valid vtable index");
duke@435 860 if (DebugVtables) {
duke@435 861 verify_vtable_index(index);
duke@435 862 }
duke@435 863 #endif
duke@435 864 vtableEntry* ve = (vtableEntry*)start_of_vtable();
duke@435 865 return ve[index].method();
duke@435 866 }
duke@435 867
duke@435 868 inline typeArrayOop instanceKlass::get_method_annotations_from(int idnum, objArrayOop annos) {
duke@435 869 if (annos == NULL || annos->length() <= idnum) {
duke@435 870 return NULL;
duke@435 871 }
duke@435 872 return typeArrayOop(annos->obj_at(idnum));
duke@435 873 }
duke@435 874
duke@435 875 // for adding methods
duke@435 876 // UNSET_IDNUM return means no more ids available
duke@435 877 inline u2 instanceKlass::next_method_idnum() {
duke@435 878 if (_idnum_allocated_count == constMethodOopDesc::MAX_IDNUM) {
duke@435 879 return constMethodOopDesc::UNSET_IDNUM; // no more ids available
duke@435 880 } else {
duke@435 881 return _idnum_allocated_count++;
duke@435 882 }
duke@435 883 }
duke@435 884
duke@435 885
duke@435 886 /* JNIid class for jfieldIDs only */
duke@435 887 class JNIid: public CHeapObj {
duke@435 888 friend class VMStructs;
duke@435 889 private:
duke@435 890 klassOop _holder;
duke@435 891 JNIid* _next;
duke@435 892 int _offset;
duke@435 893 #ifdef ASSERT
duke@435 894 bool _is_static_field_id;
duke@435 895 #endif
duke@435 896
duke@435 897 public:
duke@435 898 // Accessors
duke@435 899 klassOop holder() const { return _holder; }
duke@435 900 int offset() const { return _offset; }
duke@435 901 JNIid* next() { return _next; }
duke@435 902 // Constructor
duke@435 903 JNIid(klassOop holder, int offset, JNIid* next);
duke@435 904 // Identifier lookup
duke@435 905 JNIid* find(int offset);
duke@435 906
never@2658 907 bool find_local_field(fieldDescriptor* fd) {
never@2658 908 return instanceKlass::cast(holder())->find_local_field_from_offset(offset(), true, fd);
never@2658 909 }
never@2658 910
duke@435 911 // Garbage collection support
duke@435 912 oop* holder_addr() { return (oop*)&_holder; }
duke@435 913 void oops_do(OopClosure* f);
duke@435 914 static void deallocate(JNIid* id);
duke@435 915 // Debugging
duke@435 916 #ifdef ASSERT
duke@435 917 bool is_static_field_id() const { return _is_static_field_id; }
duke@435 918 void set_is_static_field_id() { _is_static_field_id = true; }
duke@435 919 #endif
duke@435 920 void verify(klassOop holder);
duke@435 921 };
duke@435 922
duke@435 923
duke@435 924 // If breakpoints are more numerous than just JVMTI breakpoints,
duke@435 925 // consider compressing this data structure.
duke@435 926 // It is currently a simple linked list defined in methodOop.hpp.
duke@435 927
duke@435 928 class BreakpointInfo;
duke@435 929
duke@435 930
duke@435 931 // A collection point for interesting information about the previous
duke@435 932 // version(s) of an instanceKlass. This class uses weak references to
duke@435 933 // the information so that the information may be collected as needed
dcubed@482 934 // by the system. If the information is shared, then a regular
dcubed@482 935 // reference must be used because a weak reference would be seen as
dcubed@482 936 // collectible. A GrowableArray of PreviousVersionNodes is attached
duke@435 937 // to the instanceKlass as needed. See PreviousVersionWalker below.
duke@435 938 class PreviousVersionNode : public CHeapObj {
duke@435 939 private:
dcubed@482 940 // A shared ConstantPool is never collected so we'll always have
dcubed@482 941 // a reference to it so we can update items in the cache. We'll
dcubed@482 942 // have a weak reference to a non-shared ConstantPool until all
dcubed@482 943 // of the methods (EMCP or obsolete) have been collected; the
dcubed@482 944 // non-shared ConstantPool becomes collectible at that point.
dcubed@482 945 jobject _prev_constant_pool; // regular or weak reference
dcubed@482 946 bool _prev_cp_is_weak; // true if not a shared ConstantPool
dcubed@482 947
duke@435 948 // If the previous version of the instanceKlass doesn't have any
duke@435 949 // EMCP methods, then _prev_EMCP_methods will be NULL. If all the
duke@435 950 // EMCP methods have been collected, then _prev_EMCP_methods can
duke@435 951 // have a length of zero.
duke@435 952 GrowableArray<jweak>* _prev_EMCP_methods;
duke@435 953
duke@435 954 public:
dcubed@482 955 PreviousVersionNode(jobject prev_constant_pool, bool prev_cp_is_weak,
duke@435 956 GrowableArray<jweak>* prev_EMCP_methods);
duke@435 957 ~PreviousVersionNode();
dcubed@482 958 jobject prev_constant_pool() const {
duke@435 959 return _prev_constant_pool;
duke@435 960 }
duke@435 961 GrowableArray<jweak>* prev_EMCP_methods() const {
duke@435 962 return _prev_EMCP_methods;
duke@435 963 }
duke@435 964 };
duke@435 965
duke@435 966
duke@435 967 // A Handle-ized version of PreviousVersionNode.
duke@435 968 class PreviousVersionInfo : public ResourceObj {
duke@435 969 private:
duke@435 970 constantPoolHandle _prev_constant_pool_handle;
duke@435 971 // If the previous version of the instanceKlass doesn't have any
duke@435 972 // EMCP methods, then _prev_EMCP_methods will be NULL. Since the
duke@435 973 // methods cannot be collected while we hold a handle,
duke@435 974 // _prev_EMCP_methods should never have a length of zero.
duke@435 975 GrowableArray<methodHandle>* _prev_EMCP_method_handles;
duke@435 976
duke@435 977 public:
duke@435 978 PreviousVersionInfo(PreviousVersionNode *pv_node);
duke@435 979 ~PreviousVersionInfo();
duke@435 980 constantPoolHandle prev_constant_pool_handle() const {
duke@435 981 return _prev_constant_pool_handle;
duke@435 982 }
duke@435 983 GrowableArray<methodHandle>* prev_EMCP_method_handles() const {
duke@435 984 return _prev_EMCP_method_handles;
duke@435 985 }
duke@435 986 };
duke@435 987
duke@435 988
duke@435 989 // Helper object for walking previous versions. This helper cleans up
duke@435 990 // the Handles that it allocates when the helper object is destroyed.
duke@435 991 // The PreviousVersionInfo object returned by next_previous_version()
duke@435 992 // is only valid until a subsequent call to next_previous_version() or
duke@435 993 // the helper object is destroyed.
duke@435 994 class PreviousVersionWalker : public StackObj {
duke@435 995 private:
duke@435 996 GrowableArray<PreviousVersionNode *>* _previous_versions;
duke@435 997 int _current_index;
duke@435 998 // Fields for cleaning up when we are done walking the previous versions:
duke@435 999 // A HandleMark for the PreviousVersionInfo handles:
duke@435 1000 HandleMark _hm;
duke@435 1001
duke@435 1002 // It would be nice to have a ResourceMark field in this helper also,
duke@435 1003 // but the ResourceMark code says to be careful to delete handles held
duke@435 1004 // in GrowableArrays _before_ deleting the GrowableArray. Since we
duke@435 1005 // can't guarantee the order in which the fields are destroyed, we
duke@435 1006 // have to let the creator of the PreviousVersionWalker object do
duke@435 1007 // the right thing. Also, adding a ResourceMark here causes an
duke@435 1008 // include loop.
duke@435 1009
duke@435 1010 // A pointer to the current info object so we can handle the deletes.
duke@435 1011 PreviousVersionInfo * _current_p;
duke@435 1012
duke@435 1013 public:
duke@435 1014 PreviousVersionWalker(instanceKlass *ik);
duke@435 1015 ~PreviousVersionWalker();
duke@435 1016
duke@435 1017 // Return the interesting information for the next previous version
duke@435 1018 // of the klass. Returns NULL if there are no more previous versions.
duke@435 1019 PreviousVersionInfo* next_previous_version();
duke@435 1020 };
stefank@2314 1021
stefank@2314 1022 #endif // SHARE_VM_OOPS_INSTANCEKLASS_HPP

mercurial