src/share/vm/oops/instanceKlass.hpp
Print this page
@@ -186,11 +186,21 @@
// This is only non-null for an anonymous class (JSR 292 enabled).
// The host class is either named, or a previously loaded anonymous class.
klassOop _host_klass;
// Class signers.
objArrayOop _signers;
- // inner_classes attribute.
+ // The InnerClasses attribute and EnclosingMethod attribute. The
+ // _inner_classes is an array of shorts. If the class has InnerClasses
+ // attribute, then the _inner_classes array begins with 4-tuples of shorts
+ // [inner_class_info_index, outer_class_info_index,
+ // inner_name_index, inner_class_access_flags] for the InnerClasses
+ // attribute. If the EnclosingMethod attribute exists, it occupies the
+ // last two shorts [class_index, method_index] of the array. If only
+ // the InnerClasses attribute exists, the _inner_classes array length is
+ // number_of_inner_classes * 4. If the class has both InnerClasses
+ // and EnclosingMethod attributes the _inner_classes array length is
+ // number_of_inner_classes * 4 + enclosing_method_attribute_size.
typeArrayOop _inner_classes;
// Implementors of this interface (not valid if it overflows)
klassOop _implementors[implementors_limit];
// Annotations for this class, or null if none.
typeArrayOop _class_annotations;
@@ -249,12 +259,10 @@
BreakpointInfo* _breakpoints; // bpt lists, managed by methodOop
int _nof_implementors; // No of implementors of this interface (zero if not an interface)
// Array of interesting part(s) of the previous version(s) of this
// instanceKlass. See PreviousVersionWalker below.
GrowableArray<PreviousVersionNode *>* _previous_versions;
- u2 _enclosing_method_class_index; // Constant pool index for class of enclosing method, or 0 if none
- u2 _enclosing_method_method_index; // Constant pool index for name and type of enclosing method, or 0 if none
// JVMTI fields can be moved to their own structure - see 6315920
unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH
jint _cached_class_file_len; // JVMTI: length of above
JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration
volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change
@@ -349,10 +357,16 @@
inner_class_inner_name_offset = 2,
inner_class_access_flags_offset = 3,
inner_class_next_offset = 4
};
+ enum EnclosingMethodAttributeOffset {
+ enclosing_method_class_index_offset = 0,
+ enclosing_method_method_index_offset = 1,
+ enclosing_method_attribute_size = 2
+ };
+
// method override check
bool is_override(methodHandle super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS);
// package
bool is_same_class_package(klassOop class2);
@@ -531,15 +545,19 @@
// generics support
Symbol* generic_signature() const { return _generic_signature; }
void set_generic_signature(Symbol* sig) { _generic_signature = sig; }
- u2 enclosing_method_class_index() const { return _enclosing_method_class_index; }
- u2 enclosing_method_method_index() const { return _enclosing_method_method_index; }
+ u2 enclosing_method_data(int offset);
+ u2 enclosing_method_class_index() {
+ return enclosing_method_data(enclosing_method_class_index_offset);
+ }
+ u2 enclosing_method_method_index() {
+ return enclosing_method_data(enclosing_method_method_index_offset);
+ }
void set_enclosing_method_indices(u2 class_index,
- u2 method_index) { _enclosing_method_class_index = class_index;
- _enclosing_method_method_index = method_index; }
+ u2 method_index);
// jmethodID support
static jmethodID get_jmethod_id(instanceKlassHandle ik_h,
methodHandle method_h);
static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h,