src/share/vm/oops/instanceKlass.hpp

Mon, 12 Nov 2012 14:03:53 -0800

author
minqi
date
Mon, 12 Nov 2012 14:03:53 -0800
changeset 4267
bd7a7ce2e264
parent 4245
4735d2c84362
child 4345
30866cd626b0
child 4400
ecd24264898b
permissions
-rw-r--r--

6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com

duke@435 1 /*
jiangli@3701 2 * Copyright (c) 1997, 2012, 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
coleenp@4037 28 #include "classfile/classLoaderData.hpp"
coleenp@4037 29 #include "oops/annotations.hpp"
coleenp@4037 30 #include "oops/constMethod.hpp"
never@3137 31 #include "oops/fieldInfo.hpp"
stefank@2314 32 #include "oops/instanceOop.hpp"
stefank@2314 33 #include "oops/klassVtable.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
coleenp@4037 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
coleenp@4037 42 // InstanceKlass layout:
duke@435 43 // [C++ vtbl pointer ] Klass
duke@435 44 // [subtype cache ] Klass
duke@435 45 // [instance size ] Klass
duke@435 46 // [java mirror ] Klass
duke@435 47 // [super ] Klass
duke@435 48 // [access_flags ] Klass
duke@435 49 // [name ] Klass
duke@435 50 // [first subklass ] Klass
duke@435 51 // [next sibling ] Klass
duke@435 52 // [array klasses ]
duke@435 53 // [methods ]
duke@435 54 // [local interfaces ]
duke@435 55 // [transitive interfaces ]
duke@435 56 // [fields ]
duke@435 57 // [constants ]
duke@435 58 // [class loader ]
duke@435 59 // [protection domain ]
duke@435 60 // [signers ]
duke@435 61 // [source file name ]
duke@435 62 // [inner classes ]
duke@435 63 // [static field size ]
duke@435 64 // [nonstatic field size ]
duke@435 65 // [static oop fields size ]
duke@435 66 // [nonstatic oop maps size ]
duke@435 67 // [has finalize method ]
duke@435 68 // [deoptimization mark bit ]
duke@435 69 // [initialization state ]
duke@435 70 // [initializing thread ]
duke@435 71 // [Java vtable length ]
duke@435 72 // [oop map cache (stack maps) ]
duke@435 73 // [EMBEDDED Java vtable ] size in words = vtable_len
duke@435 74 // [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size
jiangli@3701 75 // The embedded nonstatic oop-map blocks are short pairs (offset, length)
jiangli@3701 76 // indicating where oops are located in instances of this klass.
jiangli@3701 77 // [EMBEDDED implementor of the interface] only exist for interface
jiangli@3741 78 // [EMBEDDED host klass ] only exist for an anonymous class (JSR 292 enabled)
duke@435 79
duke@435 80
duke@435 81 // forward declaration for class -- see below for definition
duke@435 82 class SuperTypeClosure;
duke@435 83 class JNIid;
duke@435 84 class jniIdMapBase;
duke@435 85 class BreakpointInfo;
duke@435 86 class fieldDescriptor;
duke@435 87 class DepChange;
duke@435 88 class nmethodBucket;
duke@435 89 class PreviousVersionNode;
duke@435 90 class JvmtiCachedClassFieldMap;
duke@435 91
duke@435 92 // This is used in iterators below.
duke@435 93 class FieldClosure: public StackObj {
duke@435 94 public:
duke@435 95 virtual void do_field(fieldDescriptor* fd) = 0;
duke@435 96 };
duke@435 97
duke@435 98 #ifndef PRODUCT
duke@435 99 // Print fields.
duke@435 100 // If "obj" argument to constructor is NULL, prints static fields, otherwise prints non-static fields.
duke@435 101 class FieldPrinter: public FieldClosure {
duke@435 102 oop _obj;
duke@435 103 outputStream* _st;
duke@435 104 public:
duke@435 105 FieldPrinter(outputStream* st, oop obj = NULL) : _obj(obj), _st(st) {}
duke@435 106 void do_field(fieldDescriptor* fd);
duke@435 107 };
duke@435 108 #endif // !PRODUCT
duke@435 109
jcoomes@1373 110 // ValueObjs embedded in klass. Describes where oops are located in instances of
jcoomes@1373 111 // this klass.
jcoomes@1373 112 class OopMapBlock VALUE_OBJ_CLASS_SPEC {
jcoomes@1373 113 public:
jcoomes@1373 114 // Byte offset of the first oop mapped by this block.
jcoomes@1374 115 int offset() const { return _offset; }
jcoomes@1374 116 void set_offset(int offset) { _offset = offset; }
jcoomes@1373 117
jcoomes@1373 118 // Number of oops in this block.
jcoomes@1374 119 uint count() const { return _count; }
jcoomes@1374 120 void set_count(uint count) { _count = count; }
jcoomes@1373 121
jcoomes@1373 122 // sizeof(OopMapBlock) in HeapWords.
jcoomes@1373 123 static const int size_in_words() {
jcoomes@1373 124 return align_size_up(int(sizeof(OopMapBlock)), HeapWordSize) >>
jcoomes@1373 125 LogHeapWordSize;
jcoomes@1373 126 }
jcoomes@1373 127
jcoomes@1373 128 private:
jcoomes@1374 129 int _offset;
jcoomes@1374 130 uint _count;
jcoomes@1373 131 };
jcoomes@1373 132
coleenp@4037 133 class InstanceKlass: public Klass {
duke@435 134 friend class VMStructs;
coleenp@4037 135 friend class ClassFileParser;
minqi@4267 136 friend class CompileReplay;
coleenp@4037 137
coleenp@4037 138 protected:
coleenp@4037 139 // Constructor
coleenp@4037 140 InstanceKlass(int vtable_len,
coleenp@4037 141 int itable_len,
coleenp@4037 142 int static_field_size,
coleenp@4037 143 int nonstatic_oop_map_size,
coleenp@4037 144 ReferenceType rt,
coleenp@4037 145 AccessFlags access_flags,
coleenp@4037 146 bool is_anonymous);
duke@435 147 public:
coleenp@4037 148 static Klass* allocate_instance_klass(ClassLoaderData* loader_data,
coleenp@4037 149 int vtable_len,
coleenp@4037 150 int itable_len,
coleenp@4037 151 int static_field_size,
coleenp@4037 152 int nonstatic_oop_map_size,
coleenp@4037 153 ReferenceType rt,
coleenp@4037 154 AccessFlags access_flags,
coleenp@4037 155 Symbol* name,
coleenp@4037 156 Klass* super_klass,
coleenp@4037 157 KlassHandle host_klass,
coleenp@4037 158 TRAPS);
coleenp@4037 159
coleenp@4037 160 InstanceKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
coleenp@4037 161
duke@435 162 // See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed description
duke@435 163 // of the class loading & initialization procedure, and the use of the states.
duke@435 164 enum ClassState {
duke@435 165 allocated, // allocated (but not yet linked)
duke@435 166 loaded, // loaded and inserted in class hierarchy (but not linked yet)
duke@435 167 linked, // successfully linked/verified (but not initialized yet)
duke@435 168 being_initialized, // currently running class initializer
duke@435 169 fully_initialized, // initialized (successfull final state)
duke@435 170 initialization_error // error happened during initialization
duke@435 171 };
duke@435 172
duke@435 173 protected:
duke@435 174 // Protection domain.
duke@435 175 oop _protection_domain;
duke@435 176 // Class signers.
duke@435 177 objArrayOop _signers;
coleenp@4037 178 // Initialization lock. Must be one per class and it has to be a VM internal
coleenp@4037 179 // object so java code cannot lock it (like the mirror)
coleenp@4037 180 // It has to be an object not a Mutex because it's held through java calls.
coleenp@4037 181 volatile oop _init_lock;
coleenp@4037 182
coleenp@4037 183 // Annotations for this class
coleenp@4037 184 Annotations* _annotations;
coleenp@4037 185 // Array classes holding elements of this class.
coleenp@4037 186 Klass* _array_klasses;
coleenp@4037 187 // Constant pool for this class.
coleenp@4037 188 ConstantPool* _constants;
jiangli@3670 189 // The InnerClasses attribute and EnclosingMethod attribute. The
jiangli@3670 190 // _inner_classes is an array of shorts. If the class has InnerClasses
jiangli@3670 191 // attribute, then the _inner_classes array begins with 4-tuples of shorts
jiangli@3670 192 // [inner_class_info_index, outer_class_info_index,
jiangli@3670 193 // inner_name_index, inner_class_access_flags] for the InnerClasses
jiangli@3670 194 // attribute. If the EnclosingMethod attribute exists, it occupies the
jiangli@3670 195 // last two shorts [class_index, method_index] of the array. If only
jiangli@3670 196 // the InnerClasses attribute exists, the _inner_classes array length is
jiangli@3670 197 // number_of_inner_classes * 4. If the class has both InnerClasses
jiangli@3670 198 // and EnclosingMethod attributes the _inner_classes array length is
jiangli@3670 199 // number_of_inner_classes * 4 + enclosing_method_attribute_size.
coleenp@4037 200 Array<jushort>* _inner_classes;
duke@435 201
coleenp@2497 202 // Name of source file containing this klass, NULL if not specified.
coleenp@2497 203 Symbol* _source_file_name;
coleenp@2497 204 // the source debug extension for this klass, NULL if not specified.
fparain@3906 205 // Specified as UTF-8 string without terminating zero byte in the classfile,
fparain@3906 206 // it is stored in the instanceklass as a NULL-terminated UTF-8 string
fparain@3906 207 char* _source_debug_extension;
coleenp@2497 208 // Generic signature, or null if none.
coleenp@2497 209 Symbol* _generic_signature;
coleenp@2497 210 // Array name derived from this class which needs unreferencing
coleenp@2497 211 // if this class is unloaded.
coleenp@2497 212 Symbol* _array_name;
coleenp@2497 213
kvn@600 214 // Number of heapOopSize words used by non-static fields in this klass
kvn@600 215 // (including inherited fields but after header_size()).
coleenp@548 216 int _nonstatic_field_size;
coleenp@548 217 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass
jiangli@3373 218 u2 _static_oop_field_count;// number of static oop fields in this klass
jiangli@3373 219 u2 _java_fields_count; // The number of declared Java fields
jcoomes@1373 220 int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks
coleenp@3366 221
dcubed@3401 222 bool _is_marked_dependent; // used for marking during flushing and deoptimization
jiangli@3741 223 enum {
jiangli@3741 224 _misc_rewritten = 1 << 0, // methods rewritten.
jiangli@3741 225 _misc_has_nonstatic_fields = 1 << 1, // for sizing with UseCompressedOops
jiangli@3741 226 _misc_should_verify_class = 1 << 2, // allow caching of preverification
jiangli@3741 227 _misc_is_anonymous = 1 << 3 // has embedded _inner_classes field
jiangli@3741 228 };
jiangli@3741 229 u2 _misc_flags;
duke@435 230 u2 _minor_version; // minor version number of class file
duke@435 231 u2 _major_version; // major version number of class file
duke@435 232 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization)
duke@435 233 int _vtable_len; // length of Java vtable (in words)
duke@435 234 int _itable_len; // length of Java itable (in words)
duke@435 235 OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily)
duke@435 236 JNIid* _jni_ids; // First JNI identifier for static fields in this class
duke@435 237 jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none
duke@435 238 int* _methods_cached_itable_indices; // itable_index cache for JNI invoke corresponding to methods idnum, or NULL
duke@435 239 nmethodBucket* _dependencies; // list of dependent nmethods
duke@435 240 nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class
coleenp@4037 241 BreakpointInfo* _breakpoints; // bpt lists, managed by Method*
duke@435 242 // Array of interesting part(s) of the previous version(s) of this
coleenp@4037 243 // InstanceKlass. See PreviousVersionWalker below.
duke@435 244 GrowableArray<PreviousVersionNode *>* _previous_versions;
duke@435 245 // JVMTI fields can be moved to their own structure - see 6315920
duke@435 246 unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH
duke@435 247 jint _cached_class_file_len; // JVMTI: length of above
duke@435 248 JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration
kamg@4245 249
kamg@4245 250 // true if class, superclass, or implemented interfaces have default methods
kamg@4245 251 bool _has_default_methods;
kamg@4245 252
duke@435 253 volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change
coleenp@4037 254 // Method array.
coleenp@4037 255 Array<Method*>* _methods;
coleenp@4037 256 // Interface (Klass*s) this class declares locally to implement.
coleenp@4037 257 Array<Klass*>* _local_interfaces;
coleenp@4037 258 // Interface (Klass*s) this class implements transitively.
coleenp@4037 259 Array<Klass*>* _transitive_interfaces;
coleenp@4037 260 // Int array containing the original order of method in the class file (for JVMTI).
coleenp@4037 261 Array<int>* _method_ordering;
coleenp@4037 262 // Instance and static variable information, starts with 6-tuples of shorts
coleenp@4037 263 // [access, name index, sig index, initval index, low_offset, high_offset]
coleenp@4037 264 // for all fields, followed by the generic signature data at the end of
coleenp@4037 265 // the array. Only fields with generic signature attributes have the generic
coleenp@4037 266 // signature data set in the array. The fields array looks like following:
coleenp@4037 267 //
coleenp@4037 268 // f1: [access, name index, sig index, initial value index, low_offset, high_offset]
coleenp@4037 269 // f2: [access, name index, sig index, initial value index, low_offset, high_offset]
coleenp@4037 270 // ...
coleenp@4037 271 // fn: [access, name index, sig index, initial value index, low_offset, high_offset]
coleenp@4037 272 // [generic signature index]
coleenp@4037 273 // [generic signature index]
coleenp@4037 274 // ...
coleenp@4037 275 Array<u2>* _fields;
duke@435 276
coleenp@3368 277 // Class states are defined as ClassState (see above).
coleenp@3368 278 // Place the _init_state here to utilize the unused 2-byte after
coleenp@3368 279 // _idnum_allocated_count.
coleenp@3368 280 u1 _init_state; // state of class
coleenp@3368 281
jiangli@3526 282 u1 _reference_type; // reference type
jiangli@3526 283
duke@435 284 // embedded Java vtable follows here
duke@435 285 // embedded Java itables follows here
duke@435 286 // embedded static fields follows here
duke@435 287 // embedded nonstatic oop-map blocks follows here
jiangli@3701 288 // embedded implementor of this interface follows here
jiangli@3701 289 // The embedded implementor only exists if the current klass is an
jiangli@3701 290 // iterface. The possible values of the implementor fall into following
jiangli@3701 291 // three cases:
jiangli@3701 292 // NULL: no implementor.
coleenp@4037 293 // A Klass* that's not itself: one implementor.
jiangli@3701 294 // Itsef: more than one implementors.
jiangli@3741 295 // embedded host klass follows here
jiangli@3741 296 // The embedded host klass only exists in an anonymous class for
jiangli@3741 297 // dynamic language support (JSR 292 enabled). The host class grants
jiangli@3741 298 // its access privileges to this class also. The host class is either
jiangli@3741 299 // named, or a previously loaded anonymous class. A non-anonymous class
jiangli@3741 300 // or an anonymous class loaded through normal classloading does not
jiangli@3741 301 // have this embedded field.
jiangli@3741 302 //
duke@435 303
duke@435 304 friend class SystemDictionary;
duke@435 305
duke@435 306 public:
jiangli@3741 307 bool has_nonstatic_fields() const {
jiangli@3741 308 return (_misc_flags & _misc_has_nonstatic_fields) != 0;
jiangli@3741 309 }
jiangli@3741 310 void set_has_nonstatic_fields(bool b) {
jiangli@3741 311 if (b) {
jiangli@3741 312 _misc_flags |= _misc_has_nonstatic_fields;
jiangli@3741 313 } else {
jiangli@3741 314 _misc_flags &= ~_misc_has_nonstatic_fields;
jiangli@3741 315 }
jiangli@3741 316 }
coleenp@548 317
duke@435 318 // field sizes
duke@435 319 int nonstatic_field_size() const { return _nonstatic_field_size; }
duke@435 320 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; }
duke@435 321
duke@435 322 int static_field_size() const { return _static_field_size; }
duke@435 323 void set_static_field_size(int size) { _static_field_size = size; }
duke@435 324
jiangli@3373 325 int static_oop_field_count() const { return (int)_static_oop_field_count; }
jiangli@3373 326 void set_static_oop_field_count(u2 size) { _static_oop_field_count = size; }
duke@435 327
duke@435 328 // Java vtable
duke@435 329 int vtable_length() const { return _vtable_len; }
duke@435 330 void set_vtable_length(int len) { _vtable_len = len; }
duke@435 331
duke@435 332 // Java itable
duke@435 333 int itable_length() const { return _itable_len; }
duke@435 334 void set_itable_length(int len) { _itable_len = len; }
duke@435 335
duke@435 336 // array klasses
coleenp@4037 337 Klass* array_klasses() const { return _array_klasses; }
coleenp@4037 338 void set_array_klasses(Klass* k) { _array_klasses = k; }
duke@435 339
duke@435 340 // methods
coleenp@4037 341 Array<Method*>* methods() const { return _methods; }
coleenp@4037 342 void set_methods(Array<Method*>* a) { _methods = a; }
coleenp@4037 343 Method* method_with_idnum(int idnum);
duke@435 344
duke@435 345 // method ordering
coleenp@4037 346 Array<int>* method_ordering() const { return _method_ordering; }
coleenp@4037 347 void set_method_ordering(Array<int>* m) { _method_ordering = m; }
duke@435 348
duke@435 349 // interfaces
coleenp@4037 350 Array<Klass*>* local_interfaces() const { return _local_interfaces; }
coleenp@4037 351 void set_local_interfaces(Array<Klass*>* a) {
coleenp@4037 352 guarantee(_local_interfaces == NULL || a == NULL, "Just checking");
coleenp@4037 353 _local_interfaces = a; }
coleenp@4037 354 Array<Klass*>* transitive_interfaces() const { return _transitive_interfaces; }
coleenp@4037 355 void set_transitive_interfaces(Array<Klass*>* a) {
coleenp@4037 356 guarantee(_transitive_interfaces == NULL || a == NULL, "Just checking");
coleenp@4037 357 _transitive_interfaces = a; }
duke@435 358
never@3137 359 private:
never@3137 360 friend class fieldDescriptor;
never@3137 361 FieldInfo* field(int index) const { return FieldInfo::from_field_array(_fields, index); }
never@3137 362
never@3137 363 public:
never@3137 364 int field_offset (int index) const { return field(index)->offset(); }
never@3137 365 int field_access_flags(int index) const { return field(index)->access_flags(); }
never@3137 366 Symbol* field_name (int index) const { return field(index)->name(constants()); }
never@3137 367 Symbol* field_signature (int index) const { return field(index)->signature(constants()); }
never@3137 368
never@3137 369 // Number of Java declared fields
jiangli@3373 370 int java_fields_count() const { return (int)_java_fields_count; }
never@3137 371
coleenp@4037 372 Array<u2>* fields() const { return _fields; }
never@3137 373
coleenp@4037 374 void set_fields(Array<u2>* f, u2 java_fields_count) {
coleenp@4037 375 guarantee(_fields == NULL || f == NULL, "Just checking");
coleenp@4037 376 _fields = f;
never@3137 377 _java_fields_count = java_fields_count;
duke@435 378 }
duke@435 379
duke@435 380 // inner classes
coleenp@4037 381 Array<u2>* inner_classes() const { return _inner_classes; }
coleenp@4037 382 void set_inner_classes(Array<u2>* f) { _inner_classes = f; }
duke@435 383
duke@435 384 enum InnerClassAttributeOffset {
duke@435 385 // From http://mirror.eng/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc10.html#18814
duke@435 386 inner_class_inner_class_info_offset = 0,
duke@435 387 inner_class_outer_class_info_offset = 1,
duke@435 388 inner_class_inner_name_offset = 2,
duke@435 389 inner_class_access_flags_offset = 3,
duke@435 390 inner_class_next_offset = 4
duke@435 391 };
duke@435 392
jiangli@3670 393 enum EnclosingMethodAttributeOffset {
jiangli@3670 394 enclosing_method_class_index_offset = 0,
jiangli@3670 395 enclosing_method_method_index_offset = 1,
jiangli@3670 396 enclosing_method_attribute_size = 2
jiangli@3670 397 };
jiangli@3670 398
acorn@1087 399 // method override check
coleenp@2497 400 bool is_override(methodHandle super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS);
acorn@1087 401
duke@435 402 // package
coleenp@4037 403 bool is_same_class_package(Klass* class2);
coleenp@2497 404 bool is_same_class_package(oop classloader2, Symbol* classname2);
coleenp@2497 405 static bool is_same_class_package(oop class_loader1, Symbol* class_name1, oop class_loader2, Symbol* class_name2);
duke@435 406
jrose@1100 407 // find an enclosing class (defined where original code was, in jvm.cpp!)
coleenp@4037 408 Klass* compute_enclosing_class(bool* inner_is_member, TRAPS) {
coleenp@4037 409 instanceKlassHandle self(THREAD, this);
xlu@1561 410 return compute_enclosing_class_impl(self, inner_is_member, THREAD);
jrose@1100 411 }
coleenp@4037 412 static Klass* compute_enclosing_class_impl(instanceKlassHandle self,
xlu@1561 413 bool* inner_is_member, TRAPS);
jrose@1100 414
jrose@1100 415 // tell if two classes have the same enclosing class (at package level)
coleenp@4037 416 bool is_same_package_member(Klass* class2, TRAPS) {
coleenp@4037 417 instanceKlassHandle self(THREAD, this);
jrose@1100 418 return is_same_package_member_impl(self, class2, THREAD);
jrose@1100 419 }
jrose@1100 420 static bool is_same_package_member_impl(instanceKlassHandle self,
coleenp@4037 421 Klass* class2, TRAPS);
jrose@1100 422
duke@435 423 // initialization state
duke@435 424 bool is_loaded() const { return _init_state >= loaded; }
duke@435 425 bool is_linked() const { return _init_state >= linked; }
duke@435 426 bool is_initialized() const { return _init_state == fully_initialized; }
duke@435 427 bool is_not_initialized() const { return _init_state < being_initialized; }
duke@435 428 bool is_being_initialized() const { return _init_state == being_initialized; }
duke@435 429 bool is_in_error_state() const { return _init_state == initialization_error; }
duke@435 430 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; }
coleenp@3368 431 ClassState init_state() { return (ClassState)_init_state; }
jiangli@3741 432 bool is_rewritten() const { return (_misc_flags & _misc_rewritten) != 0; }
acorn@1408 433
acorn@1408 434 // defineClass specified verification
jiangli@3741 435 bool should_verify_class() const {
jiangli@3741 436 return (_misc_flags & _misc_should_verify_class) != 0;
jiangli@3741 437 }
jiangli@3741 438 void set_should_verify_class(bool value) {
jiangli@3741 439 if (value) {
jiangli@3741 440 _misc_flags |= _misc_should_verify_class;
jiangli@3741 441 } else {
jiangli@3741 442 _misc_flags &= ~_misc_should_verify_class;
jiangli@3741 443 }
jiangli@3741 444 }
duke@435 445
duke@435 446 // marking
dcubed@3401 447 bool is_marked_dependent() const { return _is_marked_dependent; }
dcubed@3401 448 void set_is_marked_dependent(bool value) { _is_marked_dependent = value; }
duke@435 449
duke@435 450 // initialization (virtuals from Klass)
duke@435 451 bool should_be_initialized() const; // means that initialize should be called
duke@435 452 void initialize(TRAPS);
duke@435 453 void link_class(TRAPS);
duke@435 454 bool link_class_or_fail(TRAPS); // returns false on failure
duke@435 455 void unlink_class();
duke@435 456 void rewrite_class(TRAPS);
coleenp@2945 457 void relocate_and_link_methods(TRAPS);
coleenp@4037 458 Method* class_initializer();
duke@435 459
duke@435 460 // set the class to initialized if no static initializer is present
duke@435 461 void eager_initialize(Thread *thread);
duke@435 462
duke@435 463 // reference type
jiangli@3526 464 ReferenceType reference_type() const { return (ReferenceType)_reference_type; }
jiangli@3526 465 void set_reference_type(ReferenceType t) {
jiangli@3526 466 assert(t == (u1)t, "overflow");
jiangli@3526 467 _reference_type = (u1)t;
jiangli@3526 468 }
duke@435 469
coleenp@4037 470 static ByteSize reference_type_offset() { return in_ByteSize(offset_of(InstanceKlass, _reference_type)); }
johnc@2781 471
duke@435 472 // find local field, returns true if found
coleenp@2497 473 bool find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 474 // find field in direct superinterfaces, returns the interface in which the field is defined
coleenp@4037 475 Klass* find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 476 // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined
coleenp@4037 477 Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
duke@435 478 // find instance or static fields according to JVM spec 5.4.3.2, returns the klass in which the field is defined
coleenp@4037 479 Klass* find_field(Symbol* name, Symbol* sig, bool is_static, fieldDescriptor* fd) const;
duke@435 480
duke@435 481 // find a non-static or static field given its offset within the class.
duke@435 482 bool contains_field_offset(int offset) {
coleenp@548 483 return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size());
duke@435 484 }
duke@435 485
duke@435 486 bool find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
duke@435 487 bool find_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
duke@435 488
duke@435 489 // find a local method (returns NULL if not found)
coleenp@4037 490 Method* find_method(Symbol* name, Symbol* signature) const;
coleenp@4037 491 static Method* find_method(Array<Method*>* methods, Symbol* name, Symbol* signature);
duke@435 492
duke@435 493 // lookup operation (returns NULL if not found)
coleenp@4037 494 Method* uncached_lookup_method(Symbol* name, Symbol* signature) const;
duke@435 495
duke@435 496 // lookup a method in all the interfaces that this class implements
duke@435 497 // (returns NULL if not found)
coleenp@4037 498 Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature) const;
duke@435 499
kamg@4245 500 // Find method indices by name. If a method with the specified name is
kamg@4245 501 // found the index to the first method is returned, and 'end' is filled in
kamg@4245 502 // with the index of first non-name-matching method. If no method is found
kamg@4245 503 // -1 is returned.
kamg@4245 504 int find_method_by_name(Symbol* name, int* end);
kamg@4245 505 static int find_method_by_name(Array<Method*>* methods, Symbol* name, int* end);
kamg@4245 506
duke@435 507 // constant pool
coleenp@4037 508 ConstantPool* constants() const { return _constants; }
coleenp@4037 509 void set_constants(ConstantPool* c) { _constants = c; }
duke@435 510
duke@435 511 // protection domain
duke@435 512 oop protection_domain() { return _protection_domain; }
coleenp@4037 513 void set_protection_domain(oop pd) { klass_oop_store(&_protection_domain, pd); }
duke@435 514
jrose@866 515 // host class
coleenp@4037 516 Klass* host_klass() const {
coleenp@4037 517 Klass** hk = (Klass**)adr_host_klass();
jiangli@3741 518 if (hk == NULL) {
jiangli@3741 519 return NULL;
jiangli@3741 520 } else {
jiangli@3741 521 return *hk;
jiangli@3741 522 }
jiangli@3741 523 }
coleenp@4037 524 void set_host_klass(Klass* host) {
jiangli@3741 525 assert(is_anonymous(), "not anonymous");
coleenp@4037 526 Klass** addr = (Klass**)adr_host_klass();
jiangli@3741 527 assert(addr != NULL, "no reversed space");
coleenp@4037 528 *addr = host;
jiangli@3741 529 }
jiangli@3741 530 bool is_anonymous() const {
jiangli@3741 531 return (_misc_flags & _misc_is_anonymous) != 0;
jiangli@3741 532 }
jiangli@3741 533 void set_is_anonymous(bool value) {
jiangli@3741 534 if (value) {
jiangli@3741 535 _misc_flags |= _misc_is_anonymous;
jiangli@3741 536 } else {
jiangli@3741 537 _misc_flags &= ~_misc_is_anonymous;
jiangli@3741 538 }
jiangli@3741 539 }
jrose@866 540
duke@435 541 // signers
duke@435 542 objArrayOop signers() const { return _signers; }
coleenp@4037 543 void set_signers(objArrayOop s) { klass_oop_store((oop*)&_signers, s); }
duke@435 544
duke@435 545 // source file name
coleenp@2497 546 Symbol* source_file_name() const { return _source_file_name; }
coleenp@2497 547 void set_source_file_name(Symbol* n);
duke@435 548
duke@435 549 // minor and major version numbers of class file
duke@435 550 u2 minor_version() const { return _minor_version; }
duke@435 551 void set_minor_version(u2 minor_version) { _minor_version = minor_version; }
duke@435 552 u2 major_version() const { return _major_version; }
duke@435 553 void set_major_version(u2 major_version) { _major_version = major_version; }
duke@435 554
duke@435 555 // source debug extension
fparain@3906 556 char* source_debug_extension() const { return _source_debug_extension; }
fparain@3906 557 void set_source_debug_extension(char* array, int length);
coleenp@2497 558
coleenp@2497 559 // symbol unloading support (refcount already added)
coleenp@2497 560 Symbol* array_name() { return _array_name; }
coleenp@2497 561 void set_array_name(Symbol* name) { assert(_array_name == NULL, "name already created"); _array_name = name; }
duke@435 562
duke@435 563 // nonstatic oop-map blocks
jcoomes@1374 564 static int nonstatic_oop_map_size(unsigned int oop_map_count) {
jcoomes@1373 565 return oop_map_count * OopMapBlock::size_in_words();
jcoomes@1373 566 }
jcoomes@1374 567 unsigned int nonstatic_oop_map_count() const {
jcoomes@1373 568 return _nonstatic_oop_map_size / OopMapBlock::size_in_words();
jcoomes@1373 569 }
jcoomes@1373 570 int nonstatic_oop_map_size() const { return _nonstatic_oop_map_size; }
jcoomes@1373 571 void set_nonstatic_oop_map_size(int words) {
jcoomes@1373 572 _nonstatic_oop_map_size = words;
jcoomes@1373 573 }
duke@435 574
duke@435 575 // RedefineClasses() support for previous versions:
duke@435 576 void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods,
duke@435 577 int emcp_method_count);
dcubed@1412 578 // If the _previous_versions array is non-NULL, then this klass
dcubed@1412 579 // has been redefined at least once even if we aren't currently
dcubed@1412 580 // tracking a previous version.
dcubed@1412 581 bool has_been_redefined() const { return _previous_versions != NULL; }
duke@435 582 bool has_previous_version() const;
duke@435 583 void init_previous_versions() {
duke@435 584 _previous_versions = NULL;
duke@435 585 }
duke@435 586 GrowableArray<PreviousVersionNode *>* previous_versions() const {
duke@435 587 return _previous_versions;
duke@435 588 }
duke@435 589
coleenp@4037 590 static void purge_previous_versions(InstanceKlass* ik);
coleenp@4037 591
duke@435 592 // JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation
duke@435 593 void set_cached_class_file(unsigned char *class_file_bytes,
duke@435 594 jint class_file_len) { _cached_class_file_len = class_file_len;
duke@435 595 _cached_class_file_bytes = class_file_bytes; }
duke@435 596 jint get_cached_class_file_len() { return _cached_class_file_len; }
duke@435 597 unsigned char * get_cached_class_file_bytes() { return _cached_class_file_bytes; }
duke@435 598
duke@435 599 // JVMTI: Support for caching of field indices, types, and offsets
duke@435 600 void set_jvmti_cached_class_field_map(JvmtiCachedClassFieldMap* descriptor) {
duke@435 601 _jvmti_cached_class_field_map = descriptor;
duke@435 602 }
duke@435 603 JvmtiCachedClassFieldMap* jvmti_cached_class_field_map() const {
duke@435 604 return _jvmti_cached_class_field_map;
duke@435 605 }
duke@435 606
kamg@4245 607 bool has_default_methods() const { return _has_default_methods; }
kamg@4245 608 void set_has_default_methods(bool b) { _has_default_methods = b; }
kamg@4245 609
coleenp@4037 610 // for adding methods, ConstMethod::UNSET_IDNUM means no more ids available
duke@435 611 inline u2 next_method_idnum();
duke@435 612 void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; }
duke@435 613
duke@435 614 // generics support
coleenp@2497 615 Symbol* generic_signature() const { return _generic_signature; }
coleenp@2497 616 void set_generic_signature(Symbol* sig) { _generic_signature = sig; }
coleenp@2497 617
jiangli@3670 618 u2 enclosing_method_data(int offset);
jiangli@3670 619 u2 enclosing_method_class_index() {
jiangli@3670 620 return enclosing_method_data(enclosing_method_class_index_offset);
jiangli@3670 621 }
jiangli@3670 622 u2 enclosing_method_method_index() {
jiangli@3670 623 return enclosing_method_data(enclosing_method_method_index_offset);
jiangli@3670 624 }
duke@435 625 void set_enclosing_method_indices(u2 class_index,
jiangli@3670 626 u2 method_index);
duke@435 627
duke@435 628 // jmethodID support
dcubed@1412 629 static jmethodID get_jmethod_id(instanceKlassHandle ik_h,
dcubed@1412 630 methodHandle method_h);
dcubed@1412 631 static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h,
dcubed@1412 632 size_t idnum, jmethodID new_id, jmethodID* new_jmeths,
dcubed@1412 633 jmethodID* to_dealloc_id_p,
dcubed@1412 634 jmethodID** to_dealloc_jmeths_p);
dcubed@1412 635 static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum,
dcubed@1412 636 size_t *length_p, jmethodID* id_p);
coleenp@4037 637 jmethodID jmethod_id_or_null(Method* method);
duke@435 638
duke@435 639 // cached itable index support
duke@435 640 void set_cached_itable_index(size_t idnum, int index);
duke@435 641 int cached_itable_index(size_t idnum);
duke@435 642
duke@435 643 // annotations support
coleenp@4037 644 Annotations* annotations() const { return _annotations; }
coleenp@4037 645 void set_annotations(Annotations* anno) { _annotations = anno; }
coleenp@4037 646 AnnotationArray* class_annotations() const {
coleenp@4037 647 if (annotations() == NULL) return NULL;
coleenp@4037 648 return annotations()->class_annotations();
coleenp@4037 649 }
coleenp@4037 650 Array<AnnotationArray*>* fields_annotations() const {
coleenp@4037 651 if (annotations() == NULL) return NULL;
coleenp@4037 652 return annotations()->fields_annotations();
coleenp@4037 653 }
duke@435 654
duke@435 655 // allocation
duke@435 656 instanceOop allocate_instance(TRAPS);
duke@435 657
duke@435 658 // additional member function to return a handle
duke@435 659 instanceHandle allocate_instance_handle(TRAPS) { return instanceHandle(THREAD, allocate_instance(THREAD)); }
duke@435 660
duke@435 661 objArrayOop allocate_objArray(int n, int length, TRAPS);
duke@435 662 // Helper function
duke@435 663 static instanceOop register_finalizer(instanceOop i, TRAPS);
duke@435 664
duke@435 665 // Check whether reflection/jni/jvm code is allowed to instantiate this class;
duke@435 666 // if not, throw either an Error or an Exception.
duke@435 667 virtual void check_valid_for_instantiation(bool throwError, TRAPS);
duke@435 668
duke@435 669 // initialization
duke@435 670 void call_class_initializer(TRAPS);
duke@435 671 void set_initialization_state_and_notify(ClassState state, TRAPS);
duke@435 672
duke@435 673 // OopMapCache support
duke@435 674 OopMapCache* oop_map_cache() { return _oop_map_cache; }
duke@435 675 void set_oop_map_cache(OopMapCache *cache) { _oop_map_cache = cache; }
duke@435 676 void mask_for(methodHandle method, int bci, InterpreterOopMap* entry);
duke@435 677
duke@435 678 // JNI identifier support (for static fields - for jni performance)
duke@435 679 JNIid* jni_ids() { return _jni_ids; }
duke@435 680 void set_jni_ids(JNIid* ids) { _jni_ids = ids; }
duke@435 681 JNIid* jni_id_for(int offset);
duke@435 682
duke@435 683 // maintenance of deoptimization dependencies
duke@435 684 int mark_dependent_nmethods(DepChange& changes);
duke@435 685 void add_dependent_nmethod(nmethod* nm);
duke@435 686 void remove_dependent_nmethod(nmethod* nm);
duke@435 687
duke@435 688 // On-stack replacement support
duke@435 689 nmethod* osr_nmethods_head() const { return _osr_nmethods_head; };
duke@435 690 void set_osr_nmethods_head(nmethod* h) { _osr_nmethods_head = h; };
duke@435 691 void add_osr_nmethod(nmethod* n);
duke@435 692 void remove_osr_nmethod(nmethod* n);
coleenp@4037 693 nmethod* lookup_osr_nmethod(Method* const m, int bci, int level, bool match_level) const;
duke@435 694
coleenp@4037 695 // Breakpoint support (see methods on Method* for details)
duke@435 696 BreakpointInfo* breakpoints() const { return _breakpoints; };
duke@435 697 void set_breakpoints(BreakpointInfo* bps) { _breakpoints = bps; };
duke@435 698
duke@435 699 // support for stub routines
coleenp@4037 700 static ByteSize init_state_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_state)); }
rbackman@3709 701 TRACE_DEFINE_OFFSET;
coleenp@4037 702 static ByteSize init_thread_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_thread)); }
duke@435 703
duke@435 704 // subclass/subinterface checks
coleenp@4037 705 bool implements_interface(Klass* k) const;
duke@435 706
jiangli@3701 707 // Access to the implementor of an interface.
coleenp@4037 708 Klass* implementor() const
jiangli@3701 709 {
coleenp@4037 710 Klass** k = adr_implementor();
jiangli@3701 711 if (k == NULL) {
jiangli@3701 712 return NULL;
jiangli@3701 713 } else {
jiangli@3701 714 return *k;
jiangli@3701 715 }
duke@435 716 }
jiangli@3701 717
coleenp@4037 718 void set_implementor(Klass* k) {
jiangli@3701 719 assert(is_interface(), "not interface");
coleenp@4037 720 Klass** addr = adr_implementor();
coleenp@4037 721 *addr = k;
jiangli@3701 722 }
jiangli@3701 723
jiangli@3701 724 int nof_implementors() const {
coleenp@4037 725 Klass* k = implementor();
jiangli@3701 726 if (k == NULL) {
jiangli@3701 727 return 0;
coleenp@4037 728 } else if (k != this) {
jiangli@3701 729 return 1;
jiangli@3701 730 } else {
jiangli@3701 731 return 2;
jiangli@3701 732 }
jiangli@3701 733 }
jiangli@3701 734
coleenp@4037 735 void add_implementor(Klass* k); // k is a new class that implements this interface
duke@435 736 void init_implementor(); // initialize
duke@435 737
duke@435 738 // link this class into the implementors list of every interface it implements
duke@435 739 void process_interfaces(Thread *thread);
duke@435 740
duke@435 741 // virtual operations from Klass
duke@435 742 bool is_leaf_class() const { return _subklass == NULL; }
coleenp@4037 743 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots);
coleenp@4037 744 bool compute_is_subtype_of(Klass* k);
duke@435 745 bool can_be_primary_super_slow() const;
duke@435 746 int oop_size(oop obj) const { return size_helper(); }
duke@435 747 bool oop_is_instance_slow() const { return true; }
duke@435 748
duke@435 749 // Iterators
duke@435 750 void do_local_static_fields(FieldClosure* cl);
duke@435 751 void do_nonstatic_fields(FieldClosure* cl); // including inherited fields
duke@435 752 void do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS);
duke@435 753
coleenp@4037 754 void methods_do(void f(Method* method));
coleenp@4037 755 void array_klasses_do(void f(Klass* k));
coleenp@4037 756 void array_klasses_do(void f(Klass* k, TRAPS), TRAPS);
coleenp@4037 757 void with_array_klasses_do(void f(Klass* k));
duke@435 758 bool super_types_do(SuperTypeClosure* blk);
duke@435 759
coleenp@4037 760 // Casting from Klass*
coleenp@4037 761 static InstanceKlass* cast(Klass* k) {
never@2658 762 assert(k->is_klass(), "must be");
coleenp@4037 763 assert(k->oop_is_instance(), "cast to InstanceKlass");
coleenp@4037 764 return (InstanceKlass*) k;
duke@435 765 }
duke@435 766
kamg@4245 767 InstanceKlass* java_super() const {
kamg@4245 768 return (super() == NULL) ? NULL : cast(super());
kamg@4245 769 }
kamg@4245 770
duke@435 771 // Sizing (in words)
coleenp@4037 772 static int header_size() { return align_object_offset(sizeof(InstanceKlass)/HeapWordSize); }
coleenp@4037 773 static int size(int vtable_length, int itable_length,
coleenp@4037 774 int nonstatic_oop_map_size,
coleenp@4037 775 bool is_interface, bool is_anonymous) {
coleenp@4037 776 return align_object_size(header_size() +
coleenp@4037 777 align_object_offset(vtable_length) +
coleenp@4037 778 align_object_offset(itable_length) +
coleenp@4037 779 ((is_interface || is_anonymous) ?
coleenp@4037 780 align_object_offset(nonstatic_oop_map_size) :
coleenp@4037 781 nonstatic_oop_map_size) +
coleenp@4037 782 (is_interface ? (int)sizeof(Klass*)/HeapWordSize : 0) +
coleenp@4037 783 (is_anonymous ? (int)sizeof(Klass*)/HeapWordSize : 0));
coleenp@4037 784 }
coleenp@4037 785 int size() const { return size(vtable_length(),
coleenp@4037 786 itable_length(),
coleenp@4037 787 nonstatic_oop_map_size(),
coleenp@4037 788 is_interface(),
coleenp@4037 789 is_anonymous());
coleenp@4037 790 }
jiangli@3701 791
duke@435 792 static int vtable_start_offset() { return header_size(); }
coleenp@4037 793 static int vtable_length_offset() { return offset_of(InstanceKlass, _vtable_len) / HeapWordSize; }
duke@435 794
coleenp@4037 795 intptr_t* start_of_vtable() const { return ((intptr_t*)this) + vtable_start_offset(); }
duke@435 796 intptr_t* start_of_itable() const { return start_of_vtable() + align_object_offset(vtable_length()); }
coleenp@4037 797 int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; }
duke@435 798
duke@435 799 intptr_t* end_of_itable() const { return start_of_itable() + itable_length(); }
duke@435 800
never@2658 801 address static_field_addr(int offset);
coleenp@548 802
coleenp@548 803 OopMapBlock* start_of_nonstatic_oop_maps() const {
never@2658 804 return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length()));
coleenp@548 805 }
duke@435 806
coleenp@4037 807 Klass** adr_implementor() const {
jiangli@3701 808 if (is_interface()) {
coleenp@4037 809 return (Klass**)(start_of_nonstatic_oop_maps() +
jiangli@3741 810 nonstatic_oop_map_count());
jiangli@3701 811 } else {
jiangli@3701 812 return NULL;
jiangli@3701 813 }
jiangli@3701 814 };
jiangli@3701 815
coleenp@4037 816 Klass** adr_host_klass() const {
jiangli@3741 817 if (is_anonymous()) {
coleenp@4037 818 Klass** adr_impl = adr_implementor();
jiangli@3741 819 if (adr_impl != NULL) {
jiangli@3741 820 return adr_impl + 1;
jiangli@3741 821 } else {
coleenp@4037 822 return (Klass**)(start_of_nonstatic_oop_maps() +
jiangli@3741 823 nonstatic_oop_map_count());
jiangli@3741 824 }
jiangli@3741 825 } else {
jiangli@3741 826 return NULL;
jiangli@3741 827 }
jiangli@3741 828 }
jiangli@3741 829
duke@435 830 // Allocation profiling support
duke@435 831 juint alloc_size() const { return _alloc_count * size_helper(); }
duke@435 832 void set_alloc_size(juint n) {}
duke@435 833
duke@435 834 // Use this to return the size of an instance in heap words:
duke@435 835 int size_helper() const {
duke@435 836 return layout_helper_to_size_helper(layout_helper());
duke@435 837 }
duke@435 838
duke@435 839 // This bit is initialized in classFileParser.cpp.
duke@435 840 // It is false under any of the following conditions:
duke@435 841 // - the class is abstract (including any interface)
duke@435 842 // - the class has a finalizer (if !RegisterFinalizersAtInit)
duke@435 843 // - the class size is larger than FastAllocateSizeLimit
duke@435 844 // - the class is java/lang/Class, which cannot be allocated directly
duke@435 845 bool can_be_fastpath_allocated() const {
duke@435 846 return !layout_helper_needs_slow_path(layout_helper());
duke@435 847 }
duke@435 848
duke@435 849 // Java vtable/itable
duke@435 850 klassVtable* vtable() const; // return new klassVtable wrapper
coleenp@4037 851 inline Method* method_at_vtable(int index);
duke@435 852 klassItable* itable() const; // return new klassItable wrapper
coleenp@4037 853 Method* method_at_itable(Klass* holder, int index, TRAPS);
duke@435 854
duke@435 855 // Garbage collection
coleenp@4037 856 virtual void oops_do(OopClosure* cl);
coleenp@4037 857
duke@435 858 void oop_follow_contents(oop obj);
duke@435 859 int oop_adjust_pointers(oop obj);
duke@435 860
coleenp@4037 861 void clean_implementors_list(BoolObjectClosure* is_alive);
coleenp@4037 862 void clean_method_data(BoolObjectClosure* is_alive);
coleenp@4037 863
coleenp@4037 864 // Explicit metaspace deallocation of fields
coleenp@4037 865 // For RedefineClasses, we need to deallocate instanceKlasses
coleenp@4037 866 void deallocate_contents(ClassLoaderData* loader_data);
coleenp@4037 867
coleenp@4037 868 // The constant pool is on stack if any of the methods are executing or
coleenp@4037 869 // referenced by handles.
coleenp@4037 870 bool on_stack() const { return _constants->on_stack(); }
coleenp@4037 871
duke@435 872 void release_C_heap_structures();
duke@435 873
duke@435 874 // Parallel Scavenge and Parallel Old
duke@435 875 PARALLEL_GC_DECLS
duke@435 876
duke@435 877 // Naming
jrose@1474 878 const char* signature_name() const;
duke@435 879
duke@435 880 // Iterators
coleenp@4037 881 int oop_oop_iterate(oop obj, ExtendedOopClosure* blk) {
duke@435 882 return oop_oop_iterate_v(obj, blk);
duke@435 883 }
duke@435 884
coleenp@4037 885 int oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) {
duke@435 886 return oop_oop_iterate_v_m(obj, blk, mr);
duke@435 887 }
duke@435 888
ysr@777 889 #define InstanceKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
ysr@777 890 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \
ysr@777 891 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, \
duke@435 892 MemRegion mr);
duke@435 893
duke@435 894 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_DECL)
ysr@777 895 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_DECL)
ysr@777 896
ysr@777 897 #ifndef SERIALGC
ysr@777 898 #define InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
ysr@777 899 int oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* blk);
ysr@777 900
ysr@777 901 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
ysr@777 902 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
ysr@777 903 #endif // !SERIALGC
duke@435 904
coleenp@4037 905 u2 idnum_allocated_count() const { return _idnum_allocated_count; }
duke@435 906 private:
duke@435 907 // initialization state
duke@435 908 #ifdef ASSERT
duke@435 909 void set_init_state(ClassState state);
duke@435 910 #else
coleenp@3368 911 void set_init_state(ClassState state) { _init_state = (u1)state; }
duke@435 912 #endif
jiangli@3741 913 void set_rewritten() { _misc_flags |= _misc_rewritten; }
duke@435 914 void set_init_thread(Thread *thread) { _init_thread = thread; }
duke@435 915
dcubed@1412 916 // The RedefineClasses() API can cause new method idnums to be needed
dcubed@1412 917 // which will cause the caches to grow. Safety requires different
dcubed@1412 918 // cache management logic if the caches can grow instead of just
dcubed@1412 919 // going from NULL to non-NULL.
dcubed@1412 920 bool idnum_can_increment() const { return has_been_redefined(); }
duke@435 921 jmethodID* methods_jmethod_ids_acquire() const
duke@435 922 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); }
duke@435 923 void release_set_methods_jmethod_ids(jmethodID* jmeths)
duke@435 924 { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); }
duke@435 925
duke@435 926 int* methods_cached_itable_indices_acquire() const
duke@435 927 { return (int*)OrderAccess::load_ptr_acquire(&_methods_cached_itable_indices); }
duke@435 928 void release_set_methods_cached_itable_indices(int* indices)
duke@435 929 { OrderAccess::release_store_ptr(&_methods_cached_itable_indices, indices); }
duke@435 930
coleenp@4037 931 // Lock during initialization
coleenp@4037 932 volatile oop init_lock() const;
coleenp@4037 933 void set_init_lock(oop value) { klass_oop_store(&_init_lock, value); }
coleenp@4037 934 void fence_and_clear_init_lock(); // after fully_initialized
duke@435 935
duke@435 936 // Offsets for memory management
duke@435 937 oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;}
duke@435 938 oop* adr_signers() const { return (oop*)&this->_signers;}
coleenp@4037 939 oop* adr_init_lock() const { return (oop*)&this->_init_lock;}
duke@435 940
duke@435 941 // Static methods that are used to implement member methods where an exposed this pointer
duke@435 942 // is needed due to possible GCs
duke@435 943 static bool link_class_impl (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
duke@435 944 static bool verify_code (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
duke@435 945 static void initialize_impl (instanceKlassHandle this_oop, TRAPS);
duke@435 946 static void eager_initialize_impl (instanceKlassHandle this_oop);
duke@435 947 static void set_initialization_state_and_notify_impl (instanceKlassHandle this_oop, ClassState state, TRAPS);
duke@435 948 static void call_class_initializer_impl (instanceKlassHandle this_oop, TRAPS);
coleenp@4037 949 static Klass* array_klass_impl (instanceKlassHandle this_oop, bool or_null, int n, TRAPS);
duke@435 950 static void do_local_static_fields_impl (instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS);
duke@435 951 /* jni_id_for_impl for jfieldID only */
duke@435 952 static JNIid* jni_id_for_impl (instanceKlassHandle this_oop, int offset);
duke@435 953
duke@435 954 // Returns the array class for the n'th dimension
coleenp@4037 955 Klass* array_klass_impl(bool or_null, int n, TRAPS);
duke@435 956
duke@435 957 // Returns the array class with this class as element type
coleenp@4037 958 Klass* array_klass_impl(bool or_null, TRAPS);
duke@435 959
duke@435 960 public:
coleenp@4037 961 // CDS support - remove and restore oops from metadata. Oops are not shared.
duke@435 962 virtual void remove_unshareable_info();
coleenp@4037 963 virtual void restore_unshareable_info(TRAPS);
duke@435 964
duke@435 965 // jvm support
duke@435 966 jint compute_modifier_flags(TRAPS) const;
duke@435 967
duke@435 968 public:
duke@435 969 // JVMTI support
duke@435 970 jint jvmti_class_status() const;
duke@435 971
duke@435 972 public:
duke@435 973 // Printing
coleenp@4037 974 #ifndef PRODUCT
coleenp@4037 975 void print_on(outputStream* st) const;
coleenp@4037 976 #endif
coleenp@4037 977 void print_value_on(outputStream* st) const;
coleenp@4037 978
jrose@1590 979 void oop_print_value_on(oop obj, outputStream* st);
coleenp@4037 980
jrose@1590 981 #ifndef PRODUCT
duke@435 982 void oop_print_on (oop obj, outputStream* st);
duke@435 983
duke@435 984 void print_dependent_nmethods(bool verbose = false);
duke@435 985 bool is_dependent_nmethod(nmethod* nm);
duke@435 986 #endif
duke@435 987
coleenp@4037 988 const char* internal_name() const;
coleenp@4037 989
duke@435 990 // Verification
coleenp@4037 991 void verify_on(outputStream* st);
coleenp@4037 992
duke@435 993 void oop_verify_on(oop obj, outputStream* st);
duke@435 994 };
duke@435 995
coleenp@4037 996 inline Method* InstanceKlass::method_at_vtable(int index) {
duke@435 997 #ifndef PRODUCT
duke@435 998 assert(index >= 0, "valid vtable index");
duke@435 999 if (DebugVtables) {
duke@435 1000 verify_vtable_index(index);
duke@435 1001 }
duke@435 1002 #endif
duke@435 1003 vtableEntry* ve = (vtableEntry*)start_of_vtable();
duke@435 1004 return ve[index].method();
duke@435 1005 }
duke@435 1006
duke@435 1007 // for adding methods
duke@435 1008 // UNSET_IDNUM return means no more ids available
coleenp@4037 1009 inline u2 InstanceKlass::next_method_idnum() {
coleenp@4037 1010 if (_idnum_allocated_count == ConstMethod::MAX_IDNUM) {
coleenp@4037 1011 return ConstMethod::UNSET_IDNUM; // no more ids available
duke@435 1012 } else {
duke@435 1013 return _idnum_allocated_count++;
duke@435 1014 }
duke@435 1015 }
duke@435 1016
duke@435 1017
duke@435 1018 /* JNIid class for jfieldIDs only */
zgu@3900 1019 class JNIid: public CHeapObj<mtClass> {
duke@435 1020 friend class VMStructs;
duke@435 1021 private:
coleenp@4037 1022 Klass* _holder;
duke@435 1023 JNIid* _next;
duke@435 1024 int _offset;
duke@435 1025 #ifdef ASSERT
duke@435 1026 bool _is_static_field_id;
duke@435 1027 #endif
duke@435 1028
duke@435 1029 public:
duke@435 1030 // Accessors
coleenp@4037 1031 Klass* holder() const { return _holder; }
duke@435 1032 int offset() const { return _offset; }
duke@435 1033 JNIid* next() { return _next; }
duke@435 1034 // Constructor
coleenp@4037 1035 JNIid(Klass* holder, int offset, JNIid* next);
duke@435 1036 // Identifier lookup
duke@435 1037 JNIid* find(int offset);
duke@435 1038
never@2658 1039 bool find_local_field(fieldDescriptor* fd) {
coleenp@4037 1040 return InstanceKlass::cast(holder())->find_local_field_from_offset(offset(), true, fd);
never@2658 1041 }
never@2658 1042
duke@435 1043 static void deallocate(JNIid* id);
duke@435 1044 // Debugging
duke@435 1045 #ifdef ASSERT
duke@435 1046 bool is_static_field_id() const { return _is_static_field_id; }
duke@435 1047 void set_is_static_field_id() { _is_static_field_id = true; }
duke@435 1048 #endif
coleenp@4037 1049 void verify(Klass* holder);
duke@435 1050 };
duke@435 1051
duke@435 1052
duke@435 1053 // If breakpoints are more numerous than just JVMTI breakpoints,
duke@435 1054 // consider compressing this data structure.
coleenp@4037 1055 // It is currently a simple linked list defined in method.hpp.
duke@435 1056
duke@435 1057 class BreakpointInfo;
duke@435 1058
duke@435 1059
duke@435 1060 // A collection point for interesting information about the previous
coleenp@4037 1061 // version(s) of an InstanceKlass. This class uses weak references to
duke@435 1062 // the information so that the information may be collected as needed
dcubed@482 1063 // by the system. If the information is shared, then a regular
dcubed@482 1064 // reference must be used because a weak reference would be seen as
dcubed@482 1065 // collectible. A GrowableArray of PreviousVersionNodes is attached
coleenp@4037 1066 // to the InstanceKlass as needed. See PreviousVersionWalker below.
zgu@3900 1067 class PreviousVersionNode : public CHeapObj<mtClass> {
duke@435 1068 private:
dcubed@482 1069 // A shared ConstantPool is never collected so we'll always have
dcubed@482 1070 // a reference to it so we can update items in the cache. We'll
dcubed@482 1071 // have a weak reference to a non-shared ConstantPool until all
dcubed@482 1072 // of the methods (EMCP or obsolete) have been collected; the
dcubed@482 1073 // non-shared ConstantPool becomes collectible at that point.
coleenp@4037 1074 ConstantPool* _prev_constant_pool; // regular or weak reference
dcubed@482 1075 bool _prev_cp_is_weak; // true if not a shared ConstantPool
dcubed@482 1076
coleenp@4037 1077 // If the previous version of the InstanceKlass doesn't have any
duke@435 1078 // EMCP methods, then _prev_EMCP_methods will be NULL. If all the
duke@435 1079 // EMCP methods have been collected, then _prev_EMCP_methods can
duke@435 1080 // have a length of zero.
coleenp@4037 1081 GrowableArray<Method*>* _prev_EMCP_methods;
duke@435 1082
duke@435 1083 public:
coleenp@4037 1084 PreviousVersionNode(ConstantPool* prev_constant_pool, bool prev_cp_is_weak,
coleenp@4037 1085 GrowableArray<Method*>* prev_EMCP_methods);
duke@435 1086 ~PreviousVersionNode();
coleenp@4037 1087 ConstantPool* prev_constant_pool() const {
duke@435 1088 return _prev_constant_pool;
duke@435 1089 }
coleenp@4037 1090 GrowableArray<Method*>* prev_EMCP_methods() const {
duke@435 1091 return _prev_EMCP_methods;
duke@435 1092 }
duke@435 1093 };
duke@435 1094
duke@435 1095
duke@435 1096 // A Handle-ized version of PreviousVersionNode.
duke@435 1097 class PreviousVersionInfo : public ResourceObj {
duke@435 1098 private:
duke@435 1099 constantPoolHandle _prev_constant_pool_handle;
coleenp@4037 1100 // If the previous version of the InstanceKlass doesn't have any
duke@435 1101 // EMCP methods, then _prev_EMCP_methods will be NULL. Since the
duke@435 1102 // methods cannot be collected while we hold a handle,
duke@435 1103 // _prev_EMCP_methods should never have a length of zero.
duke@435 1104 GrowableArray<methodHandle>* _prev_EMCP_method_handles;
duke@435 1105
duke@435 1106 public:
duke@435 1107 PreviousVersionInfo(PreviousVersionNode *pv_node);
duke@435 1108 ~PreviousVersionInfo();
duke@435 1109 constantPoolHandle prev_constant_pool_handle() const {
duke@435 1110 return _prev_constant_pool_handle;
duke@435 1111 }
duke@435 1112 GrowableArray<methodHandle>* prev_EMCP_method_handles() const {
duke@435 1113 return _prev_EMCP_method_handles;
duke@435 1114 }
duke@435 1115 };
duke@435 1116
duke@435 1117
duke@435 1118 // Helper object for walking previous versions. This helper cleans up
duke@435 1119 // the Handles that it allocates when the helper object is destroyed.
duke@435 1120 // The PreviousVersionInfo object returned by next_previous_version()
duke@435 1121 // is only valid until a subsequent call to next_previous_version() or
duke@435 1122 // the helper object is destroyed.
duke@435 1123 class PreviousVersionWalker : public StackObj {
duke@435 1124 private:
duke@435 1125 GrowableArray<PreviousVersionNode *>* _previous_versions;
duke@435 1126 int _current_index;
duke@435 1127 // Fields for cleaning up when we are done walking the previous versions:
duke@435 1128 // A HandleMark for the PreviousVersionInfo handles:
duke@435 1129 HandleMark _hm;
duke@435 1130
duke@435 1131 // It would be nice to have a ResourceMark field in this helper also,
duke@435 1132 // but the ResourceMark code says to be careful to delete handles held
duke@435 1133 // in GrowableArrays _before_ deleting the GrowableArray. Since we
duke@435 1134 // can't guarantee the order in which the fields are destroyed, we
duke@435 1135 // have to let the creator of the PreviousVersionWalker object do
duke@435 1136 // the right thing. Also, adding a ResourceMark here causes an
duke@435 1137 // include loop.
duke@435 1138
duke@435 1139 // A pointer to the current info object so we can handle the deletes.
duke@435 1140 PreviousVersionInfo * _current_p;
duke@435 1141
duke@435 1142 public:
coleenp@4037 1143 PreviousVersionWalker(InstanceKlass *ik);
duke@435 1144 ~PreviousVersionWalker();
duke@435 1145
duke@435 1146 // Return the interesting information for the next previous version
duke@435 1147 // of the klass. Returns NULL if there are no more previous versions.
duke@435 1148 PreviousVersionInfo* next_previous_version();
duke@435 1149 };
stefank@2314 1150
never@3138 1151
never@3138 1152 //
never@3138 1153 // nmethodBucket is used to record dependent nmethods for
never@3138 1154 // deoptimization. nmethod dependencies are actually <klass, method>
never@3138 1155 // pairs but we really only care about the klass part for purposes of
never@3138 1156 // finding nmethods which might need to be deoptimized. Instead of
never@3138 1157 // recording the method, a count of how many times a particular nmethod
never@3138 1158 // was recorded is kept. This ensures that any recording errors are
never@3138 1159 // noticed since an nmethod should be removed as many times are it's
never@3138 1160 // added.
never@3138 1161 //
zgu@3900 1162 class nmethodBucket: public CHeapObj<mtClass> {
never@3138 1163 friend class VMStructs;
never@3138 1164 private:
never@3138 1165 nmethod* _nmethod;
never@3138 1166 int _count;
never@3138 1167 nmethodBucket* _next;
never@3138 1168
never@3138 1169 public:
never@3138 1170 nmethodBucket(nmethod* nmethod, nmethodBucket* next) {
never@3138 1171 _nmethod = nmethod;
never@3138 1172 _next = next;
never@3138 1173 _count = 1;
never@3138 1174 }
never@3138 1175 int count() { return _count; }
never@3138 1176 int increment() { _count += 1; return _count; }
never@3138 1177 int decrement() { _count -= 1; assert(_count >= 0, "don't underflow"); return _count; }
never@3138 1178 nmethodBucket* next() { return _next; }
never@3138 1179 void set_next(nmethodBucket* b) { _next = b; }
never@3138 1180 nmethod* get_nmethod() { return _nmethod; }
never@3138 1181 };
never@3138 1182
jiangli@3670 1183 // An iterator that's used to access the inner classes indices in the
coleenp@4037 1184 // InstanceKlass::_inner_classes array.
jiangli@3670 1185 class InnerClassesIterator : public StackObj {
jiangli@3670 1186 private:
coleenp@4037 1187 Array<jushort>* _inner_classes;
jiangli@3670 1188 int _length;
jiangli@3670 1189 int _idx;
jiangli@3670 1190 public:
jiangli@3670 1191
jiangli@3670 1192 InnerClassesIterator(instanceKlassHandle k) {
jiangli@3670 1193 _inner_classes = k->inner_classes();
jiangli@3670 1194 if (k->inner_classes() != NULL) {
jiangli@3670 1195 _length = _inner_classes->length();
jiangli@3670 1196 // The inner class array's length should be the multiple of
jiangli@3670 1197 // inner_class_next_offset if it only contains the InnerClasses
jiangli@3670 1198 // attribute data, or it should be
jiangli@3670 1199 // n*inner_class_next_offset+enclosing_method_attribute_size
jiangli@3670 1200 // if it also contains the EnclosingMethod data.
coleenp@4037 1201 assert((_length % InstanceKlass::inner_class_next_offset == 0 ||
coleenp@4037 1202 _length % InstanceKlass::inner_class_next_offset == InstanceKlass::enclosing_method_attribute_size),
jiangli@3670 1203 "just checking");
jiangli@3670 1204 // Remove the enclosing_method portion if exists.
coleenp@4037 1205 if (_length % InstanceKlass::inner_class_next_offset == InstanceKlass::enclosing_method_attribute_size) {
coleenp@4037 1206 _length -= InstanceKlass::enclosing_method_attribute_size;
jiangli@3670 1207 }
jiangli@3670 1208 } else {
jiangli@3670 1209 _length = 0;
jiangli@3670 1210 }
jiangli@3670 1211 _idx = 0;
jiangli@3670 1212 }
jiangli@3670 1213
jiangli@3670 1214 int length() const {
jiangli@3670 1215 return _length;
jiangli@3670 1216 }
jiangli@3670 1217
jiangli@3670 1218 void next() {
coleenp@4037 1219 _idx += InstanceKlass::inner_class_next_offset;
jiangli@3670 1220 }
jiangli@3670 1221
jiangli@3670 1222 bool done() const {
jiangli@3670 1223 return (_idx >= _length);
jiangli@3670 1224 }
jiangli@3670 1225
jiangli@3670 1226 u2 inner_class_info_index() const {
coleenp@4037 1227 return _inner_classes->at(
coleenp@4037 1228 _idx + InstanceKlass::inner_class_inner_class_info_offset);
jiangli@3670 1229 }
jiangli@3670 1230
jiangli@3670 1231 void set_inner_class_info_index(u2 index) {
coleenp@4037 1232 _inner_classes->at_put(
coleenp@4037 1233 _idx + InstanceKlass::inner_class_inner_class_info_offset, index);
jiangli@3670 1234 }
jiangli@3670 1235
jiangli@3670 1236 u2 outer_class_info_index() const {
coleenp@4037 1237 return _inner_classes->at(
coleenp@4037 1238 _idx + InstanceKlass::inner_class_outer_class_info_offset);
jiangli@3670 1239 }
jiangli@3670 1240
jiangli@3670 1241 void set_outer_class_info_index(u2 index) {
coleenp@4037 1242 _inner_classes->at_put(
coleenp@4037 1243 _idx + InstanceKlass::inner_class_outer_class_info_offset, index);
jiangli@3670 1244 }
jiangli@3670 1245
jiangli@3670 1246 u2 inner_name_index() const {
coleenp@4037 1247 return _inner_classes->at(
coleenp@4037 1248 _idx + InstanceKlass::inner_class_inner_name_offset);
jiangli@3670 1249 }
jiangli@3670 1250
jiangli@3670 1251 void set_inner_name_index(u2 index) {
coleenp@4037 1252 _inner_classes->at_put(
coleenp@4037 1253 _idx + InstanceKlass::inner_class_inner_name_offset, index);
jiangli@3670 1254 }
jiangli@3670 1255
jiangli@3670 1256 u2 inner_access_flags() const {
coleenp@4037 1257 return _inner_classes->at(
coleenp@4037 1258 _idx + InstanceKlass::inner_class_access_flags_offset);
jiangli@3670 1259 }
jiangli@3670 1260 };
jiangli@3670 1261
stefank@2314 1262 #endif // SHARE_VM_OOPS_INSTANCEKLASS_HPP

mercurial