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