8312623: SA add NestHost and NestMembers attributes when dumping class
Reviewed-by: cjplummer, sspitsyn, stuefe
This commit is contained in:
parent
017e0c7850
commit
873d117932
@ -237,6 +237,7 @@
|
||||
nonstatic_field(InstanceKlass, _constants, ConstantPool*) \
|
||||
nonstatic_field(InstanceKlass, _source_debug_extension, const char*) \
|
||||
nonstatic_field(InstanceKlass, _inner_classes, Array<jushort>*) \
|
||||
nonstatic_field(InstanceKlass, _nest_members, Array<jushort>*) \
|
||||
nonstatic_field(InstanceKlass, _nonstatic_field_size, int) \
|
||||
nonstatic_field(InstanceKlass, _static_field_size, int) \
|
||||
nonstatic_field(InstanceKlass, _static_oop_field_count, u2) \
|
||||
@ -244,6 +245,7 @@
|
||||
volatile_nonstatic_field(InstanceKlass, _init_state, InstanceKlass::ClassState) \
|
||||
volatile_nonstatic_field(InstanceKlass, _init_thread, JavaThread*) \
|
||||
nonstatic_field(InstanceKlass, _itable_len, int) \
|
||||
nonstatic_field(InstanceKlass, _nest_host_index, u2) \
|
||||
nonstatic_field(InstanceKlass, _reference_type, u1) \
|
||||
volatile_nonstatic_field(InstanceKlass, _oop_map_cache, OopMapCache*) \
|
||||
nonstatic_field(InstanceKlass, _jni_ids, JNIid*) \
|
||||
|
@ -77,12 +77,14 @@ public class InstanceKlass extends Klass {
|
||||
constants = new MetadataField(type.getAddressField("_constants"), 0);
|
||||
sourceDebugExtension = type.getAddressField("_source_debug_extension");
|
||||
innerClasses = type.getAddressField("_inner_classes");
|
||||
nestMembers = type.getAddressField("_nest_members");
|
||||
nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
|
||||
staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), 0);
|
||||
staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
|
||||
nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
|
||||
initState = new CIntField(type.getCIntegerField("_init_state"), 0);
|
||||
itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0);
|
||||
nestHostIndex = new CIntField(type.getCIntegerField("_nest_host_index"), 0);
|
||||
if (VM.getVM().isJvmtiSupported()) {
|
||||
breakpoints = type.getAddressField("_breakpoints");
|
||||
}
|
||||
@ -142,12 +144,14 @@ public class InstanceKlass extends Klass {
|
||||
private static MetadataField constants;
|
||||
private static AddressField sourceDebugExtension;
|
||||
private static AddressField innerClasses;
|
||||
private static AddressField nestMembers;
|
||||
private static CIntField nonstaticFieldSize;
|
||||
private static CIntField staticFieldSize;
|
||||
private static CIntField staticOopFieldCount;
|
||||
private static CIntField nonstaticOopMapSize;
|
||||
private static CIntField initState;
|
||||
private static CIntField itableLen;
|
||||
private static CIntField nestHostIndex;
|
||||
private static AddressField breakpoints;
|
||||
|
||||
// type safe enum for ClassState from instanceKlass.hpp
|
||||
@ -374,6 +378,7 @@ public class InstanceKlass extends Klass {
|
||||
public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
|
||||
public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); }
|
||||
public long getItableLen() { return itableLen.getValue(this); }
|
||||
public short getNestHostIndex() { return (short) nestHostIndex.getValue(this); }
|
||||
public long majorVersion() { return getConstants().majorVersion(); }
|
||||
public long minorVersion() { return getConstants().minorVersion(); }
|
||||
public Symbol getGenericSignature() { return getConstants().getGenericSignature(); }
|
||||
@ -900,6 +905,11 @@ public class InstanceKlass extends Klass {
|
||||
}
|
||||
}
|
||||
|
||||
public U2Array getNestMembers() {
|
||||
Address addr = getAddress().getAddressAt(nestMembers.getOffset());
|
||||
return VMObjectFactory.newObject(U2Array.class, addr);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Internals only below this point
|
||||
//
|
||||
|
@ -52,6 +52,8 @@ public class ClassWriter implements /* imports */ ClassConstants
|
||||
|
||||
protected short _sourceFileIndex;
|
||||
protected short _innerClassesIndex;
|
||||
protected short _nestHostIndex;
|
||||
protected short _nestMembersIndex;
|
||||
protected short _syntheticIndex;
|
||||
protected short _deprecatedIndex;
|
||||
protected short _constantValueIndex;
|
||||
@ -143,6 +145,14 @@ public class ClassWriter implements /* imports */ ClassConstants
|
||||
_innerClassesIndex = (innerClassesIndex != null)? innerClassesIndex.shortValue() : 0;
|
||||
if (DEBUG) debugMessage("InnerClasses index = " + _innerClassesIndex);
|
||||
|
||||
Short nestHostIndex = utf8ToIndex.get("NestHost");
|
||||
_nestHostIndex = (nestHostIndex != null)? nestHostIndex.shortValue() : 0;
|
||||
if (DEBUG) debugMessage("NestHost index = " + _nestHostIndex);
|
||||
|
||||
Short nestMembersIndex = utf8ToIndex.get("NestMembers");
|
||||
_nestMembersIndex = (nestMembersIndex != null)? nestMembersIndex.shortValue() : 0;
|
||||
if (DEBUG) debugMessage("NestMembers index = " + _nestMembersIndex);
|
||||
|
||||
Short bootstrapMethodsIndex = utf8ToIndex.get("BootstrapMethods");
|
||||
_bootstrapMethodsIndex = (bootstrapMethodsIndex != null) ? bootstrapMethodsIndex.shortValue() : 0;
|
||||
// field attributes
|
||||
@ -780,6 +790,17 @@ public class ClassWriter implements /* imports */ ClassConstants
|
||||
if (numInnerClasses != 0)
|
||||
classAttributeCount++;
|
||||
|
||||
short nestHost = klass.getNestHostIndex();
|
||||
if (nestHost != 0) {
|
||||
classAttributeCount++;
|
||||
}
|
||||
|
||||
U2Array nestMembers = klass.getNestMembers();
|
||||
final int numNestMembers = nestMembers.length();
|
||||
if (numNestMembers != 0) {
|
||||
classAttributeCount++;
|
||||
}
|
||||
|
||||
int bsmCount = klass.getConstants().getBootstrapMethodsCount();
|
||||
if (bsmCount != 0) {
|
||||
classAttributeCount++;
|
||||
@ -835,6 +856,23 @@ public class ClassWriter implements /* imports */ ClassConstants
|
||||
}
|
||||
}
|
||||
|
||||
if (nestHost != 0) {
|
||||
writeIndex(_nestHostIndex);
|
||||
final int nestHostAttrLen = 2;
|
||||
dos.writeInt(nestHostAttrLen);
|
||||
dos.writeShort(nestHost);
|
||||
}
|
||||
|
||||
if (numNestMembers != 0) {
|
||||
writeIndex(_nestMembersIndex);
|
||||
final int nestMembersAttrLen = 2 + numNestMembers * 2;
|
||||
dos.writeInt(nestMembersAttrLen);
|
||||
dos.writeShort(numNestMembers);
|
||||
for (int index = 0; index < numNestMembers; index++) {
|
||||
dos.writeShort(nestMembers.at(index));
|
||||
}
|
||||
}
|
||||
|
||||
// write bootstrap method attribute, if any
|
||||
if (bsmCount != 0) {
|
||||
ConstantPool cpool = klass.getConstants();
|
||||
|
Loading…
Reference in New Issue
Block a user