diff --git a/debugtools/DDR_VM/src/com/ibm/j9ddr/AuxFieldInfo29.dat b/debugtools/DDR_VM/src/com/ibm/j9ddr/AuxFieldInfo29.dat index 537d90afe92..62e530ce196 100644 --- a/debugtools/DDR_VM/src/com/ibm/j9ddr/AuxFieldInfo29.dat +++ b/debugtools/DDR_VM/src/com/ibm/j9ddr/AuxFieldInfo29.dat @@ -412,6 +412,8 @@ J9ROMClass.callSiteData = required J9ROMClass.className = required J9ROMClass.cpShapeDescription = required J9ROMClass.doubleScalarStaticCount = required +J9ROMClass.enclosedInnerClassCount = U_32 +J9ROMClass.enclosedInnerClasses = J9SRP(J9SRP(J9UTF8)) J9ROMClass.extraModifiers = required J9ROMClass.innerClassCount = required J9ROMClass.innerClasses = required diff --git a/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/RomClassWalker.java b/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/RomClassWalker.java index a7e465db330..31544bf0ac8 100644 --- a/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/RomClassWalker.java +++ b/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/RomClassWalker.java @@ -187,10 +187,24 @@ private void allSlotsInROMHeaderDo() throws CorruptDataException { srpCursor = romClass.innerClasses(); count = romClass.innerClassCount().intValue(); classWalkerCallback.addSection(clazz, srpCursor, count * SelfRelativePointer.SIZEOF, "innerClassesSRPs", true); - for (; count > 0; count--) { + for (; 0 != count; count--) { classWalkerCallback.addSlot(clazz, SlotType.J9_ROM_UTF8, srpCursor, "innerClassNameUTF8"); srpCursor = srpCursor.add(1); } + + try { + /* walk enclosed inner classes SRPs block */ + srpCursor = romClass.enclosedInnerClasses(); + count = romClass.enclosedInnerClassCount().intValue(); + classWalkerCallback.addSection(clazz, srpCursor, count * SelfRelativePointer.SIZEOF, "enclosedInnerClassesSRPs", true); + for (; 0 != count; count--) { + classWalkerCallback.addSlot(clazz, SlotType.J9_ROM_UTF8, srpCursor, "enclosedInnerClassesNameUTF8"); + srpCursor = srpCursor.add(1); + } + } catch (NoSuchFieldException e) { + // ignore: VM that generated the core dump doesn't have enclosedInnerClasses or enclosedInnerClassCount + } + /* add CP NAS section */ J9ROMMethodPointer firstMethod = romClass.romMethods(); long size = (firstMethod.getAddress() - srpCursor.getAddress()); diff --git a/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/commands/RomClassSummaryCommand.java b/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/commands/RomClassSummaryCommand.java index 7df9fe28834..8ebc8528b04 100644 --- a/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/commands/RomClassSummaryCommand.java +++ b/debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/tools/ddrinteractive/commands/RomClassSummaryCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2001, 2014 IBM Corp. and others + * Copyright (c) 2001, 2021 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -52,6 +52,7 @@ public class RomClassSummaryCommand extends Command "fields", "interfacesSRPs", "innerClassesSRPs", + "enclosedInnerClassesSRPs", "cpNamesAndSignaturesSRPs", "methods", "cpShapeDescription", diff --git a/runtime/ddr/overrides-vm b/runtime/ddr/overrides-vm index 7d6dea3f286..cdbdac05fe7 100644 --- a/runtime/ddr/overrides-vm +++ b/runtime/ddr/overrides-vm @@ -88,6 +88,7 @@ typeoverride.J9EnclosingObject.nameAndSignature=J9SRP(J9ROMNameAndSignature) typeoverride.J9ROMClass.className=J9SRP(J9UTF8) typeoverride.J9ROMClass.cpShapeDescription=J9SRP(U32) +typeoverride.J9ROMClass.enclosedInnerClasses=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMClass.innerClasses=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMClass.interfaces=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMClass.intermediateClassData=J9WSRP(U_8) @@ -101,6 +102,7 @@ typeoverride.J9ROMClass.superclassName=J9SRP(J9UTF8) typeoverride.J9ROMArrayClass.className=J9SRP(J9UTF8) typeoverride.J9ROMArrayClass.cpShapeDescription=J9SRP(U32) +typeoverride.J9ROMArrayClass.enclosedInnerClasses=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMArrayClass.innerClasses=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMArrayClass.interfaces=J9SRP(J9SRP(J9UTF8)) typeoverride.J9ROMArrayClass.intermediateClassData=J9WSRP(U_8) diff --git a/runtime/ddr/vmddrstructs.properties b/runtime/ddr/vmddrstructs.properties index a4a3c88f678..b2a3b729029 100644 --- a/runtime/ddr/vmddrstructs.properties +++ b/runtime/ddr/vmddrstructs.properties @@ -166,6 +166,7 @@ ddrblob.typeoverride.J9EnclosingObject.nameAndSignature=J9SRP(struct J9ROMNameAn ddrblob.typeoverride.J9ROMClass.className=J9SRP(struct J9UTF8) ddrblob.typeoverride.J9ROMClass.cpShapeDescription=J9SRP(U32) +ddrblob.typeoverride.J9ROMClass.enclosedInnerClasses=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMClass.innerClasses=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMClass.interfaces=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMClass.optionalInfo=J9SRP(U32) @@ -179,6 +180,7 @@ ddrblob.typeoverride.J9ROMClass.specialSplitMethodRefIndexes=J9SRP(U16) ddrblob.typeoverride.J9ROMArrayClass.className=J9SRP(struct J9UTF8) ddrblob.typeoverride.J9ROMArrayClass.cpShapeDescription=J9SRP(U32) +ddrblob.typeoverride.J9ROMArrayClass.enclosedInnerClasses=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMArrayClass.innerClasses=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMArrayClass.interfaces=J9SRP(J9SRP(struct J9UTF8)) ddrblob.typeoverride.J9ROMArrayClass.optionalInfo=J9SRP(U32) diff --git a/runtime/util/romclasswalk.c b/runtime/util/romclasswalk.c index 9e051eb5954..6b8d825cd0d 100644 --- a/runtime/util/romclasswalk.c +++ b/runtime/util/romclasswalk.c @@ -167,7 +167,7 @@ void allSlotsInROMClassDo(J9ROMClass* romClass, rangeValid = callbacks->validateRangeCallback(romClass, srpCursor, count * sizeof(J9SRP), userData); if (rangeValid) { callbacks->sectionCallback(romClass, srpCursor, count * sizeof(J9SRP), "interfacesSRPs", userData); - for (; count > 0; count--) { + for (; 0 != count; count--) { callbacks->slotCallback(romClass, J9ROM_UTF8, srpCursor++, "interfaceUTF8", userData); } } @@ -178,11 +178,22 @@ void allSlotsInROMClassDo(J9ROMClass* romClass, rangeValid = callbacks->validateRangeCallback(romClass, srpCursor, count * sizeof(J9SRP), userData); if (rangeValid) { callbacks->sectionCallback(romClass, srpCursor, count * sizeof(J9SRP), "innerClassesSRPs", userData); - for (; count > 0; count--) { + for (; 0 != count; count--) { callbacks->slotCallback(romClass, J9ROM_UTF8, srpCursor++, "innerClassNameUTF8", userData); } } + /* walk enclosed inner classes SRPs block */ + srpCursor = J9ROMCLASS_ENCLOSEDINNERCLASSES(romClass); + count = romClass->enclosedInnerClassCount; + rangeValid = callbacks->validateRangeCallback(romClass, srpCursor, count * sizeof(J9SRP), userData); + if (rangeValid) { + callbacks->sectionCallback(romClass, srpCursor, count * sizeof(J9SRP), "enclosedInnerClassesSRPs", userData); + for (; 0 != count; count--) { + callbacks->slotCallback(romClass, J9ROM_UTF8, srpCursor++, "enclosedInnerClassesNameUTF8", userData); + } + } + #if JAVA_SPEC_VERSION >= 11 /* walk nest members SRPs block */ if (0 != romClass->nestMemberCount) { @@ -191,7 +202,7 @@ void allSlotsInROMClassDo(J9ROMClass* romClass, rangeValid = callbacks->validateRangeCallback(romClass, srpCursor, count * sizeof(J9SRP), userData); if (rangeValid) { callbacks->sectionCallback(romClass, srpCursor, count * sizeof(J9SRP), "nestMembersSRPs", userData); - for (; count > 0; count--) { + for (; 0 != count; count--) { callbacks->slotCallback(romClass, J9ROM_UTF8, srpCursor++, "nestMemberUTF8", userData); } }