changeset 57737:8e76f81d057a

8225054: Compiler implementation for records 8225052: javax.lang.model support for records 8225053: Preview APIs support for records 8225055: Javadoc for records 8226314: com.sun.source support for records 8227113: Specification for java.lang.Record 8233526: JVM support for records Summary: implement records in the compiler and the JVM, including serialization, reflection and APIs support Reviewed-by: mcimadamore, briangoetz, alanb, darcy, chegar, jrose, jlahoda, coleenp, dholmes, lfoltan, mchung, sadayapalam, hannesw, sspitsyn Contributed-by: vicente.romero@oracle.com, brian.goetz@oracle.com, maurizio.cimadamore@oracle.com, harold.seigel@oracle.com, joe.darcy@oracle.com, jonathan.gibbons@oracle.com, chris.hegarty@oracle.com, jan.lahoda@oracle.com
author vromero
date Wed, 04 Dec 2019 15:57:39 -0500
parents 8a8c60853789
children c22583a70542
files make/CompileInterimLangtools.gmk make/hotspot/symbols/symbols-unix src/hotspot/share/classfile/classFileParser.cpp src/hotspot/share/classfile/classFileParser.hpp src/hotspot/share/classfile/javaClasses.cpp src/hotspot/share/classfile/javaClasses.hpp src/hotspot/share/classfile/systemDictionary.hpp src/hotspot/share/classfile/vmSymbols.hpp src/hotspot/share/include/jvm.h src/hotspot/share/logging/logTag.hpp src/hotspot/share/memory/allocation.hpp src/hotspot/share/memory/heapInspection.hpp src/hotspot/share/memory/metaspaceShared.cpp src/hotspot/share/oops/instanceKlass.cpp src/hotspot/share/oops/instanceKlass.hpp src/hotspot/share/oops/recordComponent.cpp src/hotspot/share/oops/recordComponent.hpp src/hotspot/share/prims/jvm.cpp src/hotspot/share/prims/jvmti.xml src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp src/hotspot/share/prims/jvmtiClassFileReconstituter.hpp src/hotspot/share/prims/jvmtiRedefineClasses.cpp src/hotspot/share/prims/jvmtiRedefineClasses.hpp src/java.base/share/classes/java/io/ObjectInputStream.java src/java.base/share/classes/java/io/ObjectOutputStream.java src/java.base/share/classes/java/io/ObjectStreamClass.java src/java.base/share/classes/java/lang/Class.java src/java.base/share/classes/java/lang/Record.java src/java.base/share/classes/java/lang/annotation/ElementType.java src/java.base/share/classes/java/lang/reflect/RecordComponent.java src/java.base/share/classes/java/lang/runtime/ObjectMethods.java src/java.base/share/classes/java/lang/runtime/package-info.java src/java.base/share/classes/jdk/internal/PreviewFeature.java src/java.base/share/classes/module-info.java src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java src/java.base/share/native/libjava/Class.c src/java.compiler/share/classes/javax/annotation/processing/RoundEnvironment.java src/java.compiler/share/classes/javax/lang/model/element/Element.java src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java src/java.compiler/share/classes/javax/lang/model/element/package-info.java src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor9.java src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor9.java src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java src/java.compiler/share/classes/javax/lang/model/util/ElementScanner6.java src/java.compiler/share/classes/javax/lang/model/util/ElementScanner7.java src/java.compiler/share/classes/javax/lang/model/util/ElementScanner8.java src/java.compiler/share/classes/javax/lang/model/util/ElementScanner9.java src/java.compiler/share/classes/javax/lang/model/util/Elements.java src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor9.java src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor9.java src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor9.java src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor14.java src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor6.java src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor7.java src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor8.java src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor9.java src/java.instrument/share/native/libinstrument/JavaExceptions.c src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Kinds.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Source.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/SymbolMetadata.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrContext.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java src/jdk.compiler/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java src/jdk.compiler/share/classes/com/sun/tools/javac/util/Dependencies.java src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PubapiVisitor.java src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubApi.java src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/TypeDesc.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ClassWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/CommentUtils.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PackageSummaryWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Resources.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ClassBuilder.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PackageSummaryBuilder.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/SerializedFormBuilder.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ParamTaglet.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/TagletManager.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/TagletWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassUseMapper.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/CommentHelper.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/TypeElementCatalog.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberTable.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocMemberEnter.java src/jdk.jdeps/share/classes/com/sun/tools/classfile/Attribute.java src/jdk.jdeps/share/classes/com/sun/tools/classfile/ClassWriter.java src/jdk.jdeps/share/classes/com/sun/tools/classfile/Record_attribute.java src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java src/jdk.jshell/share/classes/jdk/jshell/CompletenessAnalyzer.java src/jdk.jshell/share/classes/jdk/jshell/ReplParser.java test/hotspot/jtreg/runtime/records/RedefineRecord.java test/hotspot/jtreg/runtime/records/TEST.properties test/hotspot/jtreg/runtime/records/abstractRecord.jcod test/hotspot/jtreg/runtime/records/badRecordAttribute.jcod test/hotspot/jtreg/runtime/records/ignoreRecordAttribute.java test/hotspot/jtreg/runtime/records/notFinalRecord.jcod test/hotspot/jtreg/runtime/records/oldRecordAttribute.jcod test/hotspot/jtreg/runtime/records/recordAttributeTest.java test/hotspot/jtreg/runtime/records/recordIgnoredVersion.jcod test/hotspot/jtreg/runtime/records/recordReflectionTest.java test/hotspot/jtreg/runtime/records/shortRecordAttribute.jcod test/hotspot/jtreg/runtime/records/superNotJLRecord.jcod test/hotspot/jtreg/runtime/records/twoRecordAttributes.jcod test/jdk/ProblemList.txt test/jdk/java/io/Serializable/records/AbsentStreamValuesTest.java test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java test/jdk/java/io/Serializable/records/BadValues.java test/jdk/java/io/Serializable/records/BasicRecordSer.java test/jdk/java/io/Serializable/records/ConstructorAccessTest.java test/jdk/java/io/Serializable/records/ConstructorPermissionTest.java test/jdk/java/io/Serializable/records/CycleTest.java test/jdk/java/io/Serializable/records/ProhibitedMethods.java test/jdk/java/io/Serializable/records/ReadResolveTest.java test/jdk/java/io/Serializable/records/RecordClassTest.java test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java test/jdk/java/io/Serializable/records/SerialVersionUIDTest.java test/jdk/java/io/Serializable/records/StreamRefTest.java test/jdk/java/io/Serializable/records/TEST.properties test/jdk/java/io/Serializable/records/ThrowingConstructorTest.java test/jdk/java/io/Serializable/records/WriteReplaceTest.java test/jdk/java/io/Serializable/records/empty_security.policy test/jdk/java/io/Serializable/records/migration/AbstractTest.java test/jdk/java/io/Serializable/records/migration/AssignableFrom.java test/jdk/java/io/Serializable/records/migration/AssignableFromTest.java test/jdk/java/io/Serializable/records/migration/DefaultValues.java test/jdk/java/io/Serializable/records/migration/DefaultValuesTest.java test/jdk/java/io/Serializable/records/migration/Point.java test/jdk/java/io/Serializable/records/migration/SuperStreamFields.java test/jdk/java/io/Serializable/records/migration/SuperStreamFieldsTest.java test/jdk/java/io/Serializable/records/migration/plain/AssignableFromImpl.java test/jdk/java/io/Serializable/records/migration/plain/DefaultValuesImpl.java test/jdk/java/io/Serializable/records/migration/plain/PointImpl.java test/jdk/java/io/Serializable/records/migration/plain/SuperStreamFieldsImpl.java test/jdk/java/io/Serializable/records/migration/record/AssignableFromImpl.java test/jdk/java/io/Serializable/records/migration/record/DefaultValuesImpl.java test/jdk/java/io/Serializable/records/migration/record/PointImpl.java test/jdk/java/io/Serializable/records/migration/record/SuperStreamFieldsImpl.java test/jdk/java/lang/Runtime/Resources.java test/jdk/java/lang/Runtime/Version/Basic.java test/jdk/java/lang/Runtime/Version/VersionProps.java test/jdk/java/lang/Runtime/exec/ArgWithSpaceAndFinalBackslash.java test/jdk/java/lang/Runtime/exec/BadEnvp.java test/jdk/java/lang/Runtime/exec/ConcurrentRead.java test/jdk/java/lang/Runtime/exec/Duped.java test/jdk/java/lang/Runtime/exec/ExecCommand.java test/jdk/java/lang/Runtime/exec/ExecEmptyString.java test/jdk/java/lang/Runtime/exec/ExecWithDir.java test/jdk/java/lang/Runtime/exec/ExecWithInput.java test/jdk/java/lang/Runtime/exec/ExecWithLotsOfArgs.java test/jdk/java/lang/Runtime/exec/ExitValue.java test/jdk/java/lang/Runtime/exec/LotsOfDestroys.java test/jdk/java/lang/Runtime/exec/LotsOfOutput.java test/jdk/java/lang/Runtime/exec/SetCwd.java test/jdk/java/lang/Runtime/exec/SleepyCat.java test/jdk/java/lang/Runtime/exec/Space.java test/jdk/java/lang/Runtime/exec/Status.java test/jdk/java/lang/Runtime/exec/StreamsSurviveDestroy.java test/jdk/java/lang/Runtime/exec/UnixCommands.java test/jdk/java/lang/Runtime/exec/WinCommand.java test/jdk/java/lang/Runtime/exec/setcwd.sh test/jdk/java/lang/Runtime/loadLibrary/LoadLibraryTest.java test/jdk/java/lang/Runtime/loadLibrary/src/Target.java test/jdk/java/lang/Runtime/loadLibrary/src/Target2.java test/jdk/java/lang/Runtime/shutdown/Basic.java test/jdk/java/lang/Runtime/shutdown/ShutdownHooks.java test/jdk/java/lang/Runtime/shutdown/ShutdownHooks.sh test/jdk/java/lang/Runtime/shutdown/ShutdownInterruptedMain.java test/jdk/java/lang/RuntimeTests/Resources.java test/jdk/java/lang/RuntimeTests/Version/Basic.java test/jdk/java/lang/RuntimeTests/Version/VersionProps.java test/jdk/java/lang/RuntimeTests/exec/ArgWithSpaceAndFinalBackslash.java test/jdk/java/lang/RuntimeTests/exec/BadEnvp.java test/jdk/java/lang/RuntimeTests/exec/ConcurrentRead.java test/jdk/java/lang/RuntimeTests/exec/Duped.java test/jdk/java/lang/RuntimeTests/exec/ExecCommand.java test/jdk/java/lang/RuntimeTests/exec/ExecEmptyString.java test/jdk/java/lang/RuntimeTests/exec/ExecWithDir.java test/jdk/java/lang/RuntimeTests/exec/ExecWithInput.java test/jdk/java/lang/RuntimeTests/exec/ExecWithLotsOfArgs.java test/jdk/java/lang/RuntimeTests/exec/ExitValue.java test/jdk/java/lang/RuntimeTests/exec/LotsOfDestroys.java test/jdk/java/lang/RuntimeTests/exec/LotsOfOutput.java test/jdk/java/lang/RuntimeTests/exec/SetCwd.java test/jdk/java/lang/RuntimeTests/exec/SleepyCat.java test/jdk/java/lang/RuntimeTests/exec/Space.java test/jdk/java/lang/RuntimeTests/exec/Status.java test/jdk/java/lang/RuntimeTests/exec/StreamsSurviveDestroy.java test/jdk/java/lang/RuntimeTests/exec/UnixCommands.java test/jdk/java/lang/RuntimeTests/exec/WinCommand.java test/jdk/java/lang/RuntimeTests/exec/setcwd.sh test/jdk/java/lang/RuntimeTests/loadLibrary/LoadLibraryTest.java test/jdk/java/lang/RuntimeTests/loadLibrary/src/Target.java test/jdk/java/lang/RuntimeTests/loadLibrary/src/Target2.java test/jdk/java/lang/RuntimeTests/shutdown/Basic.java test/jdk/java/lang/RuntimeTests/shutdown/ShutdownHooks.java test/jdk/java/lang/RuntimeTests/shutdown/ShutdownHooks.sh test/jdk/java/lang/RuntimeTests/shutdown/ShutdownInterruptedMain.java test/jdk/java/lang/instrument/RedefineRecordAttr/Host/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/Host/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostA/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostA/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostAB/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostAB/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostABC/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostABC/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostABCD/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostABD/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostAC/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostACB/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostB/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostBA/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostBAC/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostBCA/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostCAB/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/HostCBA/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttr/TestRecordAttr.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/Host/Host.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/Host/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/HostA/Host.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/HostA/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/HostB/redef/Host.java test/jdk/java/lang/instrument/RedefineRecordAttrGenericSig/TestRecordAttrGenericSig.java test/jdk/java/lang/instrument/TEST.properties test/jdk/java/lang/reflect/records/RecordReflectionTest.java test/jdk/java/lang/reflect/records/TEST.properties test/jdk/java/lang/runtime/ObjectMethodsTest.java test/jdk/java/lang/runtime/TEST.properties test/jdk/java/lang/runtime/empty.policy test/jdk/jdk/modules/etc/JdkQualifiedExportTest.java test/langtools/ProblemList.txt test/langtools/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/AnnotatedBinaryNode.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/BinaryNode.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/Coords.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/Holder.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/Node.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/NonNull.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/Point.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/SerializablePoint.java test/langtools/jdk/javadoc/doclet/testRecordTypes/examples/SerializableProxy.java test/langtools/jdk/javadoc/doclet/testRecordTypes/jdk11/element-list test/langtools/jdk/javadoc/lib/javadoc/tester/JavadocTester.java test/langtools/jdk/javadoc/tool/api/basic/GetTask_DiagListenerTest.java test/langtools/jdk/javadoc/tool/modules/ModuleTestBase.java test/langtools/jdk/javadoc/tool/reporter_generates_warnings/pkg/MyDoclet.java test/langtools/jdk/jshell/CompletenessTest.java test/langtools/lib/annotations/annotations/classfile/ClassfileInspector.java test/langtools/lib/combo/tools/javac/combo/CompilationTestCase.java test/langtools/lib/combo/tools/javac/combo/Diagnostics.java test/langtools/lib/combo/tools/javac/combo/JavacTemplateTestBase.java test/langtools/lib/combo/tools/javac/combo/Template.java test/langtools/lib/combo/tools/javac/combo/TemplateTest.java test/langtools/tools/javac/6402516/CheckLocalElements.java test/langtools/tools/javac/MethodParameters/AttributeVisitor.java test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer.java test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer2.java test/langtools/tools/javac/annotations/repeatingAnnotations/combo/TargetAnnoCombo.java test/langtools/tools/javac/diags/examples/AccessorCantBeGeneric.java test/langtools/tools/javac/diags/examples/AccessorCantThrowException.java test/langtools/tools/javac/diags/examples/AccessorMethodCantBeStatic.java test/langtools/tools/javac/diags/examples/AccessorReturnTypeDoesntMatch.java test/langtools/tools/javac/diags/examples/CanonicalCantInvokeOtherConstructor.java test/langtools/tools/javac/diags/examples/CanonicalConstructorArgumentMismatch.java test/langtools/tools/javac/diags/examples/CanonicalConstructorCantHaveReturn.java test/langtools/tools/javac/diags/examples/CanonicalConstructorCantHaveThrowsClause.java test/langtools/tools/javac/diags/examples/CanonicalConstructorMustBePublic.java test/langtools/tools/javac/diags/examples/CanonicalMustNotDeclareTypeVariables.java test/langtools/tools/javac/diags/examples/ConstructorWithSameErasureAsCanonical.java test/langtools/tools/javac/diags/examples/FirstInvocationMustBeAnotherConstructor.java test/langtools/tools/javac/diags/examples/IllegalRecordComponentName.java test/langtools/tools/javac/diags/examples/IllegalStartOfStmt.java test/langtools/tools/javac/diags/examples/InstanceInitializersNotAllowedInRecords.java test/langtools/tools/javac/diags/examples/InvalidSuperTypeRecord.java test/langtools/tools/javac/diags/examples/KindnameRecord.java test/langtools/tools/javac/diags/examples/MethodMustBePublic.java test/langtools/tools/javac/diags/examples/Records.java test/langtools/tools/javac/diags/examples/RecordsCanNotDeclareInstanceFields.java test/langtools/tools/javac/diags/examples/RecordsCantDeclareComponentModifiers.java test/langtools/tools/javac/diags/examples/RecordsNotAllowedInInnerClasses.java test/langtools/tools/javac/expswitch/ExpSwitchNestingTest.java test/langtools/tools/javac/importscope/T8193717.java test/langtools/tools/javac/lambda/bridge/template_tests/BridgeMethodTestCase.java test/langtools/tools/javac/lib/JavacTestingAbstractProcessor.java test/langtools/tools/javac/modules/AnnotationProcessing.java test/langtools/tools/javac/options/BCPOrSystemNotSpecified.java test/langtools/tools/javac/parser/extend/TrialParser.java test/langtools/tools/javac/patterns/scope/ScopeTest.java test/langtools/tools/javac/processing/model/TestSourceVersion.java test/langtools/tools/javac/processing/model/TestSymtabItems.java test/langtools/tools/javac/processing/model/element/AnnoProcessorOnRecordsTest.java test/langtools/tools/javac/processing/model/element/CheckingTypeAnnotationsOnRecords.java test/langtools/tools/javac/processing/model/element/JavaxLangModelForRecords.java test/langtools/tools/javac/processing/model/element/TestElementKindPredicates.java test/langtools/tools/javac/processing/model/element/TestRecord.java test/langtools/tools/javac/processing/model/element/TestRecordDesugar.java test/langtools/tools/javac/processing/model/util/TestTypeKindVisitors.java test/langtools/tools/javac/records/MapAccessorToComponent.java test/langtools/tools/javac/records/RecordCompilationTests.java test/langtools/tools/javac/records/RecordMemberTests.java test/langtools/tools/javac/records/VarargsRecordsTest.java test/langtools/tools/javac/records/mandated_members/CheckRecordMembers.java test/langtools/tools/javac/records/mandated_members/read_resolve_method/CheckReadResolveMethodTest.java test/langtools/tools/javac/records/writeread/Record.java test/langtools/tools/javac/records/writeread/WriteReadTest.java test/langtools/tools/javac/tree/JavacTreeScannerTest.java test/langtools/tools/javac/tree/SourceTreeScannerTest.java test/langtools/tools/javac/tree/TreeKindTest.java test/langtools/tools/jdeps/listdeps/ListModuleDeps.java test/langtools/tools/lib/toolbox/ToolBox.java test/lib/jdk/test/lib/ByteCodeLoader.java
diffstat 381 files changed, 28463 insertions(+), 9900 deletions(-) [+]
line wrap: on
line diff
--- a/make/CompileInterimLangtools.gmk	Wed Dec 04 21:40:08 2019 +0100
+++ b/make/CompileInterimLangtools.gmk	Wed Dec 04 15:57:39 2019 -0500
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -80,6 +80,7 @@
       ADD_JAVAC_FLAGS := --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \
           $$(INTERIM_LANGTOOLS_ADD_EXPORTS) \
           --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \
+          --add-exports java.base/jdk.internal=java.compiler.interim \
           --add-exports java.base/jdk.internal=jdk.compiler.interim \
           -Xlint:-module, \
   ))
--- a/make/hotspot/symbols/symbols-unix	Wed Dec 04 21:40:08 2019 +0100
+++ b/make/hotspot/symbols/symbols-unix	Wed Dec 04 15:57:39 2019 -0500
@@ -122,6 +122,7 @@
 JVM_GetPrimitiveArrayElement
 JVM_GetProperties
 JVM_GetProtectionDomain
+JVM_GetRecordComponents
 JVM_GetSimpleBinaryName
 JVM_GetStackAccessControlContext
 JVM_GetSystemPackage
@@ -143,6 +144,7 @@
 JVM_IsConstructorIx
 JVM_IsInterface
 JVM_IsPrimitiveClass
+JVM_IsRecord
 JVM_IsSameClassPackage
 JVM_IsSupportedJNIVersion
 JVM_IsThreadAlive
--- a/src/hotspot/share/classfile/classFileParser.cpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/classFileParser.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -55,6 +55,7 @@
 #include "oops/metadata.hpp"
 #include "oops/method.inline.hpp"
 #include "oops/oop.inline.hpp"
+#include "oops/recordComponent.hpp"
 #include "oops/symbol.hpp"
 #include "prims/jvmtiExport.hpp"
 #include "prims/jvmtiThreadState.hpp"
@@ -3211,6 +3212,173 @@
   return length;
 }
 
+//  Record {
+//    u2 attribute_name_index;
+//    u4 attribute_length;
+//    u2 components_count;
+//    component_info components[components_count];
+//  }
+//  component_info {
+//    u2 name_index;
+//    u2 descriptor_index
+//    u2 attributes_count;
+//    attribute_info_attributes[attributes_count];
+//  }
+u2 ClassFileParser::parse_classfile_record_attribute(const ClassFileStream* const cfs,
+                                                     const ConstantPool* cp,
+                                                     const u1* const record_attribute_start,
+                                                     TRAPS) {
+  const u1* const current_mark = cfs->current();
+  int components_count = 0;
+  unsigned int calculate_attr_size = 0;
+  if (record_attribute_start != NULL) {
+    cfs->set_current(record_attribute_start);
+    cfs->guarantee_more(2, CHECK_0);  // num of components
+    components_count = (int)cfs->get_u2_fast();
+    calculate_attr_size = 2;
+  }
+
+  Array<RecordComponent*>* const record_components =
+    MetadataFactory::new_array<RecordComponent*>(_loader_data, components_count, NULL, CHECK_0);
+  _record_components = record_components;
+
+  for (int x = 0; x < components_count; x++) {
+    cfs->guarantee_more(6, CHECK_0); // name_index, descriptor_index, attributes_count
+
+    const u2 name_index = cfs->get_u2_fast();
+    check_property(valid_symbol_at(name_index),
+      "Invalid constant pool index %u for name in Record attribute in class file %s",
+      name_index, CHECK_0);
+    const Symbol* const name = cp->symbol_at(name_index);
+    verify_legal_field_name(name, CHECK_0);
+
+    const u2 descriptor_index = cfs->get_u2_fast();
+    check_property(valid_symbol_at(descriptor_index),
+      "Invalid constant pool index %u for descriptor in Record attribute in class file %s",
+      descriptor_index, CHECK_0);
+    const Symbol* const descr = cp->symbol_at(descriptor_index);
+    verify_legal_field_signature(name, descr, CHECK_0);
+
+    const u2 attributes_count = cfs->get_u2_fast();
+    calculate_attr_size += 6;
+    u2 generic_sig_index = 0;
+    const u1* runtime_visible_annotations = NULL;
+    int runtime_visible_annotations_length = 0;
+    const u1* runtime_invisible_annotations = NULL;
+    int runtime_invisible_annotations_length = 0;
+    bool runtime_invisible_annotations_exists = false;
+    const u1* runtime_visible_type_annotations = NULL;
+    int runtime_visible_type_annotations_length = 0;
+    const u1* runtime_invisible_type_annotations = NULL;
+    int runtime_invisible_type_annotations_length = 0;
+    bool runtime_invisible_type_annotations_exists = false;
+
+    // Expected attributes for record components are Signature, Runtime(In)VisibleAnnotations,
+    // and Runtime(In)VisibleTypeAnnotations.  Other attributes are ignored.
+    for (int y = 0; y < attributes_count; y++) {
+      cfs->guarantee_more(6, CHECK_0);  // attribute_name_index, attribute_length
+      const u2 attribute_name_index = cfs->get_u2_fast();
+      const u4 attribute_length = cfs->get_u4_fast();
+      calculate_attr_size += 6;
+      check_property(
+        valid_symbol_at(attribute_name_index),
+        "Invalid Record attribute name index %u in class file %s",
+        attribute_name_index, CHECK_0);
+
+      const Symbol* const attribute_name = cp->symbol_at(attribute_name_index);
+      if (attribute_name == vmSymbols::tag_signature()) {
+        if (generic_sig_index != 0) {
+          classfile_parse_error(
+            "Multiple Signature attributes for Record component in class file %s",
+            CHECK_0);
+        }
+        if (attribute_length != 2) {
+          classfile_parse_error(
+            "Invalid Signature attribute length %u in Record component in class file %s",
+            attribute_length, CHECK_0);
+        }
+        generic_sig_index = parse_generic_signature_attribute(cfs, CHECK_0);
+
+      } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) {
+        if (runtime_visible_annotations != NULL) {
+          classfile_parse_error(
+            "Multiple RuntimeVisibleAnnotations attributes for Record component in class file %s", CHECK_0);
+        }
+        runtime_visible_annotations_length = attribute_length;
+        runtime_visible_annotations = cfs->current();
+
+        assert(runtime_visible_annotations != NULL, "null record component visible annotation");
+        cfs->guarantee_more(runtime_visible_annotations_length, CHECK_0);
+        cfs->skip_u1_fast(runtime_visible_annotations_length);
+
+      } else if (attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
+        if (runtime_invisible_annotations_exists) {
+          classfile_parse_error(
+            "Multiple RuntimeInvisibleAnnotations attributes for Record component in class file %s", CHECK_0);
+        }
+        runtime_invisible_annotations_exists = true;
+        if (PreserveAllAnnotations) {
+          runtime_invisible_annotations_length = attribute_length;
+          runtime_invisible_annotations = cfs->current();
+          assert(runtime_invisible_annotations != NULL, "null record component invisible annotation");
+        }
+        cfs->skip_u1(attribute_length, CHECK_0);
+
+      } else if (attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) {
+        if (runtime_visible_type_annotations != NULL) {
+          classfile_parse_error(
+            "Multiple RuntimeVisibleTypeAnnotations attributes for Record component in class file %s", CHECK_0);
+        }
+        runtime_visible_type_annotations_length = attribute_length;
+        runtime_visible_type_annotations = cfs->current();
+
+        assert(runtime_visible_type_annotations != NULL, "null record component visible type annotation");
+        cfs->guarantee_more(runtime_visible_type_annotations_length, CHECK_0);
+        cfs->skip_u1_fast(runtime_visible_type_annotations_length);
+
+      } else if (attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
+        if (runtime_invisible_type_annotations_exists) {
+          classfile_parse_error(
+            "Multiple RuntimeInvisibleTypeAnnotations attributes for Record component in class file %s", CHECK_0);
+        }
+        runtime_invisible_type_annotations_exists = true;
+        if (PreserveAllAnnotations) {
+          runtime_invisible_type_annotations_length = attribute_length;
+          runtime_invisible_type_annotations = cfs->current();
+          assert(runtime_invisible_type_annotations != NULL, "null record component invisible type annotation");
+        }
+        cfs->skip_u1(attribute_length, CHECK_0);
+
+      } else {
+        // Skip unknown attributes
+        cfs->skip_u1(attribute_length, CHECK_0);
+      }
+      calculate_attr_size += attribute_length;
+    } // End of attributes For loop
+
+    AnnotationArray* annotations = assemble_annotations(runtime_visible_annotations,
+                                                        runtime_visible_annotations_length,
+                                                        runtime_invisible_annotations,
+                                                        runtime_invisible_annotations_length,
+                                                        CHECK_0);
+    AnnotationArray* type_annotations = assemble_annotations(runtime_visible_type_annotations,
+                                                             runtime_visible_type_annotations_length,
+                                                             runtime_invisible_type_annotations,
+                                                             runtime_invisible_type_annotations_length,
+                                                             CHECK_0);
+
+    RecordComponent* record_component =
+      RecordComponent::allocate(_loader_data, name_index, descriptor_index,
+                                attributes_count, generic_sig_index,
+                                annotations, type_annotations, CHECK_0);
+    record_components->at_put(x, record_component);
+  }  // End of component processing loop
+
+  // Restore buffer's current position.
+  cfs->set_current(current_mark);
+  return calculate_attr_size;
+}
+
 void ClassFileParser::parse_classfile_synthetic_attribute(TRAPS) {
   set_class_synthetic_flag(true);
 }
@@ -3308,6 +3476,12 @@
                      CHECK);
 }
 
+bool ClassFileParser::supports_records() {
+  return _major_version == JAVA_14_VERSION &&
+    _minor_version == JAVA_PREVIEW_MINOR_VERSION &&
+    Arguments::enable_preview();
+}
+
 void ClassFileParser::parse_classfile_attributes(const ClassFileStream* const cfs,
                                                  ConstantPool* cp,
                  ClassFileParser::ClassAnnotationCollector* parsed_annotations,
@@ -3326,6 +3500,7 @@
   bool parsed_innerclasses_attribute = false;
   bool parsed_nest_members_attribute = false;
   bool parsed_nest_host_attribute = false;
+  bool parsed_record_attribute = false;
   bool parsed_enclosingmethod_attribute = false;
   bool parsed_bootstrap_methods_attribute = false;
   const u1* runtime_visible_annotations = NULL;
@@ -3345,6 +3520,8 @@
   u2  enclosing_method_method_index = 0;
   const u1* nest_members_attribute_start = NULL;
   u4  nest_members_attribute_length = 0;
+  const u1* record_attribute_start = NULL;
+  u4  record_attribute_length = 0;
 
   // Iterate over attributes
   while (attributes_count--) {
@@ -3527,6 +3704,38 @@
                          "Nest-host class_info_index %u has bad constant type in class file %s",
                          class_info_index, CHECK);
           _nest_host = class_info_index;
+        } else if (_major_version >= JAVA_14_VERSION) {
+          if (tag == vmSymbols::tag_record()) {
+            // Skip over Record attribute if not supported or if super class is
+            // not java.lang.Record.
+            if (supports_records() &&
+                cp->klass_name_at(_super_class_index) == vmSymbols::java_lang_Record()) {
+              if (parsed_record_attribute) {
+                classfile_parse_error("Multiple Record attributes in class file %s", CHECK);
+              }
+              // Check that class is final and not abstract.
+              if (!_access_flags.is_final() || _access_flags.is_abstract()) {
+                classfile_parse_error("Record attribute in non-final or abstract class file %s", CHECK);
+              }
+              parsed_record_attribute = true;
+              record_attribute_start = cfs->current();
+              record_attribute_length = attribute_length;
+            } else if (log_is_enabled(Info, class, record)) {
+              // Log why the Record attribute was ignored.  Note that if the
+              // class file version is 58.65535 and --enable-preview wasn't
+              // specified then a java.lang.UnsupportedClassVersionError
+              // exception would have been thrown.
+              ResourceMark rm(THREAD);
+              log_info(class, record)("Ignoring Record attribute in class %s because %s",
+                _class_name->as_C_string(),
+                supports_records() ? "super type is not java.lang.Record" :
+                                     "class file version is not 58.65535");
+            }
+            cfs->skip_u1(attribute_length, CHECK);
+          } else {
+            // Unknown attribute
+            cfs->skip_u1(attribute_length, CHECK);
+          }
         } else {
           // Unknown attribute
           cfs->skip_u1(attribute_length, CHECK);
@@ -3578,6 +3787,19 @@
     }
   }
 
+  if (parsed_record_attribute) {
+    const unsigned int calculated_attr_length = parse_classfile_record_attribute(
+                            cfs,
+                            cp,
+                            record_attribute_start,
+                            CHECK);
+    if (_need_verify) {
+      guarantee_property(record_attribute_length == calculated_attr_length,
+                         "Record attribute has wrong length in class file %s",
+                         CHECK);
+    }
+  }
+
   if (_max_bootstrap_specifier_index >= 0) {
     guarantee_property(parsed_bootstrap_methods_attribute,
                        "Missing BootstrapMethods attribute in class file %s", CHECK);
@@ -3632,7 +3854,8 @@
 // Transfer ownership of metadata allocated to the InstanceKlass.
 void ClassFileParser::apply_parsed_class_metadata(
                                             InstanceKlass* this_klass,
-                                            int java_fields_count, TRAPS) {
+                                            int java_fields_count,
+                                            TRAPS) {
   assert(this_klass != NULL, "invariant");
 
   _cp->set_pool_holder(this_klass);
@@ -3644,6 +3867,7 @@
   this_klass->set_nest_host_index(_nest_host);
   this_klass->set_local_interfaces(_local_interfaces);
   this_klass->set_annotations(_combined_annotations);
+  this_klass->set_record_components(_record_components);
   // Delay the setting of _transitive_interfaces until after initialize_supers() in
   // fill_instance_klass(). It is because the _transitive_interfaces may be shared with
   // its _super. If an OOM occurs while loading the current klass, its _super field
@@ -4514,6 +4738,7 @@
 static void check_super_class_access(const InstanceKlass* this_klass, TRAPS) {
   assert(this_klass != NULL, "invariant");
   const Klass* const super = this_klass->super();
+
   if (super != NULL) {
 
     // If the loader is not the boot loader then throw an exception if its
@@ -4715,12 +4940,13 @@
   const bool is_super      = (flags & JVM_ACC_SUPER)      != 0;
   const bool is_enum       = (flags & JVM_ACC_ENUM)       != 0;
   const bool is_annotation = (flags & JVM_ACC_ANNOTATION) != 0;
-  const bool major_gte_15  = _major_version >= JAVA_1_5_VERSION;
+  const bool major_gte_1_5 = _major_version >= JAVA_1_5_VERSION;
+  const bool major_gte_14  = _major_version >= JAVA_14_VERSION;
 
   if ((is_abstract && is_final) ||
       (is_interface && !is_abstract) ||
-      (is_interface && major_gte_15 && (is_super || is_enum)) ||
-      (!is_interface && major_gte_15 && is_annotation)) {
+      (is_interface && major_gte_1_5 && (is_super || is_enum)) ||
+      (!is_interface && major_gte_1_5 && is_annotation)) {
     ResourceMark rm(THREAD);
     Exceptions::fthrow(
       THREAD_AND_LOCATION,
@@ -4816,14 +5042,14 @@
   const bool is_volatile  = (flags & JVM_ACC_VOLATILE)  != 0;
   const bool is_transient = (flags & JVM_ACC_TRANSIENT) != 0;
   const bool is_enum      = (flags & JVM_ACC_ENUM)      != 0;
-  const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION;
+  const bool major_gte_1_5 = _major_version >= JAVA_1_5_VERSION;
 
   bool is_illegal = false;
 
   if (is_interface) {
     if (!is_public || !is_static || !is_final || is_private ||
         is_protected || is_volatile || is_transient ||
-        (major_gte_15 && is_enum)) {
+        (major_gte_1_5 && is_enum)) {
       is_illegal = true;
     }
   } else { // not interface
@@ -4859,7 +5085,7 @@
   const bool is_strict       = (flags & JVM_ACC_STRICT)       != 0;
   const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0;
   const bool is_protected    = (flags & JVM_ACC_PROTECTED)    != 0;
-  const bool major_gte_15    = _major_version >= JAVA_1_5_VERSION;
+  const bool major_gte_1_5   = _major_version >= JAVA_1_5_VERSION;
   const bool major_gte_8     = _major_version >= JAVA_8_VERSION;
   const bool is_initializer  = (name == vmSymbols::object_initializer_name());
 
@@ -4882,7 +5108,7 @@
           (is_abstract && (is_private || is_static || is_strict))) {
         is_illegal = true;
       }
-    } else if (major_gte_15) {
+    } else if (major_gte_1_5) {
       // Class file version in the interval [JAVA_1_5_VERSION, JAVA_8_VERSION)
       if (!is_public || is_private || is_protected || is_static || is_final ||
           is_synchronized || is_native || !is_abstract || is_strict) {
@@ -4900,13 +5126,13 @@
     } else {
       if (is_initializer) {
         if (is_static || is_final || is_synchronized || is_native ||
-            is_abstract || (major_gte_15 && is_bridge)) {
+            is_abstract || (major_gte_1_5 && is_bridge)) {
           is_illegal = true;
         }
       } else { // not initializer
         if (is_abstract) {
           if ((is_final || is_native || is_private || is_static ||
-              (major_gte_15 && (is_synchronized || is_strict)))) {
+              (major_gte_1_5 && (is_synchronized || is_strict)))) {
             is_illegal = true;
           }
         }
@@ -5495,6 +5721,7 @@
   assert(NULL == _nest_members, "invariant");
   assert(NULL == _local_interfaces, "invariant");
   assert(NULL == _combined_annotations, "invariant");
+  assert(NULL == _record_components, "invariant");
 
   if (_has_final_method) {
     ik->set_has_final_method();
@@ -5776,6 +6003,7 @@
   _inner_classes(NULL),
   _nest_members(NULL),
   _nest_host(0),
+  _record_components(NULL),
   _local_interfaces(NULL),
   _transitive_interfaces(NULL),
   _combined_annotations(NULL),
@@ -5886,6 +6114,7 @@
   _combined_annotations = NULL;
   _class_annotations = _class_type_annotations = NULL;
   _fields_annotations = _fields_type_annotations = NULL;
+  _record_components = NULL;
 }
 
 // Destructor to clean up
@@ -5913,6 +6142,10 @@
     MetadataFactory::free_array<u2>(_loader_data, _nest_members);
   }
 
+  if (_record_components != NULL) {
+    InstanceKlass::deallocate_record_components(_loader_data, _record_components);
+  }
+
   // Free interfaces
   InstanceKlass::deallocate_interfaces(_loader_data, _super_klass,
                                        _local_interfaces, _transitive_interfaces);
--- a/src/hotspot/share/classfile/classFileParser.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/classFileParser.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -42,6 +42,7 @@
 template <typename T>
 class GrowableArray;
 class InstanceKlass;
+class RecordComponent;
 class Symbol;
 class TempNewSymbol;
 
@@ -98,6 +99,7 @@
   Array<u2>* _inner_classes;
   Array<u2>* _nest_members;
   u2 _nest_host;
+  Array<RecordComponent*>* _record_components;
   Array<InstanceKlass*>* _local_interfaces;
   Array<InstanceKlass*>* _transitive_interfaces;
   Annotations* _combined_annotations;
@@ -287,6 +289,13 @@
                                             const u1* const nest_members_attribute_start,
                                             TRAPS);
 
+  u2 parse_classfile_record_attribute(const ClassFileStream* const cfs,
+                                      const ConstantPool* cp,
+                                      const u1* const record_attribute_start,
+                                      TRAPS);
+
+  bool supports_records();
+
   void parse_classfile_attributes(const ClassFileStream* const cfs,
                                   ConstantPool* cp,
                                   ClassAnnotationCollector* parsed_annotations,
--- a/src/hotspot/share/classfile/javaClasses.cpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/javaClasses.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -50,6 +50,7 @@
 #include "oops/objArrayOop.inline.hpp"
 #include "oops/oop.inline.hpp"
 #include "oops/symbol.hpp"
+#include "oops/recordComponent.hpp"
 #include "oops/typeArrayOop.inline.hpp"
 #include "prims/jvmtiExport.hpp"
 #include "prims/resolvedMethodTable.hpp"
@@ -3148,6 +3149,64 @@
   field->obj_field_put(annotations_offset, value);
 }
 
+oop java_lang_reflect_RecordComponent::create(InstanceKlass* holder, RecordComponent* component, TRAPS) {
+  // Allocate java.lang.reflect.RecordComponent instance
+  HandleMark hm(THREAD);
+  InstanceKlass* ik = SystemDictionary::RecordComponent_klass();
+  assert(ik != NULL, "must be loaded");
+  ik->initialize(CHECK_NULL);
+
+  Handle element = ik->allocate_instance_handle(CHECK_NULL);
+
+  Handle decl_class(THREAD, holder->java_mirror());
+  java_lang_reflect_RecordComponent::set_clazz(element(), decl_class());
+
+  Symbol* name = holder->constants()->symbol_at(component->name_index()); // name_index is a utf8
+  oop component_name = StringTable::intern(name, CHECK_NULL);
+  java_lang_reflect_RecordComponent::set_name(element(), component_name);
+
+  Symbol* type = holder->constants()->symbol_at(component->descriptor_index());
+  Handle component_type_h =
+    SystemDictionary::find_java_mirror_for_type(type, holder, SignatureStream::NCDFError, CHECK_NULL);
+  java_lang_reflect_RecordComponent::set_type(element(), component_type_h());
+
+  Method* accessor_method = NULL;
+  {
+    // Prepend "()" to type to create the full method signature.
+    ResourceMark rm(THREAD);
+    int sig_len = type->utf8_length() + 3; // "()" and null char
+    char* sig = NEW_RESOURCE_ARRAY(char, sig_len);
+    jio_snprintf(sig, sig_len, "%c%c%s", JVM_SIGNATURE_FUNC, JVM_SIGNATURE_ENDFUNC, type->as_C_string());
+    TempNewSymbol full_sig = SymbolTable::new_symbol(sig);
+    accessor_method = holder->find_instance_method(name, full_sig);
+  }
+
+  if (accessor_method != NULL) {
+    methodHandle method(THREAD, accessor_method);
+    oop m = Reflection::new_method(method, false, CHECK_NULL);
+    java_lang_reflect_RecordComponent::set_accessor(element(), m);
+  } else {
+    java_lang_reflect_RecordComponent::set_accessor(element(), NULL);
+  }
+
+  int sig_index = component->generic_signature_index();
+  if (sig_index > 0) {
+    Symbol* sig = holder->constants()->symbol_at(sig_index); // sig_index is a utf8
+    oop component_sig = StringTable::intern(sig, CHECK_NULL);
+    java_lang_reflect_RecordComponent::set_signature(element(), component_sig);
+  } else {
+    java_lang_reflect_RecordComponent::set_signature(element(), NULL);
+  }
+
+  typeArrayOop annotation_oop = Annotations::make_java_array(component->annotations(), CHECK_NULL);
+  java_lang_reflect_RecordComponent::set_annotations(element(), annotation_oop);
+
+  typeArrayOop type_annotation_oop = Annotations::make_java_array(component->type_annotations(), CHECK_NULL);
+  java_lang_reflect_RecordComponent::set_typeAnnotations(element(), type_annotation_oop);
+
+  return element();
+}
+
 #define CONSTANTPOOL_FIELDS_DO(macro) \
   macro(_oop_offset, k, "constantPoolOop", object_signature, false)
 
@@ -4311,6 +4370,13 @@
 int java_lang_Byte_ByteCache::_static_cache_offset;
 int java_lang_Boolean::_static_TRUE_offset;
 int java_lang_Boolean::_static_FALSE_offset;
+int java_lang_reflect_RecordComponent::clazz_offset;
+int java_lang_reflect_RecordComponent::name_offset;
+int java_lang_reflect_RecordComponent::type_offset;
+int java_lang_reflect_RecordComponent::accessor_offset;
+int java_lang_reflect_RecordComponent::signature_offset;
+int java_lang_reflect_RecordComponent::annotations_offset;
+int java_lang_reflect_RecordComponent::typeAnnotations_offset;
 
 
 
@@ -4662,6 +4728,55 @@
   return (hardcoded_offset * heapOopSize) + instanceOopDesc::base_offset_in_bytes();
 }
 
+#define RECORDCOMPONENT_FIELDS_DO(macro) \
+  macro(clazz_offset,       k, "clazz",       class_signature,  false); \
+  macro(name_offset,        k, "name",        string_signature, false); \
+  macro(type_offset,        k, "type",        class_signature,  false); \
+  macro(accessor_offset,    k, "accessor",    reflect_method_signature, false); \
+  macro(signature_offset,   k, "signature",   string_signature, false); \
+  macro(annotations_offset, k, "annotations", byte_array_signature,     false); \
+  macro(typeAnnotations_offset, k, "typeAnnotations", byte_array_signature, false);
+
+// Support for java_lang_reflect_RecordComponent
+void java_lang_reflect_RecordComponent::compute_offsets() {
+  InstanceKlass* k = SystemDictionary::RecordComponent_klass();
+  RECORDCOMPONENT_FIELDS_DO(FIELD_COMPUTE_OFFSET);
+}
+
+#if INCLUDE_CDS
+void java_lang_reflect_RecordComponent::serialize_offsets(SerializeClosure* f) {
+  RECORDCOMPONENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
+}
+#endif
+
+void java_lang_reflect_RecordComponent::set_clazz(oop element, oop value) {
+  element->obj_field_put(clazz_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_name(oop element, oop value) {
+  element->obj_field_put(name_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_type(oop element, oop value) {
+  element->obj_field_put(type_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_accessor(oop element, oop value) {
+  element->obj_field_put(accessor_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_signature(oop element, oop value) {
+  element->obj_field_put(signature_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_annotations(oop element, oop value) {
+  element->obj_field_put(annotations_offset, value);
+}
+
+void java_lang_reflect_RecordComponent::set_typeAnnotations(oop element, oop value) {
+  element->obj_field_put(typeAnnotations_offset, value);
+}
+
 // Compute hard-coded offsets
 // Invoked before SystemDictionary::initialize, so pre-loaded classes
 // are not available to determine the offset_of_static_fields.
--- a/src/hotspot/share/classfile/javaClasses.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/javaClasses.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -30,6 +30,8 @@
 #include "oops/oop.hpp"
 #include "runtime/os.hpp"
 
+class RecordComponent;
+
 // Interface for manipulating the basic Java classes.
 //
 // All dependencies on layout of actual Java classes should be kept here.
@@ -73,6 +75,7 @@
   f(java_lang_reflect_Method) \
   f(java_lang_reflect_Constructor) \
   f(java_lang_reflect_Field) \
+  f(java_lang_reflect_RecordComponent) \
   f(java_nio_Buffer) \
   f(reflect_ConstantPool) \
   f(reflect_UnsafeStaticFieldAccessorImpl) \
@@ -1483,6 +1486,39 @@
   friend class JavaClasses;
 };
 
+// Interface to java.lang.reflect.RecordComponent objects
+
+class java_lang_reflect_RecordComponent: AllStatic {
+ private:
+  static int clazz_offset;
+  static int name_offset;
+  static int type_offset;
+  static int accessor_offset;
+  static int signature_offset;
+  static int annotations_offset;
+  static int typeAnnotations_offset;
+
+  // Setters
+  static void set_clazz(oop element, oop value);
+  static void set_name(oop element, oop value);
+  static void set_type(oop element, oop value);
+  static void set_accessor(oop element, oop value);
+  static void set_signature(oop element, oop value);
+  static void set_annotations(oop element, oop value);
+  static void set_typeAnnotations(oop element, oop value);
+
+ public:
+  // Create an instance of RecordComponent
+  static oop create(InstanceKlass* holder, RecordComponent* component, TRAPS);
+
+  static void compute_offsets();
+  static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
+
+  // Debugging
+  friend class JavaClasses;
+};
+
+
 // Interface to java.lang.AssertionStatusDirectives objects
 
 class java_lang_AssertionStatusDirectives: AllStatic {
--- a/src/hotspot/share/classfile/systemDictionary.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/systemDictionary.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -119,6 +119,7 @@
   do_klass(AccessController_klass,                      java_security_AccessController                        ) \
   do_klass(SecureClassLoader_klass,                     java_security_SecureClassLoader                       ) \
   do_klass(ClassNotFoundException_klass,                java_lang_ClassNotFoundException                      ) \
+  do_klass(Record_klass,                                java_lang_Record                                      ) \
   do_klass(NoClassDefFoundError_klass,                  java_lang_NoClassDefFoundError                        ) \
   do_klass(LinkageError_klass,                          java_lang_LinkageError                                ) \
   do_klass(ClassCastException_klass,                    java_lang_ClassCastException                          ) \
@@ -217,6 +218,9 @@
   /* force inline of iterators */                                                                               \
   do_klass(Iterator_klass,                              java_util_Iterator                                    ) \
                                                                                                                 \
+  /* support for records */                                                                                     \
+  do_klass(RecordComponent_klass,                       java_lang_reflect_RecordComponent                     ) \
+                                                                                                                \
   /*end*/
 
 class SystemDictionary : AllStatic {
--- a/src/hotspot/share/classfile/vmSymbols.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/classfile/vmSymbols.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -94,6 +94,7 @@
   template(java_lang_reflect_Field,                   "java/lang/reflect/Field")                  \
   template(java_lang_reflect_Parameter,               "java/lang/reflect/Parameter")              \
   template(java_lang_reflect_Array,                   "java/lang/reflect/Array")                  \
+  template(java_lang_reflect_RecordComponent,         "java/lang/reflect/RecordComponent")        \
   template(java_lang_StringBuffer,                    "java/lang/StringBuffer")                   \
   template(java_lang_StringBuilder,                   "java/lang/StringBuilder")                  \
   template(java_lang_CharSequence,                    "java/lang/CharSequence")                   \
@@ -127,6 +128,7 @@
   template(jdk_internal_vm_PostVMInitHook,            "jdk/internal/vm/PostVMInitHook")           \
   template(sun_net_www_ParseUtil,                     "sun/net/www/ParseUtil")                    \
   template(java_util_Iterator,                        "java/util/Iterator")                       \
+  template(java_lang_Record,                          "java/lang/Record")                       \
                                                                                                   \
   template(jdk_internal_loader_ClassLoaders_AppClassLoader,      "jdk/internal/loader/ClassLoaders$AppClassLoader")      \
   template(jdk_internal_loader_ClassLoaders_PlatformClassLoader, "jdk/internal/loader/ClassLoaders$PlatformClassLoader") \
@@ -161,6 +163,7 @@
   template(tag_deprecated,                            "Deprecated")                               \
   template(tag_source_debug_extension,                "SourceDebugExtension")                     \
   template(tag_signature,                             "Signature")                                \
+  template(tag_record,                                "Record")                                   \
   template(tag_runtime_visible_annotations,           "RuntimeVisibleAnnotations")                \
   template(tag_runtime_invisible_annotations,         "RuntimeInvisibleAnnotations")              \
   template(tag_runtime_visible_parameter_annotations, "RuntimeVisibleParameterAnnotations")       \
@@ -562,6 +565,7 @@
   template(char_StringBuffer_signature,               "(C)Ljava/lang/StringBuffer;")                              \
   template(int_String_signature,                      "(I)Ljava/lang/String;")                                    \
   template(boolean_boolean_int_signature,             "(ZZ)I")                                                    \
+  template(reflect_method_signature,                  "Ljava/lang/reflect/Method;")                                                    \
   /* signature symbols needed by intrinsics */                                                                    \
   VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, template, VM_ALIAS_IGNORE)            \
                                                                                                                   \
--- a/src/hotspot/share/include/jvm.h	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/include/jvm.h	Wed Dec 04 15:57:39 2019 -0500
@@ -518,6 +518,7 @@
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly);
 
+
 /* Differs from JVM_GetClassModifiers in treatment of inner classes.
    This returns the access flags for the class as specified in the
    class file rather than searching the InnerClasses attribute (if
@@ -538,6 +539,14 @@
 JNIEXPORT jobjectArray JNICALL
 JVM_GetNestMembers(JNIEnv *env, jclass current);
 
+/* Records - since JDK 14 */
+
+JNIEXPORT jboolean JNICALL
+JVM_IsRecord(JNIEnv *env, jclass cls);
+
+JNIEXPORT jobjectArray JNICALL
+JVM_GetRecordComponents(JNIEnv *env, jclass ofClass);
+
 /* The following two reflection routines are still needed due to startup time issues */
 /*
  * java.lang.reflect.Method
--- a/src/hotspot/share/logging/logTag.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/logging/logTag.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -137,6 +137,7 @@
   LOG_TAG(parser) \
   LOG_TAG(ptrqueue) \
   LOG_TAG(purge) \
+  LOG_TAG(record) \
   LOG_TAG(resolve) \
   LOG_TAG(safepoint) \
   LOG_TAG(sampling) \
--- a/src/hotspot/share/memory/allocation.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/memory/allocation.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -300,7 +300,8 @@
   f(ConstantPool) \
   f(ConstantPoolCache) \
   f(Annotations) \
-  f(MethodCounters)
+  f(MethodCounters) \
+  f(RecordComponent)
 
 #define METASPACE_OBJ_TYPE_DECLARE(name) name ## Type,
 #define METASPACE_OBJ_TYPE_NAME_CASE(name) case name ## Type: return #name;
--- a/src/hotspot/share/memory/heapInspection.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/memory/heapInspection.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -88,6 +88,8 @@
         "Number of bytes used by the InstanceKlass::inner_classes() array") \
     f(nest_members_bytes, IK_nest_members, \
         "Number of bytes used by the InstanceKlass::nest_members() array") \
+    f(record_components_bytes, IK_record_components, \
+        "Number of bytes used by the InstanceKlass::record_components() array") \
     f(signers_bytes, IK_signers, \
         "Number of bytes used by the InstanceKlass::singers() array") \
     f(class_annotations_bytes, class_annotations, \
--- a/src/hotspot/share/memory/metaspaceShared.cpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/memory/metaspaceShared.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -823,6 +823,7 @@
   case MetaspaceObj::ConstantPoolCacheType:
   case MetaspaceObj::AnnotationsType:
   case MetaspaceObj::MethodCountersType:
+  case MetaspaceObj::RecordComponentType:
     // These have no vtables.
     break;
   case MetaspaceObj::ClassType:
--- a/src/hotspot/share/oops/instanceKlass.cpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/oops/instanceKlass.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -63,6 +63,7 @@
 #include "oops/klass.inline.hpp"
 #include "oops/method.hpp"
 #include "oops/oop.inline.hpp"
+#include "oops/recordComponent.hpp"
 #include "oops/symbol.hpp"
 #include "prims/jvmtiExport.hpp"
 #include "prims/jvmtiRedefineClasses.hpp"
@@ -436,6 +437,7 @@
   _nest_members(NULL),
   _nest_host_index(0),
   _nest_host(NULL),
+  _record_components(NULL),
   _static_field_size(parser.static_field_size()),
   _nonstatic_oop_map_size(nonstatic_oop_map_size(parser.total_oop_map_count())),
   _itable_len(parser.itable_size()),
@@ -504,6 +506,17 @@
   }
 }
 
+void InstanceKlass::deallocate_record_components(ClassLoaderData* loader_data,
+                                                 Array<RecordComponent*>* record_components) {
+  if (record_components != NULL && !record_components->is_shared()) {
+    for (int i = 0; i < record_components->length(); i++) {
+      RecordComponent* record_component = record_components->at(i);
+      MetadataFactory::free_metadata(loader_data, record_component);
+    }
+    MetadataFactory::free_array<RecordComponent*>(loader_data, record_components);
+  }
+}
+
 // This function deallocates the metadata and C heap pointers that the
 // InstanceKlass points to.
 void InstanceKlass::deallocate_contents(ClassLoaderData* loader_data) {
@@ -532,6 +545,9 @@
   deallocate_methods(loader_data, methods());
   set_methods(NULL);
 
+  deallocate_record_components(loader_data, record_components());
+  set_record_components(NULL);
+
   if (method_ordering() != NULL &&
       method_ordering() != Universe::the_empty_int_array() &&
       !method_ordering()->is_shared()) {
@@ -2339,6 +2355,7 @@
   }
 
   it->push(&_nest_members);
+  it->push(&_record_components);
 }
 
 void InstanceKlass::remove_unshareable_info() {
@@ -3270,6 +3287,9 @@
   }
   st->print(BULLET"inner classes:     "); inner_classes()->print_value_on(st);     st->cr();
   st->print(BULLET"nest members:     "); nest_members()->print_value_on(st);     st->cr();
+  if (record_components() != NULL) {
+    st->print(BULLET"record components:     "); record_components()->print_value_on(st);     st->cr();
+  }
   if (java_mirror() != NULL) {
     st->print(BULLET"java mirror:       ");
     java_mirror()->print_value_on(st);
@@ -3532,6 +3552,7 @@
   n += (sz->_fields_bytes                = sz->count_array(fields()));
   n += (sz->_inner_classes_bytes         = sz->count_array(inner_classes()));
   n += (sz->_nest_members_bytes          = sz->count_array(nest_members()));
+  n += (sz->_record_components_bytes     = sz->count_array(record_components()));
   sz->_ro_bytes += n;
 
   const ConstantPool* cp = constants();
@@ -3554,6 +3575,17 @@
       }
     }
   }
+
+  const Array<RecordComponent*>* components = record_components();
+  if (components != NULL) {
+    for (int i = 0; i < components->length(); i++) {
+      RecordComponent* component = components->at(i);
+      if (component != NULL) {
+        component->collect_statistics(sz);
+      }
+    }
+  }
+
 }
 #endif // INCLUDE_SERVICES
 
--- a/src/hotspot/share/oops/instanceKlass.hpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/oops/instanceKlass.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -41,6 +41,7 @@
 #include "jfr/support/jfrKlassExtension.hpp"
 #endif
 
+class RecordComponent;
 
 // An InstanceKlass is the VM level representation of a Java class.
 // It contains all information needed for at class at execution runtime.
@@ -182,6 +183,9 @@
   // By always being set it makes nest-member access checks simpler.
   InstanceKlass* _nest_host;
 
+  // The contents of the Record attribute.
+  Array<RecordComponent*>* _record_components;
+
   // the source debug extension for this klass, NULL if not specified.
   // Specified as UTF-8 string without terminating zero byte in the classfile,
   // it is stored in the instanceklass as a NULL-terminated UTF-8 string
@@ -448,9 +452,17 @@
   jushort nest_host_index() const { return _nest_host_index; }
   void set_nest_host_index(u2 i)  { _nest_host_index = i; }
 
+  // record components
+  Array<RecordComponent*>* record_components() const { return _record_components; }
+  void set_record_components(Array<RecordComponent*>* record_components) {
+    _record_components = record_components;
+  }
+  bool is_record() const { return _record_components != NULL; }
+
 private:
   // Called to verify that k is a member of this nest - does not look at k's nest-host
   bool has_nest_member(InstanceKlass* k, TRAPS) const;
+
 public:
   // Returns nest-host class, resolving and validating it if needed
   // Returns NULL if an exception occurs during loading, or validation fails
@@ -1152,6 +1164,8 @@
                                     const Klass* super_klass,
                                     Array<InstanceKlass*>* local_interfaces,
                                     Array<InstanceKlass*>* transitive_interfaces);
+  void static deallocate_record_components(ClassLoaderData* loader_data,
+                                           Array<RecordComponent*>* record_component);
 
   // The constant pool is on stack if any of the methods are executing or
   // referenced by handles.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/oops/recordComponent.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "logging/log.hpp"
+#include "memory/heapInspection.hpp"
+#include "memory/metadataFactory.hpp"
+#include "memory/metaspace.hpp"
+#include "memory/metaspaceClosure.hpp"
+#include "oops/annotations.hpp"
+#include "oops/instanceKlass.hpp"
+#include "oops/recordComponent.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+RecordComponent* RecordComponent::allocate(ClassLoaderData* loader_data,
+                                           u2 name_index, u2 descriptor_index,
+                                           u2 attributes_count,
+                                           u2 generic_signature_index,
+                                           AnnotationArray* annotations,
+                                           AnnotationArray* type_annotations, TRAPS) {
+  return new (loader_data, size(), MetaspaceObj::RecordComponentType, THREAD)
+         RecordComponent(name_index, descriptor_index, attributes_count,
+                         generic_signature_index, annotations, type_annotations);
+}
+
+void RecordComponent::deallocate_contents(ClassLoaderData* loader_data) {
+  if (annotations() != NULL) {
+    MetadataFactory::free_array<u1>(loader_data, annotations());
+  }
+  if (type_annotations() != NULL) {
+    MetadataFactory::free_array<u1>(loader_data, type_annotations());
+  }
+}
+
+void RecordComponent::metaspace_pointers_do(MetaspaceClosure* it) {
+  log_trace(cds)("Iter(RecordComponent): %p", this);
+  it->push(&_annotations);
+  it->push(&_type_annotations);
+}
+
+void RecordComponent::print_value_on(outputStream* st) const {
+  st->print("RecordComponent(" INTPTR_FORMAT ")", p2i(this));
+}
+
+#if INCLUDE_SERVICES
+void RecordComponent::collect_statistics(KlassSizeStats *sz) const {
+  if (_annotations != NULL) {
+    sz->_annotations_bytes += sz->count(_annotations);
+    sz->_ro_bytes += sz->count(_annotations);
+  }
+  if (_type_annotations != NULL) {
+    sz->_annotations_bytes += sz->count(_type_annotations);
+    sz->_ro_bytes += sz->count(_type_annotations);
+  }
+}
+#endif
+
+#ifndef PRODUCT
+void RecordComponent::print_on(outputStream* st) const {
+  st->print("name_index: %d", _name_index);
+  st->print(" - descriptor_index: %d", _descriptor_index);
+  st->print(" - attributes_count: %d", _attributes_count);
+  if (_generic_signature_index != 0) {
+    st->print(" - generic_signature_index: %d", _generic_signature_index);
+  }
+  st->cr();
+  if (_annotations != NULL) {
+    st->print_cr("record component annotations");
+    _annotations->print_value_on(st);
+  }
+  if (_type_annotations != NULL) {
+    st->print_cr("record component type annotations");
+    _type_annotations->print_value_on(st);
+  }
+}
+#endif // PRODUCT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/oops/recordComponent.hpp	Wed Dec 04 15:57:39 2019 -0500
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_OOPS_RECORDCOMPONENT_HPP
+#define SHARE_OOPS_RECORDCOMPONENT_HPP
+
+#include "oops/annotations.hpp"
+#include "oops/metadata.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+class KlassSizeStats;
+
+// This class stores information extracted from the Record class attribute.
+class RecordComponent: public MetaspaceObj {
+  private:
+    AnnotationArray* _annotations;
+    AnnotationArray* _type_annotations;
+    u2 _name_index;
+    u2 _descriptor_index;
+    u2 _attributes_count;
+
+    // generic_signature_index gets set if the Record component has a Signature
+    // attribute.  A zero value indicates that there was no Signature attribute.
+    u2 _generic_signature_index;
+
+  public:
+    RecordComponent(u2 name_index, u2 descriptor_index, u2 attributes_count,
+                    u2 generic_signature_index, AnnotationArray* annotations,
+                    AnnotationArray* type_annotations):
+                    _annotations(annotations), _type_annotations(type_annotations),
+                    _name_index(name_index), _descriptor_index(descriptor_index),
+                    _attributes_count(attributes_count),
+                    _generic_signature_index(generic_signature_index) { }
+
+    // Allocate instance of this class
+    static RecordComponent* allocate(ClassLoaderData* loader_data,
+                                     u2 name_index, u2 descriptor_index,
+                                     u2 attributes_count,
+                                     u2 generic_signature_index,
+                                     AnnotationArray* annotations,
+                                     AnnotationArray* type_annotations, TRAPS);
+
+    void deallocate_contents(ClassLoaderData* loader_data);
+
+    u2 name_index() const { return _name_index; }
+    void set_name_index(u2 name_index) { _name_index = name_index; }
+
+    u2 descriptor_index() const { return _descriptor_index; }
+    void set_descriptor_index(u2 descriptor_index) {
+      _descriptor_index = descriptor_index;
+    }
+
+    u2 attributes_count() const { return _attributes_count; }
+
+    u2 generic_signature_index() const { return _generic_signature_index; }
+    void set_generic_signature_index(u2 generic_signature_index) {
+      _generic_signature_index = generic_signature_index;
+    }
+
+    AnnotationArray* annotations() const { return _annotations; }
+    AnnotationArray* type_annotations() const { return _type_annotations; }
+
+    // Size of RecordComponent, not including size of any annotations.
+    static int size() { return sizeof(RecordComponent) / wordSize; }
+
+    void metaspace_pointers_do(MetaspaceClosure* it);
+    MetaspaceObj::Type type() const { return RecordComponentType; }
+
+    // Record_components should be stored in the read-only region of CDS archive.
+    static bool is_read_only_by_default() { return true; }
+    DEBUG_ONLY(bool on_stack() { return false; })  // for template
+
+#if INCLUDE_SERVICES
+    void collect_statistics(KlassSizeStats *sz) const;
+#endif
+
+    bool is_klass() const { return false; }
+
+#ifndef PRODUCT
+    void print_on(outputStream* st) const;
+#endif
+    void print_value_on(outputStream* st) const;
+
+};
+
+#endif // SHARE_OOPS_RECORDCOMPONENT_HPP
--- a/src/hotspot/share/prims/jvm.cpp	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/prims/jvm.cpp	Wed Dec 04 15:57:39 2019 -0500
@@ -51,6 +51,7 @@
 #include "oops/fieldStreams.inline.hpp"
 #include "oops/instanceKlass.hpp"
 #include "oops/method.hpp"
+#include "oops/recordComponent.hpp"
 #include "oops/objArrayKlass.hpp"
 #include "oops/objArrayOop.inline.hpp"
 #include "oops/oop.inline.hpp"
@@ -1693,6 +1694,54 @@
 }
 JVM_END
 
+JVM_ENTRY(jboolean, JVM_IsRecord(JNIEnv *env, jclass cls))
+{
+  JVMWrapper("JVM_IsRecord");
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+  if (k != NULL && k->is_instance_klass()) {
+    InstanceKlass* ik = InstanceKlass::cast(k);
+    return ik->is_record();
+  } else {
+    return false;
+  }
+}
+JVM_END
+
+JVM_ENTRY(jobjectArray, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))
+{
+  JVMWrapper("JVM_GetRecordComponents");
+  Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass));
+  assert(c->is_instance_klass(), "must be");
+  InstanceKlass* ik = InstanceKlass::cast(c);
+
+  if (ik->is_record()) {
+    Array<RecordComponent*>* components = ik->record_components();
+    assert(components != NULL, "components should not be NULL");
+    {
+      JvmtiVMObjectAllocEventCollector oam;
+      constantPoolHandle cp(THREAD, ik->constants());
+      int length = components->length();
+      assert(length >= 0, "unexpected record_components length");
+      objArrayOop record_components =
+        oopFactory::new_objArray(SystemDictionary::RecordComponent_klass(), length, CHECK_NULL);
+      objArrayHandle components_h (THREAD, record_components);
+
+      for (int x = 0; x < length; x++) {
+        RecordComponent* component = components->at(x);
+        assert(component != NULL, "unexpected NULL record component");
+        oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL);
+        components_h->obj_at_put(x, component_oop);
+      }
+      return (jobjectArray)JNIHandles::make_local(components_h());
+    }
+  }
+
+  // Return empty array if ofClass is not a record.
+  objArrayOop result = oopFactory::new_objArray(SystemDictionary::RecordComponent_klass(), 0, CHECK_NULL);
+  return (jobjectArray)JNIHandles::make_local(env, result);
+}
+JVM_END
+
 static bool select_method(const methodHandle& method, bool want_constructor) {
   if (want_constructor) {
     return (method->is_initializer() && !method->is_static());
--- a/src/hotspot/share/prims/jvmti.xml	Wed Dec 04 21:40:08 2019 +0100
+++ b/src/hotspot/share/prims/jvmti.xml	Wed Dec 04 15:57:39 2019 -0500
@@ -49,7 +49,7 @@
    <!ATTLIST function id CDATA #REQUIRED
                       num CDATA #REQUIRED
                       phase (onload|onloadOnly|start|live|any) #IMPLIED
-		      callbacksafe (safe|unsafe) #IMPLIED
+                      callbacksafe (safe|unsafe) #IMPLIED
                       impl CDATA #IMPLIED
                       hide CDATA #IMPLIED
                       jkernel (yes|no) #IMPLIED
@@ -487,17 +487,17 @@
     <dl>
       <dt><code>-agentlib:</code><i>&lt;agent-lib-name&gt;</i><code>=</code><i>&lt;options&gt;</i></dt>
       <dd>
-	The name following <code>-agentlib:</code> is the name of the
-	library to load.  Lookup of the library, both its full name and location,
-	proceeds in a platform-specific manner.
-	Typically, the <i>&lt;agent-lib-name&gt;</i> is expanded to an
-	operating system specific file name.
-	The <i>&lt;options&gt;</i> will be passed to the agent on start-up.
-	For example, if the option
-	<code>-agentlib:foo=opt1,opt2</code> is specified, the VM will attempt to
-	load the shared library <code>foo.dll</code> from the system <code>PATH</code>
+        The name following <code>-agentlib:</code> is the name of the
+        library to load.  Lookup of the library, both its full name and location,
+        proceeds in a platform-specific manner.
+        Typically, the <i>&lt;agent-lib-name&gt;</i> is expanded to an
+        operating system specific file name.
+        The <i>&lt;options&gt;</i> will be passed to the agent on start-up.
+        For example, if the option
+        <code>-agentlib:foo=opt1,opt2</code> is specified, the VM will attempt to
+        load the shared library <code>foo.dll</code> from the system <code>PATH</code>
         under <tm>Windows</tm> or <code>libfoo.so</code> from the
-	<code>LD_LIBRARY_PATH</code> under the <tm>Solaris</tm> operating
+        <code>LD_LIBRARY_PATH</code> under the <tm>Solaris</tm> operating
         environment.
         If the agent library is statically linked into the executable
         then no actual loading takes place.
@@ -505,13 +505,13 @@
       </dd>
       <dt><code>-agentpath:</code><i>&lt;path-to-agent&gt;</i><code>=</code><i>&lt;options&gt;</i></dt>
       <dd>
-	The path following <code>-agentpath:</code> is the absolute path from which
-	to load the library.
-	No library name expansion will occur.
-	The <i>&lt;options&gt;</i> will be passed to the agent on start-up.
-	For example, if the option
-	<code>-agentpath:c:\myLibs\foo.dll=opt1,opt2</code> is specified, the VM will attempt to
-	load the shared library <code>c:\myLibs\foo.dll</code>. If the agent
+        The path following <code>-agentpath:</code> is the absolute path from which
+        to load the library.
+        No library name expansion will occur.
+        The <i>&lt;options&gt;</i> will be passed to the agent on start-up.
+        For example, if the option
+        <code>-agentpath:c:\myLibs\foo.dll=opt1,opt2</code> is specified, the VM will attempt to
+        load the shared library <code>c:\myLibs\foo.dll</code>. If the agent
         library is statically linked into the executable
         then no actual loading takes place.
     <p/>
@@ -574,12 +574,12 @@
     It will be called early enough in VM initialization that:
     <ul>
       <li><functionlink id="SetSystemProperty">system properties</functionlink>
-	may be set before they have been used in the start-up of the VM</li>
+        may be set before they have been used in the start-up of the VM</li>
       <li>the full set of
-	<internallink id="capability">capabilities</internallink>
-	is still available (note that capabilities that configure the VM
-	may only be available at this time--see the
-	<internallink id="capability">Capability function section</internallink>)</li>
+        <internallink id="capability">capabilities</internallink>
+        is still available (note that capabilities that configure the VM
+        may only be available at this time--see the
+        <internallink id="capability">Capability function section</internallink>)</li>
       <li>no bytecodes have executed</li>
       <li>no classes have been loaded</li>
       <li>no objects have been created</li>
@@ -795,29 +795,29 @@
     Instrumentation can be inserted in one of three ways:
     <ul>
       <li>
-	Static Instrumentation: The class file is instrumented before it
-	is loaded into the VM - for example, by creating a duplicate directory of
-	<code>*.class</code> files which have been modified to add the instrumentation.
-	This method is extremely awkward and, in general, an agent cannot know
-	the origin of the class files which will be loaded.
+        Static Instrumentation: The class file is instrumented before it
+        is loaded into the VM - for example, by creating a duplicate directory of
+        <code>*.class</code> files which have been modified to add the instrumentation.
+        This method is extremely awkward and, in general, an agent cannot know
+        the origin of the class files which will be loaded.
       </li>
       <li>
-	Load-Time Instrumentation: When a class file is loaded by the VM, the raw
-	bytes of the class file are sent for instrumentation to the agent.
-	The <eventlink id="ClassFileLoadHook"/>
-	event, triggered by the class load,
-	provides this functionality.  This mechanism provides efficient
-	and complete access to one-time instrumentation.
+        Load-Time Instrumentation: When a class file is loaded by the VM, the raw
+        bytes of the class file are sent for instrumentation to the agent.
+        The <eventlink id="ClassFileLoadHook"/>
+        event, triggered by the class load,
+        provides this functionality.  This mechanism provides efficient
+        and complete access to one-time instrumentation.
       </li>
       <li>
-	Dynamic Instrumentation: A class which is already loaded (and possibly
-	even running) is modified.  This optional feature is provided by the
-	<eventlink id="ClassFileLoadHook"/> event, triggered by calling the
-	<functionlink id="RetransformClasses"/> function.
-	Classes can be modified multiple times and can be returned to their
-	original state.
-	The mechanism allows instrumentation which changes during the
-	course of execution.
+        Dynamic Instrumentation: A class which is already loaded (and possibly
+        even running) is modified.  This optional feature is provided by the
+        <eventlink id="ClassFileLoadHook"/> event, triggered by calling the
+        <functionlink id="RetransformClasses"/> function.
+        Classes can be modified multiple times and can be returned to their
+        original state.
+        The mechanism allows instrumentation which changes during the
+        course of execution.
       </li>
     </ul>
     <p/>
@@ -1058,49 +1058,49 @@
     <function id="Allocate" jkernel="yes" phase="any" callbacksafe="safe" impl="notrace" num="46">
       <synopsis>Allocate</synopsis>
       <description>
-	Allocate an area of memory through the <jvmti/> allocator.
+        Allocate an area of memory through the <jvmti/> allocator.
         The allocated
-	memory should be freed with <functionlink id="Deallocate"></functionlink>.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="size">
-	  <jlong/>
-	  <description>
-	    The number of bytes to allocate.
-	    <rationale>
-	      <code>jlong</code> is used for compatibility with JVMDI.
-	    </rationale>
-	  </description>
-	</param>
-	<param id="mem_ptr">
-	  <allocbuf incount="size"><uchar/></allocbuf>
-	  <description>
-	    On return, a pointer to the beginning of the allocated memory.
+        memory should be freed with <functionlink id="Deallocate"></functionlink>.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="size">
+          <jlong/>
+          <description>
+            The number of bytes to allocate.
+            <rationale>
+              <code>jlong</code> is used for compatibility with JVMDI.
+            </rationale>
+          </description>
+        </param>
+        <param id="mem_ptr">
+          <allocbuf incount="size"><uchar/></allocbuf>
+          <description>
+            On return, a pointer to the beginning of the allocated memory.
             If <code>size</code> is zero, <code>NULL</code> is returned.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OUT_OF_MEMORY">
-	  Memory request cannot be honored.
-	</error>
-	<error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
-	  <paramlink id="size"></paramlink> is less than zero.
-	</error>
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OUT_OF_MEMORY">
+          Memory request cannot be honored.
+        </error>
+        <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
+          <paramlink id="size"></paramlink> is less than zero.
+        </error>
       </errors>
     </function>
 
     <function id="Deallocate" jkernel="yes" phase="any" callbacksafe="safe" impl="notrace" num="47">
       <synopsis>Deallocate</synopsis>
       <description>
-	Deallocate <code>mem</code>  using the <jvmti/> allocator.
+        Deallocate <code>mem</code>  using the <jvmti/> allocator.
         This function should
-	be used to deallocate any memory allocated and returned
+        be used to deallocate any memory allocated and returned
         by a <jvmti/> function
-	(including memory allocated with <functionlink id="Allocate"></functionlink>).
+        (including memory allocated with <functionlink id="Allocate"></functionlink>).
         All allocated memory must be deallocated
         or the memory cannot be reclaimed.
       </description>
@@ -1108,17 +1108,17 @@
       <capabilities>
       </capabilities>
       <parameters>
-	<param id="mem">
-	  <outbuf>
+        <param id="mem">
+          <outbuf>
             <uchar/>
-	    <nullok>the call is ignored</nullok>
+            <nullok>the call is ignored</nullok>
           </outbuf>
-	  <description>
-	    A pointer to the beginning of the allocated memory.
+          <description>
+            A pointer to the beginning of the allocated memory.
             Please ignore "On return, the elements are set."
               <todo>keep it from generating "On return, the elements are set"</todo>
-	  </description>
-	</param>
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1209,55 +1209,55 @@
             </li>
           </ul>
         <p/>
-	The answers are represented by the following bit vector.
-	<constants id="jvmtiThreadState" label="Thread State Flags" kind="bits">
-	  <constant id="JVMTI_THREAD_STATE_ALIVE" num="0x0001">
-	    Thread is alive. Zero if thread is new (not started) or terminated.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_TERMINATED" num="0x0002">
-	    Thread has completed execution.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_RUNNABLE" num="0x0004">
-	    Thread is runnable.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER" num="0x0400">
-	    Thread is waiting to enter a synchronization block/method or,
+        The answers are represented by the following bit vector.
+        <constants id="jvmtiThreadState" label="Thread State Flags" kind="bits">
+          <constant id="JVMTI_THREAD_STATE_ALIVE" num="0x0001">
+            Thread is alive. Zero if thread is new (not started) or terminated.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_TERMINATED" num="0x0002">
+            Thread has completed execution.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_RUNNABLE" num="0x0004">
+            Thread is runnable.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER" num="0x0400">
+            Thread is waiting to enter a synchronization block/method or,
             after an <code>Object.wait()</code>, waiting to re-enter a
             synchronization block/method.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_WAITING" num="0x0080">
-	    Thread is waiting.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_WAITING_INDEFINITELY" num="0x0010">
-	    Thread is waiting without a timeout.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_WAITING" num="0x0080">
+            Thread is waiting.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_WAITING_INDEFINITELY" num="0x0010">
+            Thread is waiting without a timeout.
             For example, <code>Object.wait()</code>.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT" num="0x0020">
-	    Thread is waiting with a maximum time to wait specified.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT" num="0x0020">
+            Thread is waiting with a maximum time to wait specified.
             For example, <code>Object.wait(long)</code>.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_SLEEPING" num="0x0040">
-	    Thread is sleeping -- <code>Thread.sleep(long)</code>.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_IN_OBJECT_WAIT" num="0x0100">
-	    Thread is waiting on an object monitor -- <code>Object.wait</code>.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_PARKED" num="0x0200">
-	    Thread is parked, for example: <code>LockSupport.park</code>,
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_SLEEPING" num="0x0040">
+            Thread is sleeping -- <code>Thread.sleep(long)</code>.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_IN_OBJECT_WAIT" num="0x0100">
+            Thread is waiting on an object monitor -- <code>Object.wait</code>.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_PARKED" num="0x0200">
+            Thread is parked, for example: <code>LockSupport.park</code>,
             <code>LockSupport.parkUtil</code> and <code>LockSupport.parkNanos</code>.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_SUSPENDED" num="0x100000">
-	    Thread suspended.
-	    <code>java.lang.Thread.suspend()</code>
-	    or a <jvmti/> suspend function
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_SUSPENDED" num="0x100000">
+            Thread suspended.
+            <code>java.lang.Thread.suspend()</code>
+            or a <jvmti/> suspend function
             (such as <functionlink id="SuspendThread"></functionlink>)
             has been called on the thread. If this bit
-	    is set, the other bits refer to the thread state before suspension.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_INTERRUPTED" num="0x200000">
-	    Thread has been interrupted.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_IN_NATIVE" num="0x400000">
+            is set, the other bits refer to the thread state before suspension.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_INTERRUPTED" num="0x200000">
+            Thread has been interrupted.
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_IN_NATIVE" num="0x400000">
             Thread is in native code--that is, a native method is running
             which has not called back into the VM or Java programming
             language code.
@@ -1266,49 +1266,49 @@
             language code nor is it set when running VM code or
             VM support code. Native VM interface functions, such as JNI and
             <jvmti/> functions, may be implemented as VM code.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_VENDOR_1" num="0x10000000">
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_VENDOR_1" num="0x10000000">
             Defined by VM vendor.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_VENDOR_2" num="0x20000000">
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_VENDOR_2" num="0x20000000">
             Defined by VM vendor.
-	  </constant>
-	  <constant id="JVMTI_THREAD_STATE_VENDOR_3" num="0x40000000">
+          </constant>
+          <constant id="JVMTI_THREAD_STATE_VENDOR_3" num="0x40000000">
             Defined by VM vendor.
-	  </constant>
-	</constants>
+          </constant>
+        </constants>
         The following definitions are used to convert <jvmti/> thread state
         to <code>java.lang.Thread.State</code> style states.
-	<constants id="jvmtiJavaLangThreadState" label="java.lang.Thread.State Conversion Masks" kind="bits">
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_MASK"
+        <constants id="jvmtiJavaLangThreadState" label="java.lang.Thread.State Conversion Masks" kind="bits">
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_MASK"
                      num="JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT">
-	    Mask the state with this before comparison
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_NEW"
+            Mask the state with this before comparison
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_NEW"
                      num="0">
-	    <code>java.lang.Thread.State.NEW</code>
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED"
+            <code>java.lang.Thread.State.NEW</code>
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED"
                      num="JVMTI_THREAD_STATE_TERMINATED">
-	    <code>java.lang.Thread.State.TERMINATED</code>
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE"
+            <code>java.lang.Thread.State.TERMINATED</code>
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE"
                      num="JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE">
-	    <code>java.lang.Thread.State.RUNNABLE</code>
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED"
+            <code>java.lang.Thread.State.RUNNABLE</code>
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED"
                      num="JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER">
-	    <code>java.lang.Thread.State.BLOCKED</code>
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_WAITING"
+            <code>java.lang.Thread.State.BLOCKED</code>
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_WAITING"
                      num="JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY">
-	    <code>java.lang.Thread.State.WAITING</code>
-	  </constant>
-	  <constant id="JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING"
+            <code>java.lang.Thread.State.WAITING</code>
+          </constant>
+          <constant id="JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING"
                      num="JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT">
-	    <code>java.lang.Thread.State.TIMED_WAITING</code>
-	  </constant>
-	</constants>
+            <code>java.lang.Thread.State.TIMED_WAITING</code>
+          </constant>
+        </constants>
         <b>Rules</b>
         <p/>
         There can be no more than one answer to a question, although there can be no
@@ -1403,26 +1403,26 @@
         In most cases, the thread state can be determined by testing the one bit corresponding
         to that question.  For example, the code to test if a thread is sleeping:
         <example>
-	jint state;
-	jvmtiError err;
-
-	err = (*jvmti)-&gt;GetThreadState(jvmti, thread, &amp;state);
-	if (err == JVMTI_ERROR_NONE) {
-	   if (state &amp; JVMTI_THREAD_STATE_SLEEPING) {  ...
+        jint state;
+        jvmtiError err;
+
+        err = (*jvmti)-&gt;GetThreadState(jvmti, thread, &amp;state);
+        if (err == JVMTI_ERROR_NONE) {
+           if (state &amp; JVMTI_THREAD_STATE_SLEEPING) {  ...
         </example>
         <p/>
         For waiting (that is, in <code>Object.wait</code>, parked, or sleeping) it would be:
         <example>
-	   if (state &amp; JVMTI_THREAD_STATE_WAITING) {  ...
+           if (state &amp; JVMTI_THREAD_STATE_WAITING) {  ...
         </example>
         For some states, more than one bit will need to be tested as is the case
         when testing if a thread has not yet been started:
         <example>
-	   if ((state &amp; (JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_TERMINATED)) == 0)  {  ...
+           if ((state &amp; (JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_TERMINATED)) == 0)  {  ...
         </example>
         To distinguish timed from untimed <code>Object.wait</code>:
         <example>
-	   if (state &amp; JVMTI_THREAD_STATE_IN_OBJECT_WAIT)  {
+           if (state &amp; JVMTI_THREAD_STATE_IN_OBJECT_WAIT)  {
              if (state &amp; JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT)  {
                printf("in Object.wait(long timeout)\n");
              } else {
@@ -1440,8 +1440,8 @@
         by using the provided conversion masks.
         For example, this returns the name of the <code>java.lang.Thread.State</code> thread state:
         <example>
-	    err = (*jvmti)-&gt;GetThreadState(jvmti, thread, &amp;state);
-	    abortOnError(err);
+            err = (*jvmti)-&gt;GetThreadState(jvmti, thread, &amp;state);
+            abortOnError(err);
             switch (state &amp; JVMTI_JAVA_LANG_THREAD_STATE_MASK) {
             case JVMTI_JAVA_LANG_THREAD_STATE_NEW:
               return "NEW";
@@ -1462,19 +1462,19 @@
       <capabilities>
       </capabilities>
       <parameters>
-	<param id="thread">
-	  <jthread null="current" started="maybe" impl="noconvert"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="thread_state_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to state flags,
-	    as defined by the <internallink id="jvmtiThreadState">Thread State Flags</internallink>.
-	  </description>
-	</param>
+        <param id="thread">
+          <jthread null="current" started="maybe" impl="noconvert"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="thread_state_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to state flags,
+            as defined by the <internallink id="jvmtiThreadState">Thread State Flags</internallink>.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1499,11 +1499,11 @@
       </capabilities>
       <parameters>
         <param id="thread_ptr">
-	  <outptr><jthread/></outptr>
-	  <description>
-	     On return, points to the current thread, or <code>NULL</code>.
-	  </description>
-	</param>
+          <outptr><jthread/></outptr>
+          <description>
+             On return, points to the current thread, or <code>NULL</code>.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1528,18 +1528,18 @@
       </capabilities>
       <parameters>
         <param id="threads_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of running threads.
-	  </description>
-	</param>
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of running threads.
+          </description>
+        </param>
         <param id="threads_ptr">
-	  <allocbuf outcount="threads_count_ptr"><jthread/></allocbuf>
-	    <description>
-	      On return, points to an array of references, one
-	      for each running thread.
-	    </description>
-	</param>
+          <allocbuf outcount="threads_count_ptr"><jthread/></allocbuf>
+            <description>
+              On return, points to an array of references, one
+              for each running thread.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1560,11 +1560,11 @@
       </capabilities>
       <parameters>
         <param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      The thread to suspend.
-	    </description>
-	</param>
+          <jthread null="current"/>
+            <description>
+              The thread to suspend.
+            </description>
+        </param>
       </parameters>
       <errors>
         <error id="JVMTI_ERROR_THREAD_SUSPENDED">
@@ -1577,9 +1577,9 @@
     <function id="SuspendAllThreads" num="101">
       <synopsis>Suspend All Threads</synopsis>
       <description>
-	<issue>
-	    There has been no explicit call for this function, and it will
-	    thus be removed if there is no interest.
+        <issue>
+            There has been no explicit call for this function, and it will
+            thus be removed if there is no interest.
         </issue>
         Suspend all live threads except:
         <ul>
@@ -1598,7 +1598,7 @@
         by the context of the <jvmti/>
         environment, which, typically, is all threads attached to the VM,
         except critical VM internal threads and <jvmti/> agent threads
-	(see <functionlink id="RunAgentThread"/>).
+        (see <functionlink id="RunAgentThread"/>).
         <p/>
         If the calling thread is specified,
         all other threads are suspended first then the caller thread is suspended -
@@ -1618,33 +1618,33 @@
       </capabilities>
       <parameters>
         <param id="except_count">
-	  <jint min="0"/>
-	  <description>
-	    The number of threads in the list of threads not to be suspended.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The number of threads in the list of threads not to be suspended.
+          </description>
+        </param>
         <param id="except_list">
             <inbuf incount="except_count">
               <jthread/>
               <nullok>not an error if <code>except_count == 0</code></nullok>
             </inbuf>
-	    <description>
-	      The list of threads not to be suspended.
-	    </description>
-	</param>
+            <description>
+              The list of threads not to be suspended.
+            </description>
+        </param>
         <param id="suspended_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of threads suspended by this call.
-	  </description>
-	</param>
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of threads suspended by this call.
+          </description>
+        </param>
         <param id="suspended_list_ptr">
-	  <allocbuf outcount="suspended_count_ptr"><jthread/></allocbuf>
-	    <description>
-	      On return, points to an array of references, one
-	      for each thread suspended.
-	    </description>
-	</param>
+          <allocbuf outcount="suspended_count_ptr"><jthread/></allocbuf>
+            <description>
+              On return, points to an array of references, one
+              for each thread suspended.
+            </description>
+        </param>
       </parameters>
       <errors>
         <error id="JVMTI_ERROR_INVALID_THREAD">
@@ -1681,31 +1681,31 @@
       </capabilities>
       <parameters>
         <param id="request_count">
-	  <jint min="0"/>
-	  <description>
-	    The number of threads to suspend.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The number of threads to suspend.
+          </description>
+        </param>
         <param id="request_list">
-	  <inbuf incount="request_count"><jthread/></inbuf>
-	    <description>
-	      The list of threads to suspend.
-	    </description>
-	</param>
+          <inbuf incount="request_count"><jthread/></inbuf>
+            <description>
+              The list of threads to suspend.
+            </description>
+        </param>
         <param id="results">
-	  <outbuf incount="request_count"><enum>jvmtiError</enum></outbuf>
-	  <description>
-	    An agent supplied array of
-	    <paramlink id="request_count"></paramlink> elements.
-	    On return, filled with the error code for
-	    the suspend of the corresponding thread.
-	    The error code will be
-	    <errorlink id="JVMTI_ERROR_NONE"></errorlink>
-	    if the thread was suspended by this call.
-	    Possible error codes are those specified
-	    for <functionlink id="SuspendThread"></functionlink>.
-	  </description>
-	</param>
+          <outbuf incount="request_count"><enum>jvmtiError</enum></outbuf>
+          <description>
+            An agent supplied array of
+            <paramlink id="request_count"></paramlink> elements.
+            On return, filled with the error code for
+            the suspend of the corresponding thread.
+            The error code will be
+            <errorlink id="JVMTI_ERROR_NONE"></errorlink>
+            if the thread was suspended by this call.
+            Possible error codes are those specified
+            for <functionlink id="SuspendThread"></functionlink>.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1720,7 +1720,7 @@
         <functionlink id="SuspendThread"></functionlink>)
         or <code>java.lang.Thread.suspend()</code>
         will resume execution;
-	all other threads are unaffected.
+        all other threads are unaffected.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
@@ -1728,11 +1728,11 @@
       </capabilities>
       <parameters>
         <param id="thread">
-	  <jthread/>
-	    <description>
-	      The thread to resume.
-	    </description>
-	</param>
+          <jthread/>
+            <description>
+              The thread to resume.
+            </description>
+        </param>
       </parameters>
       <errors>
         <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
@@ -1762,31 +1762,31 @@
       </capabilities>
       <parameters>
         <param id="request_count">
-	  <jint min="0"/>
-	  <description>
-	    The number of threads to resume.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The number of threads to resume.
+          </description>
+        </param>
         <param id="request_list">
-	  <inbuf incount="request_count"><jthread/></inbuf>
-	    <description>
-	      The threads to resume.
-	    </description>
-	</param>
+          <inbuf incount="request_count"><jthread/></inbuf>
+            <description>
+              The threads to resume.
+            </description>
+        </param>
         <param id="results">
-	  <outbuf incount="request_count"><enum>jvmtiError</enum></outbuf>
-	  <description>
-	    An agent supplied array of
-	    <paramlink id="request_count"></paramlink> elements.
-	    On return, filled with the error code for
-	    the resume of the corresponding thread.
-	    The error code will be
-	    <errorlink id="JVMTI_ERROR_NONE"></errorlink>
-	    if the thread was suspended by this call.
-	    Possible error codes are those specified
-	    for <functionlink id="ResumeThread"></functionlink>.
-	  </description>
-	</param>
+          <outbuf incount="request_count"><enum>jvmtiError</enum></outbuf>
+          <description>
+            An agent supplied array of
+            <paramlink id="request_count"></paramlink> elements.
+            On return, filled with the error code for
+            the resume of the corresponding thread.
+            The error code will be
+            <errorlink id="JVMTI_ERROR_NONE"></errorlink>
+            if the thread was suspended by this call.
+            Possible error codes are those specified
+            for <functionlink id="ResumeThread"></functionlink>.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1795,28 +1795,28 @@
     <function id="StopThread" num="7">
       <synopsis>Stop Thread</synopsis>
       <description>
-	Send the specified asynchronous exception to the specified thread.
-	Normally, this function is used to kill the specified thread with an
-	instance of the exception <code>ThreadDeath</code>, similar to
+        Send the specified asynchronous exception to the specified thread.
+        Normally, this function is used to kill the specified thread with an
+        instance of the exception <code>ThreadDeath</code>, similar to
         <code>java.lang.Thread.stop</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_signal_thread"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread/>
-	    <description>
-	      The thread to stop.
-	    </description>
-	</param>
-	<param id="exception">
-	  <jobject/>
-	    <description>
-	      The asynchronous exception object.
-	    </description>
-	</param>
+        <required id="can_signal_thread"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread/>
+            <description>
+              The thread to stop.
+            </description>
+        </param>
+        <param id="exception">
+          <jobject/>
+            <description>
+              The asynchronous exception object.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1825,20 +1825,20 @@
     <function id="InterruptThread" num="8">
       <synopsis>Interrupt Thread</synopsis>
       <description>
-	Interrupt the specified thread
-	(similar to <code>java.lang.Thread.interrupt</code>).
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_signal_thread"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread impl="noconvert"/>
-	    <description>
-	      The thread to interrupt.
-	    </description>
-	</param>
+        Interrupt the specified thread
+        (similar to <code>java.lang.Thread.interrupt</code>).
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_signal_thread"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread impl="noconvert"/>
+            <description>
+              The thread to interrupt.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1847,60 +1847,60 @@
     <function id="GetThreadInfo" num="9">
       <synopsis>Get Thread Info</synopsis>
       <typedef id="jvmtiThreadInfo" label="Thread information structure">
-	<field id="name">
-	  <allocfieldbuf><char/></allocfieldbuf>
-	  <description>
-	    The thread name, encoded as a
-	    <internallink id="mUTF">modified UTF-8</internallink> string.
-	  </description>
-	</field>
-	<field id="priority">
-	  <jint/>
-	  <description>
-	    The thread priority.  See the thread priority constants:
-	    <datalink id="jvmtiThreadPriority"></datalink>.
-	  </description>
-	</field>
-	<field id="is_daemon">
-	  <jboolean/>
-	  <description>
-	    Is this a daemon thread?
-	  </description>
-	</field>
-	<field id="thread_group">
-	  <jthreadGroup/>
-	  <description>
-	    The thread group to which this thread belongs.
+        <field id="name">
+          <allocfieldbuf><char/></allocfieldbuf>
+          <description>
+            The thread name, encoded as a
+            <internallink id="mUTF">modified UTF-8</internallink> string.
+          </description>
+        </field>
+        <field id="priority">
+          <jint/>
+          <description>
+            The thread priority.  See the thread priority constants:
+            <datalink id="jvmtiThreadPriority"></datalink>.
+          </description>
+        </field>
+        <field id="is_daemon">
+          <jboolean/>
+          <description>
+            Is this a daemon thread?
+          </description>
+        </field>
+        <field id="thread_group">
+          <jthreadGroup/>
+          <description>
+            The thread group to which this thread belongs.
             <code>NULL</code> if the thread has died.
-	  </description>
-	</field>
-	<field id="context_class_loader">
-	  <jobject/>
-	    <description>
-	      The context class loader associated with this thread.
-	    </description>
-	</field>
+          </description>
+        </field>
+        <field id="context_class_loader">
+          <jobject/>
+            <description>
+              The context class loader associated with this thread.
+            </description>
+        </field>
       </typedef>
       <description>
-	Get thread information. The fields of the <datalink id="jvmtiThreadInfo"/> structure
-	are filled in with details of the specified thread.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current" impl="noconvert" started="maybe"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="info_ptr">
-	  <outptr><struct>jvmtiThreadInfo</struct></outptr>
-	  <description>
-	    On return, filled with information describing the specified thread.
-	  </description>
-	</param>
+        Get thread information. The fields of the <datalink id="jvmtiThreadInfo"/> structure
+        are filled in with details of the specified thread.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" impl="noconvert" started="maybe"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="info_ptr">
+          <outptr><struct>jvmtiThreadInfo</struct></outptr>
+          <description>
+            On return, filled with information describing the specified thread.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1909,32 +1909,32 @@
     <function id="GetOwnedMonitorInfo" num="10">
       <synopsis>Get Owned Monitor Info</synopsis>
       <description>
-	Get information about the monitors owned by the
-	specified thread.
+        Get information about the monitors owned by the
+        specified thread.
       </description>
       <origin>jvmdiClone</origin>
       <capabilities>
-	<required id="can_get_owned_monitor_info"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="owned_monitor_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    The number of monitors returned.
-	  </description>
-	</param>
-	<param id="owned_monitors_ptr">
-	  <allocbuf outcount="owned_monitor_count_ptr"><jobject/></allocbuf>
-	    <description>
-	      The array of owned monitors.
-	    </description>
-	</param>
+        <required id="can_get_owned_monitor_info"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="owned_monitor_count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            The number of monitors returned.
+          </description>
+        </param>
+        <param id="owned_monitors_ptr">
+          <allocbuf outcount="owned_monitor_count_ptr"><jobject/></allocbuf>
+            <description>
+              The array of owned monitors.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1945,52 +1945,52 @@
       <typedef id="jvmtiMonitorStackDepthInfo"
                label="Monitor stack depth information structure">
         <field id="monitor">
-	  <jobject/>
-	    <description>
-	      The owned monitor.
-	    </description>
-	</field>
+          <jobject/>
+            <description>
+              The owned monitor.
+            </description>
+        </field>
         <field id="stack_depth">
-	  <jint/>
-	  <description>
-	    The stack depth.  Corresponds to the stack depth used in the
+          <jint/>
+          <description>
+            The stack depth.  Corresponds to the stack depth used in the
             <internallink id="stack">Stack Frame functions</internallink>.
             That is, zero is the current frame, one is the frame which
             called the current frame. And it is negative one if the
-	    implementation cannot determine the stack depth (e.g., for
-	    monitors acquired by JNI <code>MonitorEnter</code>).
-	  </description>
-	</field>
+            implementation cannot determine the stack depth (e.g., for
+            monitors acquired by JNI <code>MonitorEnter</code>).
+          </description>
+        </field>
       </typedef>
       <description>
-	Get information about the monitors owned by the
-	specified thread and the depth of the stack frame which locked them.
-      </description>
-      <origin>new</origin>
-      <capabilities>
-	<required id="can_get_owned_monitor_stack_depth_info"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="monitor_info_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    The number of monitors returned.
-	  </description>
-	</param>
-	<param id="monitor_info_ptr">
-	  <allocbuf outcount="monitor_info_count_ptr">
+        Get information about the monitors owned by the
+        specified thread and the depth of the stack frame which locked them.
+      </description>
+      <origin>new</origin>
+      <capabilities>
+        <required id="can_get_owned_monitor_stack_depth_info"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="monitor_info_count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            The number of monitors returned.
+          </description>
+        </param>
+        <param id="monitor_info_ptr">
+          <allocbuf outcount="monitor_info_count_ptr">
             <struct>jvmtiMonitorStackDepthInfo</struct>
           </allocbuf>
-	  <description>
-	    The array of owned monitor depth information.
-	  </description>
-	</param>
+          <description>
+            The array of owned monitor depth information.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -1999,27 +1999,27 @@
     <function id="GetCurrentContendedMonitor" num="11">
       <synopsis>Get Current Contended Monitor</synopsis>
       <description>
-	Get the object, if any, whose monitor the specified thread is waiting to
-	enter or waiting to regain through <code>java.lang.Object.wait</code>.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_get_current_contended_monitor"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="monitor_ptr">
-	  <outptr><jobject/></outptr>
-	    <description>
-	      On return, filled with the current contended monitor, or
-	      NULL if there is none.
-	    </description>
-	</param>
+        Get the object, if any, whose monitor the specified thread is waiting to
+        enter or waiting to regain through <code>java.lang.Object.wait</code>.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_get_current_contended_monitor"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="monitor_ptr">
+          <outptr><jobject/></outptr>
+            <description>
+              On return, filled with the current contended monitor, or
+              NULL if there is none.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2031,18 +2031,18 @@
       <description>
         Agent supplied callback function.
         This function is the entry point for an agent thread
-	started with
-	<functionlink id="RunAgentThread"></functionlink>.
-      </description>
-      <parameters>
-	  <param id="jvmti_env">
-	    <outptr>
-	      <struct>jvmtiEnv</struct>
-	    </outptr>
-	    <description>
-	      The <jvmti/> environment.
-	    </description>
-	  </param>
+        started with
+        <functionlink id="RunAgentThread"></functionlink>.
+      </description>
+      <parameters>
+          <param id="jvmti_env">
+            <outptr>
+              <struct>jvmtiEnv</struct>
+            </outptr>
+            <description>
+              The <jvmti/> environment.
+            </description>
+          </param>
           <param id="jni_env">
             <outptr>
               <struct>JNIEnv</struct>
@@ -2066,111 +2066,111 @@
     <function id="RunAgentThread" num="12">
       <synopsis>Run Agent Thread</synopsis>
       <description>
-	Starts the execution of an agent thread. with the specified native function.
-	The parameter <paramlink id="arg"></paramlink> is forwarded on to the
-	<functionlink id="jvmtiStartFunction">start function</functionlink>
-	(specified with <paramlink id="proc"></paramlink>) as its single argument.
-	This function allows the creation of agent threads
-	for handling communication with another process or for handling events
-	without the need to load a special subclass of <code>java.lang.Thread</code> or
-	implementer of <code>java.lang.Runnable</code>.
-	Instead, the created thread can run entirely in native code.
-	However, the created thread does require a newly created instance
-	of <code>java.lang.Thread</code> (referenced by the argument <code>thread</code>) to
-	which it will be associated.
-	The thread object can be created with JNI calls.
-	<p/>
-	The following common thread priorities are provided for your convenience:
-	<constants id="jvmtiThreadPriority" label="Thread Priority Constants" kind="const">
-	  <constant id="JVMTI_THREAD_MIN_PRIORITY" num="1">
-	    Minimum possible thread priority
-	  </constant>
-	  <constant id="JVMTI_THREAD_NORM_PRIORITY" num="5">
-	    Normal thread priority
-	  </constant>
-	  <constant id="JVMTI_THREAD_MAX_PRIORITY" num="10">
-	    Maximum possible thread priority
-	  </constant>
-	</constants>
-	<p/>
-	The new thread is started as a daemon thread with the specified
-	<paramlink id="priority"></paramlink>.
+        Starts the execution of an agent thread. with the specified native function.
+        The parameter <paramlink id="arg"></paramlink> is forwarded on to the
+        <functionlink id="jvmtiStartFunction">start function</functionlink>
+        (specified with <paramlink id="proc"></paramlink>) as its single argument.
+        This function allows the creation of agent threads
+        for handling communication with another process or for handling events
+        without the need to load a special subclass of <code>java.lang.Thread</code> or
+        implementer of <code>java.lang.Runnable</code>.
+        Instead, the created thread can run entirely in native code.
+        However, the created thread does require a newly created instance
+        of <code>java.lang.Thread</code> (referenced by the argument <code>thread</code>) to
+        which it will be associated.
+        The thread object can be created with JNI calls.
+        <p/>
+        The following common thread priorities are provided for your convenience:
+        <constants id="jvmtiThreadPriority" label="Thread Priority Constants" kind="const">
+          <constant id="JVMTI_THREAD_MIN_PRIORITY" num="1">
+            Minimum possible thread priority
+          </constant>
+          <constant id="JVMTI_THREAD_NORM_PRIORITY" num="5">
+            Normal thread priority
+          </constant>
+          <constant id="JVMTI_THREAD_MAX_PRIORITY" num="10">
+            Maximum possible thread priority
+          </constant>
+        </constants>
+        <p/>
+        The new thread is started as a daemon thread with the specified
+        <paramlink id="priority"></paramlink>.
         If enabled, a <eventlink id="ThreadStart"/> event will be sent.
-	<p/>
+        <p/>
         Since the thread has been started, the thread will be live when this function
         returns, unless the thread has died immediately.
-	<p/>
+        <p/>
         The thread group of the thread is ignored -- specifically, the thread is not
         added to the thread group and the thread is not seen on queries of the thread
         group at either the Java programming language or <jvmti/> levels.
-	<p/>
+        <p/>
         The thread is not visible to Java programming language queries but is
         included in <jvmti/> queries (for example,
         <functionlink id="GetAllThreads"/> and
         <functionlink id="GetAllStackTraces"/>).
-	<p/>
-	Upon execution of <code>proc</code>, the new thread will be attached to the
-	VM -- see the JNI documentation on
-	<externallink id="jni/invocation.html#attaching-to-the-vm"
-		      >Attaching to the VM</externallink>.
+        <p/>
+        Upon execution of <code>proc</code>, the new thread will be attached to the
+        VM -- see the JNI documentation on
+        <externallink id="jni/invocation.html#attaching-to-the-vm"
+                      >Attaching to the VM</externallink>.
       </description>
       <origin>jvmdiClone</origin>
       <capabilities>
       </capabilities>
       <parameters>
-	<param id="thread">
-	  <jthread impl="noconvert" started="no"/>
-	    <description>
-	      The thread to run.
-	    </description>
-	</param>
-	<param id="proc">
-	  <ptrtype>
-	    <struct>jvmtiStartFunction</struct>
-	  </ptrtype>
-	  <description>
-	    The start function.
-	  </description>
-	</param>
-	<param id="arg">
-	  <inbuf>
+        <param id="thread">
+          <jthread impl="noconvert" started="no"/>
+            <description>
+              The thread to run.
+            </description>
+        </param>
+        <param id="proc">
+          <ptrtype>
+            <struct>jvmtiStartFunction</struct>
+          </ptrtype>
+          <description>
+            The start function.
+          </description>
+        </param>
+        <param id="arg">
+          <inbuf>
             <void/>
             <nullok><code>NULL</code> is passed to the start function</nullok>
           </inbuf>
-	  <description>
-	    The argument to the start function.
-	  </description>
-	</param>
-	<param id="priority">
-	  <jint/>
-	  <description>
-	    The priority of the started thread. Any thread
-	    priority allowed by <code>java.lang.Thread.setPriority</code> can be used including
-	    those in <datalink id="jvmtiThreadPriority"></datalink>.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_PRIORITY">
+          <description>
+            The argument to the start function.
+          </description>
+        </param>
+        <param id="priority">
+          <jint/>
+          <description>
+            The priority of the started thread. Any thread
+            priority allowed by <code>java.lang.Thread.setPriority</code> can be used including
+            those in <datalink id="jvmtiThreadPriority"></datalink>.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_PRIORITY">
             <paramlink id="priority"/> is less than
             <datalink id="JVMTI_THREAD_MIN_PRIORITY"/>
               or greater than
             <datalink id="JVMTI_THREAD_MAX_PRIORITY"/>
-	</error>
+        </error>
       </errors>
     </function>
 
     <function id="SetThreadLocalStorage" jkernel="yes" impl="notrace" phase="start" num="103">
       <synopsis>Set Thread Local Storage</synopsis>
       <description>
-	The VM stores a pointer value associated with each environment-thread
-	pair. This pointer value is called <i>thread-local storage</i>.
+        The VM stores a pointer value associated with each environment-thread
+        pair. This pointer value is called <i>thread-local storage</i>.
         This value is <code>NULL</code> unless set with this function.
-	Agents can allocate memory in which they store thread specific
+        Agents can allocate memory in which they store thread specific
         information. By setting thread-local storage it can then be
-	accessed with
-	<functionlink id="GetThreadLocalStorage"></functionlink>.
-	<p/>
+        accessed with
+        <functionlink id="GetThreadLocalStorage"></functionlink>.
+        <p/>
         This function is called by the agent to set the value of the <jvmti/>
         thread-local storage. <jvmti/> supplies to the agent a pointer-size
         thread-local storage that can be used to record per-thread
@@ -2181,20 +2181,20 @@
       </capabilities>
       <parameters>
         <param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      Store to this thread.
-	    </description>
-	</param>
+          <jthread null="current"/>
+            <description>
+              Store to this thread.
+            </description>
+        </param>
         <param id="data">
-	  <inbuf>
-	    <void/>
-	    <nullok>value is set to <code>NULL</code></nullok>
-	  </inbuf>
-	  <description>
-	    The value to be entered into the thread-local storage.
-	  </description>
-	</param>
+          <inbuf>
+            <void/>
+            <nullok>value is set to <code>NULL</code></nullok>
+          </inbuf>
+          <description>
+            The value to be entered into the thread-local storage.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2211,21 +2211,21 @@
       </capabilities>
       <parameters>
         <param id="thread">
-	  <jthread null="current" impl="noconvert"/>
-	    <description>
-	      Retrieve from this thread.
-	    </description>
-	</param>
+          <jthread null="current" impl="noconvert"/>
+            <description>
+              Retrieve from this thread.
+            </description>
+        </param>
         <param id="data_ptr">
-	  <agentbuf><void/></agentbuf>
-	  <description>
-	    Pointer through which the value of the thread local
-	    storage is returned.
-	    If thread-local storage has not been set with
-	    <functionlink id="SetThreadLocalStorage"></functionlink> the returned
-	    pointer is <code>NULL</code>.
-	  </description>
-	</param>
+          <agentbuf><void/></agentbuf>
+          <description>
+            Pointer through which the value of the thread local
+            storage is returned.
+            If thread-local storage has not been set with
+            <functionlink id="SetThreadLocalStorage"></functionlink> the returned
+            pointer is <code>NULL</code>.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2240,24 +2240,24 @@
     <function id="GetTopThreadGroups" num="13">
       <synopsis>Get Top Thread Groups</synopsis>
       <description>
-	Return all top-level (parentless) thread groups in the VM.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="group_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of top-level thread groups.
-	  </description>
-	</param>
-	<param id="groups_ptr">
-	  <allocbuf outcount="group_count_ptr"><jthreadGroup/></allocbuf>
-	    <description>
-	      On return, refers to a pointer to the top-level thread group array.
-	    </description>
-	</param>
+        Return all top-level (parentless) thread groups in the VM.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="group_count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of top-level thread groups.
+          </description>
+        </param>
+        <param id="groups_ptr">
+          <allocbuf outcount="group_count_ptr"><jthreadGroup/></allocbuf>
+            <description>
+              On return, refers to a pointer to the top-level thread group array.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2266,54 +2266,54 @@
     <function id="GetThreadGroupInfo" num="14">
       <synopsis>Get Thread Group Info</synopsis>
       <typedef id="jvmtiThreadGroupInfo" label="Thread group information structure">
-	<field id="parent">
-	  <jthreadGroup/>
-	  <description>
-	    The parent thread group.
-	  </description>
-	</field>
-	<field id="name">
-	  <allocfieldbuf><char/></allocfieldbuf>
-	  <description>
-	    The thread group's name, encoded as a
-	    <internallink id="mUTF">modified UTF-8</internallink> string.
-	  </description>
-	</field>
-	<field id="max_priority">
-	  <jint/>
-	  <description>
-	    The maximum priority for this thread group.
-	  </description>
-	</field>
-	<field id="is_daemon">
-	  <jboolean/>
-	  <description>
-	    Is this a daemon thread group?
-	  </description>
-	</field>
+        <field id="parent">
+          <jthreadGroup/>
+          <description>
+            The parent thread group.
+          </description>
+        </field>
+        <field id="name">
+          <allocfieldbuf><char/></allocfieldbuf>
+          <description>
+            The thread group's name, encoded as a
+            <internallink id="mUTF">modified UTF-8</internallink> string.
+          </description>
+        </field>
+        <field id="max_priority">
+          <jint/>
+          <description>
+            The maximum priority for this thread group.
+          </description>
+        </field>
+        <field id="is_daemon">
+          <jboolean/>
+          <description>
+            Is this a daemon thread group?
+          </description>
+        </field>
       </typedef>
       <description>
-	Get information about the thread group. The fields of the
-	<functionlink id="jvmtiThreadGroupInfo"></functionlink> structure
-	are filled in with details of the specified thread group.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="group">
-	  <jthreadGroup/>
-	  <description>
-	    The thread group to query.
-	  </description>
-	</param>
-	<param id="info_ptr">
-	  <outptr><struct>jvmtiThreadGroupInfo</struct></outptr>
-	  <description>
-	    On return, filled with information describing the specified
-	    thread group.
-	  </description>
-	</param>
+        Get information about the thread group. The fields of the
+        <functionlink id="jvmtiThreadGroupInfo"></functionlink> structure
+        are filled in with details of the specified thread group.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="group">
+          <jthreadGroup/>
+          <description>
+            The thread group to query.
+          </description>
+        </param>
+        <param id="info_ptr">
+          <outptr><struct>jvmtiThreadGroupInfo</struct></outptr>
+          <description>
+            On return, filled with information describing the specified
+            thread group.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2322,42 +2322,42 @@
     <function id="GetThreadGroupChildren" num="15">
       <synopsis>Get Thread Group Children</synopsis>
       <description>
-	Get the live threads and active subgroups in this thread group.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="group">
-	  <jthreadGroup/>
-	  <description>
-	    The group to query.
-	  </description>
-	</param>
-	<param id="thread_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of live threads in this thread group.
-	  </description>
-	</param>
-	<param id="threads_ptr">
-	  <allocbuf outcount="thread_count_ptr"><jthread/></allocbuf>
-	    <description>
-	      On return, points to an array of the live threads in this thread group.
-	    </description>
-	</param>
-	<param id="group_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of active child thread groups
-	  </description>
-	</param>
-	<param id="groups_ptr">
-	  <allocbuf outcount="group_count_ptr"><jthreadGroup/></allocbuf>
-	    <description>
-	      On return, points to an array of the active child thread groups.
-	    </description>
-	</param>
+        Get the live threads and active subgroups in this thread group.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="group">
+          <jthreadGroup/>
+          <description>
+            The group to query.
+          </description>
+        </param>
+        <param id="thread_count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of live threads in this thread group.
+          </description>
+        </param>
+        <param id="threads_ptr">
+          <allocbuf outcount="thread_count_ptr"><jthread/></allocbuf>
+            <description>
+              On return, points to an array of the live threads in this thread group.
+            </description>
+        </param>
+        <param id="group_count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of active child thread groups
+          </description>
+        </param>
+        <param id="groups_ptr">
+          <allocbuf outcount="group_count_ptr"><jthreadGroup/></allocbuf>
+            <description>
+              On return, points to an array of the active child thread groups.
+            </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2389,18 +2389,18 @@
           Information about a stack frame is returned in this structure.
         </description>
         <field id="method">
-	  <jmethodID/>
-	    <description>
-	      The method executing in this frame.
-	    </description>
-	</field>
+          <jmethodID/>
+            <description>
+              The method executing in this frame.
+            </description>
+        </field>
         <field id="location">
-	  <jlocation/>
-	  <description>
-	    The index of the instruction executing in this frame.
+          <jlocation/>
+          <description>
+            The index of the instruction executing in this frame.
             <code>-1</code> if the frame is executing a native method.
-	  </description>
-	</field>
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiStackInfo" label="Stack information structure">
@@ -2408,35 +2408,35 @@
           Information about a set of stack frames is returned in this structure.
         </description>
         <field id="thread">
-	  <jthread/>
-	  <description>
-	    On return, the thread traced.
-	  </description>
-	</field>
+          <jthread/>
+          <description>
+            On return, the thread traced.
+          </description>
+        </field>
         <field id="state">
-	  <jint/>
-	  <description>
-	    On return, the thread state. See <functionlink id="GetThreadState"></functionlink>.
-	  </description>
-	</field>
+          <jint/>
+          <description>
+            On return, the thread state. See <functionlink id="GetThreadState"></functionlink>.
+          </description>
+        </field>
         <field id="frame_buffer">
-	  <outbuf incount="max_frame_count">
-	    <struct>jvmtiFrameInfo</struct>
-	  </outbuf>
-	    <description>
-	      On return, this agent allocated buffer is filled
-	      with stack frame information.
-	    </description>
-	</field>
+          <outbuf incount="max_frame_count">
+            <struct>jvmtiFrameInfo</struct>
+          </outbuf>
+            <description>
+              On return, this agent allocated buffer is filled
+              with stack frame information.
+            </description>
+        </field>
         <field id="frame_count">
-	  <jint/>
-	  <description>
-	    On return, the number of records filled into
+          <jint/>
+          <description>
+            On return, the number of records filled into
             <code>frame_buffer</code>.
             This will be
             min(<code>max_frame_count</code>, <i>stackDepth</i>).
-	  </description>
-	</field>
+          </description>
+        </field>
       </typedef>
 
     <function id="GetStackTrace" num="104">
@@ -2483,15 +2483,15 @@
       </capabilities>
       <parameters>
         <param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      Fetch the stack trace of this thread.
-	    </description>
-	</param>
+          <jthread null="current"/>
+            <description>
+              Fetch the stack trace of this thread.
+            </description>
+        </param>
         <param id="start_depth">
-	  <jint/>
-	  <description>
-	    Begin retrieving frames at this depth.
+          <jint/>
+          <description>
+            Begin retrieving frames at this depth.
             If non-negative, count from the current frame,
             the first frame retrieved is at depth <code>start_depth</code>.
             For example, if zero, start from the current frame; if one, start from the
@@ -2502,39 +2502,39 @@
             where <i>stackDepth</i> is the count of frames on the stack.
             For example, if negative one, only the oldest frame is retrieved;
             if negative two, start from the frame called by the oldest frame.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="max_frame_count">
-	  <jint min="0"/>
-	  <description>
-	    The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve.
+          </description>
+        </param>
         <param id="frame_buffer">
-	  <outbuf incount="max_frame_count" outcount="count_ptr">
-	    <struct>jvmtiFrameInfo</struct>
-	  </outbuf>
-	    <description>
-	      On return, this agent allocated buffer is filled
-	      with stack frame information.
-	    </description>
-	</param>
+          <outbuf incount="max_frame_count" outcount="count_ptr">
+            <struct>jvmtiFrameInfo</struct>
+          </outbuf>
+            <description>
+              On return, this agent allocated buffer is filled
+              with stack frame information.
+            </description>
+        </param>
         <param id="count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of records filled in.
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of records filled in.
             For non-negative <code>start_depth</code>, this will be
             min(<code>max_frame_count</code>, <i>stackDepth</i><code> - start_depth</code>).
             For negative <code>start_depth</code>, this will be
             min(<code>max_frame_count</code>, <code>-start_depth</code>).
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
-	  <paramlink id="start_depth"/> is positive and greater than or equal to <i>stackDepth</i>.
-	  Or <paramlink id="start_depth"/> is negative and less than <i>-stackDepth</i>.
-	</error>
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
+          <paramlink id="start_depth"/> is positive and greater than or equal to <i>stackDepth</i>.
+          Or <paramlink id="start_depth"/> is negative and less than <i>-stackDepth</i>.
+        </error>
       </errors>
     </function>
 
@@ -2588,32 +2588,32 @@
       </capabilities>
       <parameters>
         <param id="max_frame_count">
-	  <jint min="0"/>
-	  <description>
-	    The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve per thread.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve per thread.
+          </description>
+        </param>
         <param id="stack_info_ptr">
-	  <allocbuf>
-	    <struct>jvmtiStackInfo</struct>
-	  </allocbuf>
-	    <description>
-	      On return, this buffer is filled
-	      with stack information for each thread.
+          <allocbuf>
+            <struct>jvmtiStackInfo</struct>
+          </allocbuf>
+            <description>
+              On return, this buffer is filled
+              with stack information for each thread.
               The number of <datalink id="jvmtiStackInfo"/> records is determined
               by <paramlink id="thread_count_ptr"/>.
               <p/>
               Note that this buffer is allocated to include the <datalink id="jvmtiFrameInfo"/>
               buffers pointed to by <datalink id="jvmtiStackInfo.frame_buffer"/>.
               These buffers must not be separately deallocated.
-	    </description>
-	</param>
+            </description>
+        </param>
         <param id="thread_count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    The number of threads traced.
-	  </description>
-	</param>
+          <outptr><jint/></outptr>
+          <description>
+            The number of threads traced.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2644,43 +2644,43 @@
       </capabilities>
       <parameters>
         <param id="thread_count">
-	  <jint min="0"/>
-	  <description>
-	    The number of threads to trace.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The number of threads to trace.
+          </description>
+        </param>
         <param id="thread_list">
-	  <inbuf incount="thread_count"><jthread/></inbuf>
-	    <description>
-	      The list of threads to trace.
-	    </description>
-	</param>
+          <inbuf incount="thread_count"><jthread/></inbuf>
+            <description>
+              The list of threads to trace.
+            </description>
+        </param>
         <param id="max_frame_count">
-	  <jint min="0"/>
-	  <description>
-	    The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve per thread.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve per thread.
+          </description>
+        </param>
         <param id="stack_info_ptr">
-	  <allocbuf outcount="thread_count">
-	    <struct>jvmtiStackInfo</struct>
-	  </allocbuf>
-	    <description>
-	      On return, this buffer is filled
-	      with stack information for each thread.
+          <allocbuf outcount="thread_count">
+            <struct>jvmtiStackInfo</struct>
+          </allocbuf>
+            <description>
+              On return, this buffer is filled
+              with stack information for each thread.
               The number of <datalink id="jvmtiStackInfo"/> records is determined
               by <paramlink id="thread_count"/>.
               <p/>
               Note that this buffer is allocated to include the <datalink id="jvmtiFrameInfo"/>
               buffers pointed to by <datalink id="jvmtiStackInfo.frame_buffer"/>.
               These buffers must not be separately deallocated.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_THREAD">
-	  An element in <paramlink id="thread_list"/> is not a thread object.
-	</error>
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_THREAD">
+          An element in <paramlink id="thread_list"/> is not a thread object.
+        </error>
       </errors>
     </function>
 
@@ -2709,41 +2709,41 @@
       </capabilities>
       <parameters>
         <param id="use_java_stack">
-	  <jboolean/>
-	  <description>
-	    Return the stack showing <vmspec/>
-	    model of the stack;
-	    otherwise, show the internal representation of the stack with
-	    inlined and optimized methods missing.  If the virtual machine
-	    is using the <i>Java Virtual Machine Specification</i> stack model
-	    internally, this flag is ignored.
-	  </description>
-	</param>
+          <jboolean/>
+          <description>
+            Return the stack showing <vmspec/>
+            model of the stack;
+            otherwise, show the internal representation of the stack with
+            inlined and optimized methods missing.  If the virtual machine
+            is using the <i>Java Virtual Machine Specification</i> stack model
+            internally, this flag is ignored.
+          </description>
+        </param>
         <param id="max_count">
-	  <jint min="0"/>
-	  <description>
-	    The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve.
-	    Retrieve this many unless the stack depth is less than <code>max_count</code>.
-	  </description>
-	</param>
+          <jint min="0"/>
+          <description>
+            The maximum number of <datalink id="jvmtiFrameInfo"/> records to retrieve.
+            Retrieve this many unless the stack depth is less than <code>max_count</code>.
+          </description>
+        </param>
         <param id="frame_buffer">
-	  <outbuf incount="max_count" outcount="count_ptr">
-	    <struct>jvmtiFrameInfo</struct>
-	    <nullok>this information is not returned</nullok>
-	  </outbuf>
-	    <description>
-	      The agent passes in a buffer
-	      large enough to hold <code>max_count</code> records of
-	      <datalink id="jvmtiFrameInfo"></datalink>.  This buffer must be
-	      pre-allocated by the agent.
-	    </description>
-	</param>
+          <outbuf incount="max_count" outcount="count_ptr">
+            <struct>jvmtiFrameInfo</struct>
+            <nullok>this information is not returned</nullok>
+          </outbuf>
+            <description>
+              The agent passes in a buffer
+              large enough to hold <code>max_count</code> records of
+              <datalink id="jvmtiFrameInfo"></datalink>.  This buffer must be
+              pre-allocated by the agent.
+            </description>
+        </param>
         <param id="count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of records filled in..
-	  </description>
-	</param>
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of records filled in..
+          </description>
+        </param>
       </parameters>
       <errors>
         <error id="JVMTI_ERROR_UNATTACHED_THREAD">
@@ -2757,27 +2757,27 @@
     <function id="GetFrameCount" num="16">
       <synopsis>Get Frame Count</synopsis>
       <description>
-	Get the number of frames currently in the specified thread's call stack.
-	<p/>
-	If this function is called for a thread actively executing bytecodes (for example,
-	not the current thread and not suspended), the information returned is transient.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	    <description>
-	      The thread to query.
-	    </description>
-	</param>
-	<param id="count_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the number of frames in the call stack.
-	  </description>
-	</param>
+        Get the number of frames currently in the specified thread's call stack.
+        <p/>
+        If this function is called for a thread actively executing bytecodes (for example,
+        not the current thread and not suspended), the information returned is transient.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+            <description>
+              The thread to query.
+            </description>
+        </param>
+        <param id="count_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the number of frames in the call stack.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2786,117 +2786,117 @@
     <function id="PopFrame" num="80">
       <synopsis>Pop Frame</synopsis>
       <description>
-	Pop the current frame of <code>thread</code>'s stack.
-	Popping a frame takes you to the previous frame.
-	When the thread is resumed, the execution
-	state of the thread is reset to the state
-	immediately before the called method was invoked.
-	That is (using <vmspec/> terminology):
-	  <ul>
-	    <li>the current frame is discarded as the previous frame becomes the current one</li>
-	    <li>the operand stack is restored--the argument values are added back
-	      and if the invoke was not <code>invokestatic</code>,
-	      <code>objectref</code> is added back as well</li>
-	    <li>the Java virtual machine PC is restored to the opcode
-	      of the invoke instruction</li>
-	  </ul>
-	Note however, that any changes to the arguments, which
-	occurred in the called method, remain;
-	when execution continues, the first instruction to
-	execute will be the invoke.
-	<p/>
-	Between calling <code>PopFrame</code> and resuming the
-	thread the state of the stack is undefined.
-	To pop frames beyond the first,
-	these three steps must be repeated:
-	<ul>
-	  <li>suspend the thread via an event (step, breakpoint, ...)</li>
-	  <li>call <code>PopFrame</code></li>
-	  <li>resume the thread</li>
-	</ul>
-	<p/>
-	A lock acquired by calling the called method
-	(if it is a <code>synchronized</code>  method)
-	and locks acquired by entering <code>synchronized</code>
-	blocks within the called method are released.
-	Note: this does not apply to native locks or
-	<code>java.util.concurrent.locks</code> locks.
-	<p/>
-	Finally blocks are not executed.
-	<p/>
-	Changes to global state are not addressed and thus remain changed.
-	<p/>
-	The specified thread must be suspended or must be the current thread.
-	<p/>
-	Both the called method and calling method must be non-native Java programming
+        Pop the current frame of <code>thread</code>'s stack.
+        Popping a frame takes you to the previous frame.
+        When the thread is resumed, the execution
+        state of the thread is reset to the state
+        immediately before the called method was invoked.
+        That is (using <vmspec/> terminology):
+          <ul>
+            <li>the current frame is discarded as the previous frame becomes the current one</li>
+            <li>the operand stack is restored--the argument values are added back
+              and if the invoke was not <code>invokestatic</code>,
+              <code>objectref</code> is added back as well</li>
+            <li>the Java virtual machine PC is restored to the opcode
+              of the invoke instruction</li>
+          </ul>
+        Note however, that any changes to the arguments, which
+        occurred in the called method, remain;
+        when execution continues, the first instruction to
+        execute will be the invoke.
+        <p/>
+        Between calling <code>PopFrame</code> and resuming the
+        thread the state of the stack is undefined.
+        To pop frames beyond the first,
+        these three steps must be repeated:
+        <ul>
+          <li>suspend the thread via an event (step, breakpoint, ...)</li>
+          <li>call <code>PopFrame</code></li>
+          <li>resume the thread</li>
+        </ul>
+        <p/>
+        A lock acquired by calling the called method
+        (if it is a <code>synchronized</code>  method)
+        and locks acquired by entering <code>synchronized</code>
+        blocks within the called method are released.
+        Note: this does not apply to native locks or
+        <code>java.util.concurrent.locks</code> locks.
+        <p/>
+        Finally blocks are not executed.
+        <p/>
+        Changes to global state are not addressed and thus remain changed.
+        <p/>
+        The specified thread must be suspended or must be the current thread.
+        <p/>
+        Both the called method and calling method must be non-native Java programming
         language methods.
-	<p/>
-	No <jvmti/> events are generated by this function.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_pop_frame"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread/>
-	    <description>
-	      The thread whose current frame is to be popped.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Called or calling method is a native method.
+        <p/>
+        No <jvmti/> events are generated by this function.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_pop_frame"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread/>
+            <description>
+              The thread whose current frame is to be popped.
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Called or calling method is a native method.
           The implementation is unable to pop this frame.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are less than two stack frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are less than two stack frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="GetFrameLocation" num="19">
       <synopsis>Get Frame Location</synopsis>
       <description>
-	<p/>
-	For a Java programming language frame, return the location of the instruction
-	currently executing.
+        <p/>
+        For a Java programming language frame, return the location of the instruction
+        currently executing.
       </description>
       <origin>jvmdiClone</origin>
       <capabilities>
       </capabilities>
       <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame to query.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame to query.
-	  </description>
-	</param>
-	<param id="method_ptr">
-	  <outptr><jmethodID/></outptr>
-	    <description>
-	      On return, points to the method for the current location.
-	    </description>
-	</param>
-	<param id="location_ptr">
-	  <outptr><jlocation/></outptr>
-	  <description>
-	    On return, points to the index of the currently
-	    executing instruction.
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame to query.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame to query.
+          </description>
+        </param>
+        <param id="method_ptr">
+          <outptr><jmethodID/></outptr>
+            <description>
+              On return, points to the method for the current location.
+            </description>
+        </param>
+        <param id="location_ptr">
+          <outptr><jlocation/></outptr>
+          <description>
+            On return, points to the index of the currently
+            executing instruction.
             Is set to <code>-1</code> if the frame is executing
             a native method.
-	  </description>
-	</param>
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -2905,10 +2905,10 @@
     <function id="NotifyFramePop" num="20">
       <synopsis>Notify Frame Pop</synopsis>
       <description>
-	When the frame that is currently at <paramlink id="depth"></paramlink>
+        When the frame that is currently at <paramlink id="depth"></paramlink>
         is popped from the stack, generate a
-	<eventlink id="FramePop"></eventlink> event.  See the
-	<eventlink id="FramePop"></eventlink> event for details.
+        <eventlink id="FramePop"></eventlink> event.  See the
+        <eventlink id="FramePop"></eventlink> event for details.
         Only frames corresponding to non-native Java programming language
         methods can receive notification.
         <p/>
@@ -2916,30 +2916,30 @@
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_generate_frame_pop_events"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="depth"/>
-	  <description>
-	    The thread of the frame for which the frame pop event will be generated.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame for which the frame pop event will be generated.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  The frame at <code>depth</code> is executing a
+        <required id="can_generate_frame_pop_events"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="depth"/>
+          <description>
+            The thread of the frame for which the frame pop event will be generated.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame for which the frame pop event will be generated.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          The frame at <code>depth</code> is executing a
           native method.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
       </errors>
     </function>
 
@@ -2985,262 +2985,262 @@
     <function id="ForceEarlyReturnObject" num="81" since="1.1">
       <synopsis>Force Early Return - Object</synopsis>
       <description>
-	This function can be used to return from a method whose
+        This function can be used to return from a method whose
         result type is <code>Object</code>
         or a subclass of <code>Object</code>.
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-	<param id="value">
-	  <jobject/>
-	  <description>
-	    The return value for the called frame.
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+        <param id="value">
+          <jobject/>
+          <description>
+            The return value for the called frame.
             An object or <code>NULL</code>.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame
           corresponding to a native method.
           Or the implementation is unable to provide
           this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The result type of the called method is not
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The result type of the called method is not
           <code>Object</code> or a subclass of <code>Object</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The supplied <paramlink id="value"/> is not compatible with the
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The supplied <paramlink id="value"/> is not compatible with the
           result type of the called method.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no more frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no more frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="ForceEarlyReturnInt" num="82" since="1.1">
       <synopsis>Force Early Return - Int</synopsis>
       <description>
-	This function can be used to return from a method whose
+        This function can be used to return from a method whose
         result type is <code>int</code>, <code>short</code>,
         <code>char</code>, <code>byte</code>, or
-	<code>boolean</code>.
-      </description>
-      <origin>new</origin>
-      <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-	<param id="value">
-	  <jint/>
-	  <description>
-	    The return value for the called frame.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame
+        <code>boolean</code>.
+      </description>
+      <origin>new</origin>
+      <capabilities>
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+        <param id="value">
+          <jint/>
+          <description>
+            The return value for the called frame.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame
           corresponding to a native method.
           Or the implementation is unable to provide
           this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The result type of the called method is not
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The result type of the called method is not
           <code>int</code>, <code>short</code>,
           <code>char</code>, <code>byte</code>, or
-  	  <code>boolean</code>.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no frames on the call stack.
-	</error>
+          <code>boolean</code>.
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="ForceEarlyReturnLong" num="83" since="1.1">
       <synopsis>Force Early Return - Long</synopsis>
       <description>
-	This function can be used to return from a method whose
+        This function can be used to return from a method whose
         result type is <code>long</code>.
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-	<param id="value">
-	  <jlong/>
-	  <description>
-	    The return value for the called frame.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+        <param id="value">
+          <jlong/>
+          <description>
+            The return value for the called frame.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame
           corresponding to a native method.
           Or the implementation is unable to provide
           this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The result type of the called method is not <code>long</code>.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The result type of the called method is not <code>long</code>.
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="ForceEarlyReturnFloat" num="84" since="1.1">
       <synopsis>Force Early Return - Float</synopsis>
       <description>
-	This function can be used to return from a method whose
+        This function can be used to return from a method whose
         result type is <code>float</code>.
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-	<param id="value">
-	  <jfloat/>
-	  <description>
-	    The return value for the called frame.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+        <param id="value">
+          <jfloat/>
+          <description>
+            The return value for the called frame.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame
           corresponding to a native method.
           Or the implementation is unable to provide
           this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The result type of the called method is not <code>float</code>.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The result type of the called method is not <code>float</code>.
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="ForceEarlyReturnDouble" num="85" since="1.1">
       <synopsis>Force Early Return - Double</synopsis>
       <description>
-	This function can be used to return from a method whose
+        This function can be used to return from a method whose
         result type is <code>double</code>.
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-	<param id="value">
-	  <jdouble/>
-	  <description>
-	    The return value for the called frame.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame corresponding to a native method.
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+        <param id="value">
+          <jdouble/>
+          <description>
+            The return value for the called frame.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame corresponding to a native method.
           Or the implementation is unable to provide this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The result type of the called method is not <code>double</code>.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The result type of the called method is not <code>double</code>.
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no frames on the call stack.
+        </error>
       </errors>
     </function>
 
     <function id="ForceEarlyReturnVoid" num="86" since="1.1">
       <synopsis>Force Early Return - Void</synopsis>
       <description>
-	This function can be used to return from a method with no result type.
+        This function can be used to return from a method with no result type.
         That is, the called method must be declared <code>void</code>.
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_force_early_return"></required>
-      </capabilities>
-      <parameters>
-	<param id="thread">
-	  <jthread null="current"/>
-	  <description>
-	    The thread whose current frame is to return early.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Attempted to return early from a frame
+        <required id="can_force_early_return"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current"/>
+          <description>
+            The thread whose current frame is to return early.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Attempted to return early from a frame
           corresponding to a native method.
           Or the implementation is unable to provide
           this functionality on this frame.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The called method has a result type.
-	</error>
-	<error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
-	  Thread was not suspended and was not the current thread.
-	</error>
-	<error id="JVMTI_ERROR_NO_MORE_FRAMES">
-	  There are no frames on the call stack.
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The called method has a result type.
+        </error>
+        <error id="JVMTI_ERROR_THREAD_NOT_SUSPENDED">
+          Thread was not suspended and was not the current thread.
+        </error>
+        <error id="JVMTI_ERROR_NO_MORE_FRAMES">
+          There are no frames on the call stack.
+        </error>
       </errors>
     </function>
 
@@ -3292,19 +3292,19 @@
         will not be filtered out.
 
         <constants id="jvmtiHeapFilter" label="Heap Filter Flags" kind="bits">
-	  <constant id="JVMTI_HEAP_FILTER_TAGGED" num="0x4">
-	    Filter out tagged objects. Objects which are tagged are not included.
-	  </constant>
-	  <constant id="JVMTI_HEAP_FILTER_UNTAGGED" num="0x8">
-	    Filter out untagged objects. Objects which are not tagged are not included.
-	  </constant>
-	  <constant id="JVMTI_HEAP_FILTER_CLASS_TAGGED" num="0x10">
-	    Filter out objects with tagged classes. Objects whose class is tagged are not included.
-	  </constant>
-	  <constant id="JVMTI_HEAP_FILTER_CLASS_UNTAGGED" num="0x20">
-	    Filter out objects with untagged classes. Objects whose class is not tagged are not included.
-	  </constant>
-	</constants>
+          <constant id="JVMTI_HEAP_FILTER_TAGGED" num="0x4">
+            Filter out tagged objects. Objects which are tagged are not included.
+          </constant>
+          <constant id="JVMTI_HEAP_FILTER_UNTAGGED" num="0x8">
+            Filter out untagged objects. Objects which are not tagged are not included.
+          </constant>
+          <constant id="JVMTI_HEAP_FILTER_CLASS_TAGGED" num="0x10">
+            Filter out objects with tagged classes. Objects whose class is tagged are not included.
+          </constant>
+          <constant id="JVMTI_HEAP_FILTER_CLASS_UNTAGGED" num="0x20">
+            Filter out objects with untagged classes. Objects whose class is not tagged are not included.
+          </constant>
+        </constants>
 
         <p/>
         The Heap Visit Control Flags are returned by the heap callbacks
@@ -3318,16 +3318,16 @@
                    label="Heap Visit Control Flags"
                    kind="bits"
                    since="1.1">
-	  <constant id="JVMTI_VISIT_OBJECTS" num="0x100">
+          <constant id="JVMTI_VISIT_OBJECTS" num="0x100">
             If we are visiting an object and if this callback
             was initiated by <functionlink id="FollowReferences"/>,
             traverse the references of this object.
             Otherwise ignored.
-	  </constant>
-	  <constant id="JVMTI_VISIT_ABORT" num="0x8000">
-	    Abort the iteration.  Ignore all other bits.
-	  </constant>
-	</constants>
+          </constant>
+          <constant id="JVMTI_VISIT_ABORT" num="0x8000">
+            Abort the iteration.  Ignore all other bits.
+          </constant>
+        </constants>
 
         <p/>
         The Heap Reference Enumeration is provided by the
@@ -3342,65 +3342,65 @@
                    label="Heap Reference Enumeration"
                    kind="enum"
                    since="1.1">
-	  <constant id="JVMTI_HEAP_REFERENCE_CLASS" num="1">
-	    Reference from an object to its class.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_FIELD" num="2">
-	    Reference from an object to the value of one of its instance fields.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT" num="3">
-	    Reference from an array to one of its elements.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_CLASS_LOADER" num="4">
-	    Reference from a class to its class loader.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_SIGNERS" num="5">
-	    Reference from a class to its signers array.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN" num="6">
-	    Reference from a class to its protection domain.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_INTERFACE" num="7">
+          <constant id="JVMTI_HEAP_REFERENCE_CLASS" num="1">
+            Reference from an object to its class.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_FIELD" num="2">
+            Reference from an object to the value of one of its instance fields.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT" num="3">
+            Reference from an array to one of its elements.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_CLASS_LOADER" num="4">
+            Reference from a class to its class loader.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_SIGNERS" num="5">
+            Reference from a class to its signers array.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN" num="6">
+            Reference from a class to its protection domain.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_INTERFACE" num="7">
             Reference from a class to one of its interfaces.
             Note: interfaces are defined via a constant pool reference,
             so the referenced interfaces may also be reported with a
             <code>JVMTI_HEAP_REFERENCE_CONSTANT_POOL</code> reference kind.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_STATIC_FIELD" num="8">
-	    Reference from a class to the value of one of its static fields.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL" num="9">
-	    Reference from a class to a resolved entry in the constant pool.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_SUPERCLASS" num="10">
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_STATIC_FIELD" num="8">
+            Reference from a class to the value of one of its static fields.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL" num="9">
+            Reference from a class to a resolved entry in the constant pool.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_SUPERCLASS" num="10">
             Reference from a class to its superclass.
             A callback is not sent if the superclass is <code>java.lang.Object</code>.
             Note: loaded classes define superclasses via a constant pool
             reference, so the referenced superclass may also be reported with
             a <code>JVMTI_HEAP_REFERENCE_CONSTANT_POOL</code> reference kind.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_JNI_GLOBAL" num="21">
-	    Heap root reference: JNI global reference.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_SYSTEM_CLASS" num="22">
-	    Heap root reference: System class.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_MONITOR" num="23">
-	    Heap root reference: monitor.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_STACK_LOCAL" num="24">
-	    Heap root reference: local variable on the stack.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_JNI_LOCAL" num="25">
-	    Heap root reference: JNI local reference.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_THREAD" num="26">
-	    Heap root reference: Thread.
-	  </constant>
-	  <constant id="JVMTI_HEAP_REFERENCE_OTHER" num="27">
-	    Heap root reference: other heap root reference.
-	  </constant>
-	</constants>
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_JNI_GLOBAL" num="21">
+            Heap root reference: JNI global reference.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_SYSTEM_CLASS" num="22">
+            Heap root reference: System class.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_MONITOR" num="23">
+            Heap root reference: monitor.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_STACK_LOCAL" num="24">
+            Heap root reference: local variable on the stack.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_JNI_LOCAL" num="25">
+            Heap root reference: JNI local reference.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_THREAD" num="26">
+            Heap root reference: Thread.
+          </constant>
+          <constant id="JVMTI_HEAP_REFERENCE_OTHER" num="27">
+            Heap root reference: other heap root reference.
+          </constant>
+        </constants>
 
         <p/>
         Definitions for the single character type descriptors of
@@ -3410,31 +3410,31 @@
                    label="Primitive Type Enumeration"
                    kind="enum"
                    since="1.1">
-	  <constant id="JVMTI_PRIMITIVE_TYPE_BOOLEAN" num="90">
+          <constant id="JVMTI_PRIMITIVE_TYPE_BOOLEAN" num="90">
             'Z' - Java programming language <code>boolean</code> - JNI <code>jboolean</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_BYTE" num="66">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_BYTE" num="66">
             'B' - Java programming language <code>byte</code> - JNI <code>jbyte</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_CHAR" num="67">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_CHAR" num="67">
             'C' - Java programming language <code>char</code> - JNI <code>jchar</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_SHORT" num="83">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_SHORT" num="83">
             'S' - Java programming language <code>short</code> - JNI <code>jshort</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_INT" num="73">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_INT" num="73">
             'I' - Java programming language <code>int</code> - JNI <code>jint</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_LONG" num="74">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_LONG" num="74">
             'J' - Java programming language <code>long</code> - JNI <code>jlong</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_FLOAT" num="70">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_FLOAT" num="70">
             'F' - Java programming language <code>float</code> - JNI <code>jfloat</code>
-	  </constant>
-	  <constant id="JVMTI_PRIMITIVE_TYPE_DOUBLE" num="68">
+          </constant>
+          <constant id="JVMTI_PRIMITIVE_TYPE_DOUBLE" num="68">
             'D' - Java programming language <code>double</code> - JNI <code>jdouble</code>
-	  </constant>
-	</constants>
+          </constant>
+        </constants>
     </intro>
 
       <typedef id="jvmtiHeapReferenceInfoField"
@@ -3445,9 +3445,9 @@
           <datalink id="JVMTI_HEAP_REFERENCE_FIELD"/> and
           <datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/> references.
         </description>
-	<field id="index">
-	  <jint/>
-	  <description>
+        <field id="index">
+          <jint/>
+          <description>
             For <datalink id="JVMTI_HEAP_REFERENCE_FIELD"/>, the
             referrer object is not a class or an interface.
             In this case, <code>index</code> is the index of the field
@@ -3644,8 +3644,8 @@
                 </td>
               </tr>
             </table></blockquote>
-	  </description>
-	</field>
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiHeapReferenceInfoArray"
@@ -3655,12 +3655,12 @@
           Reference information returned for
          <datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/> references.
         </description>
-	<field id="index">
-	  <jint/>
-	  <description>
-	    The array index.
-	  </description>
-	</field>
+        <field id="index">
+          <jint/>
+          <description>
+            The array index.
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiHeapReferenceInfoConstantPool"
@@ -3670,13 +3670,13 @@
           Reference information returned for
           <datalink id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL"/> references.
         </description>
-	<field id="index">
-	  <jint/>
-	  <description>
-	    The index into the constant pool of the class. See the description in
+        <field id="index">
+          <jint/>
+          <description>
+            The index into the constant pool of the class. See the description in
       <vmspec chapter="4.4"/>.
-	  </description>
-	</field>
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiHeapReferenceInfoStackLocal"
@@ -3687,41 +3687,41 @@
           <datalink id="JVMTI_HEAP_REFERENCE_STACK_LOCAL"/> references.
         </description>
         <field id="thread_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the thread corresponding to this stack, zero if not tagged.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            The tag of the thread corresponding to this stack, zero if not tagged.
+          </description>
+        </field>
         <field id="thread_id">
-	  <jlong/>
-	  <description>
-	    The unique thread ID of the thread corresponding to this stack.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            The unique thread ID of the thread corresponding to this stack.
+          </description>
+        </field>
         <field id="depth">
-	  <jint/>
-	  <description>
-	    The depth of the frame.
-	  </description>
-	</field>
+          <jint/>
+          <description>
+            The depth of the frame.
+          </description>
+        </field>
         <field id="method">
-	  <jmethodID/>
-	  <description>
-	    The method executing in this frame.
-	  </description>
-	</field>
+          <jmethodID/>
+          <description>
+            The method executing in this frame.
+          </description>
+        </field>
         <field id="location">
-	  <jlocation/>
-	  <description>
-	    The currently executing location in this frame.
-	  </description>
-	</field>
+          <jlocation/>
+          <description>
+            The currently executing location in this frame.
+          </description>
+        </field>
         <field id="slot">
-	  <jint/>
-	  <description>
-	    The slot number of the local variable.
-	  </description>
-	</field>
+          <jint/>
+          <description>
+            The slot number of the local variable.
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiHeapReferenceInfoJniLocal"
@@ -3732,29 +3732,29 @@
           <datalink id="JVMTI_HEAP_REFERENCE_JNI_LOCAL"/> references.
         </description>
         <field id="thread_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the thread corresponding to this stack, zero if not tagged.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            The tag of the thread corresponding to this stack, zero if not tagged.
+          </description>
+        </field>
         <field id="thread_id">
-	  <jlong/>
-	  <description>
-	    The unique thread ID of the thread corresponding to this stack.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            The unique thread ID of the thread corresponding to this stack.
+          </description>
+        </field>
         <field id="depth">
-	  <jint/>
-	  <description>
-	    The depth of the frame.
-	  </description>
-	</field>
+          <jint/>
+          <description>
+            The depth of the frame.
+          </description>
+        </field>
         <field id="method">
-	  <jmethodID/>
-	  <description>
-	    The method executing in this frame.
-	  </description>
-	</field>
+          <jmethodID/>
+          <description>
+            The method executing in this frame.
+          </description>
+        </field>
       </typedef>
 
       <typedef id="jvmtiHeapReferenceInfoReserved"
@@ -3764,53 +3764,53 @@
           Reference information returned for other references.
         </description>
         <field id="reserved1">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved2">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved3">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved4">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved5">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved6">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved7">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
         <field id="reserved8">
-	  <jlong/>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <jlong/>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
       </typedef>
 
       <uniontypedef id="jvmtiHeapReferenceInfo"
@@ -3820,209 +3820,209 @@
           The information returned about referrers.
           Represented as a union of the various kinds of reference information.
         </description>
-	<field id="field">
-	  <struct>jvmtiHeapReferenceInfoField</struct>
-	  <description>
-	    The referrer information for
+        <field id="field">
+          <struct>jvmtiHeapReferenceInfoField</struct>
+          <description>
+            The referrer information for
             <datalink id="JVMTI_HEAP_REFERENCE_FIELD"/>
             and <datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/> references.
-	  </description>
-	</field>
-	<field id="array">
-	  <struct>jvmtiHeapReferenceInfoArray</struct>
-	  <description>
-	    The referrer information for
-	    For <datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/> references.
-	  </description>
-	</field>
-	<field id="constant_pool">
-	  <struct>jvmtiHeapReferenceInfoConstantPool</struct>
-	  <description>
-	    The referrer information for
-	    For <datalink id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL"/> references.
-	  </description>
-	</field>
+          </description>
+        </field>
+        <field id="array">
+          <struct>jvmtiHeapReferenceInfoArray</struct>
+          <description>
+            The referrer information for
+            For <datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/> references.
+          </description>
+        </field>
+        <field id="constant_pool">
+          <struct>jvmtiHeapReferenceInfoConstantPool</struct>
+          <description>
+            The referrer information for
+            For <datalink id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL"/> references.
+          </description>
+        </field>
         <field id="stack_local">
-	  <struct>jvmtiHeapReferenceInfoStackLocal</struct>
-	  <description>
-	    The referrer information for
-	    For <datalink id="JVMTI_HEAP_REFERENCE_STACK_LOCAL"/> references.
-	  </description>
-	</field>
+          <struct>jvmtiHeapReferenceInfoStackLocal</struct>
+          <description>
+            The referrer information for
+            For <datalink id="JVMTI_HEAP_REFERENCE_STACK_LOCAL"/> references.
+          </description>
+        </field>
         <field id="jni_local">
-	  <struct>jvmtiHeapReferenceInfoJniLocal</struct>
-	  <description>
-	    The referrer information for
-	    For <datalink id="JVMTI_HEAP_REFERENCE_JNI_LOCAL"/> references.
-	  </description>
-	</field>
+          <struct>jvmtiHeapReferenceInfoJniLocal</struct>
+          <description>
+            The referrer information for
+            For <datalink id="JVMTI_HEAP_REFERENCE_JNI_LOCAL"/> references.
+          </description>
+        </field>
         <field id="other">
-	  <struct>jvmtiHeapReferenceInfoReserved</struct>
-	  <description>
-	    reserved for future use.
-	  </description>
-	</field>
+          <struct>jvmtiHeapReferenceInfoReserved</struct>
+          <description>
+            reserved for future use.
+          </description>
+        </field>
       </uniontypedef>
 
       <typedef id="jvmtiHeapCallbacks"
                label="Heap callback function structure"
                since="1.1">
         <field id="heap_iteration_callback">
-	  <ptrtype>
-	    <struct>jvmtiHeapIterationCallback</struct>
-	  </ptrtype>
-	  <description>
-	    The callback to be called to describe an
-	    object in the heap. Used by the
+          <ptrtype>
+            <struct>jvmtiHeapIterationCallback</struct>
+          </ptrtype>
+          <description>
+            The callback to be called to describe an
+            object in the heap. Used by the
             <functionlink id="IterateThroughHeap"/> function, ignored by the
             <functionlink id="FollowReferences"/> function.
-	  </description>
-	</field>
+          </description>
+        </field>
         <field id="heap_reference_callback">
-	  <ptrtype>
-	    <struct>jvmtiHeapReferenceCallback</struct>
-	  </ptrtype>
-	  <description>
-	    The callback to be called to describe an
-	    object reference.  Used by the
+          <ptrtype>
+            <struct>jvmtiHeapReferenceCallback</struct>
+          </ptrtype>
+          <description>
+            The callback to be called to describe an
+            object reference.  Used by the
             <functionlink id="FollowReferences"/> function, ignored by the
             <functionlink id="IterateThroughHeap"/> function.
-	  </description>
-	</field>
+          </description>
+        </field>
         <field id="primitive_field_callback">
-	  <ptrtype>
-	    <struct>jvmtiPrimitiveFieldCallback</struct>
-	  </ptrtype>
-	  <description>
+          <ptrtype>
+            <struct>jvmtiPrimitiveFieldCallback</struct>
+          </ptrtype>
+          <description>
             The callback to be called to describe a
             primitive field.
           </description>
-	</field>
+        </field>
         <field id="array_primitive_value_callback">
-	  <ptrtype>
-	    <struct>jvmtiArrayPrimitiveValueCallback</struct>
-	  </ptrtype>
-	  <description>
-	    The callback to be called to describe an
-	    array of primitive values.
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiArrayPrimitiveValueCallback</struct>
+          </ptrtype>
+          <description>
+            The callback to be called to describe an
+            array of primitive values.
+          </description>
+        </field>
         <field id="string_primitive_value_callback">
-	  <ptrtype>
-	    <struct>jvmtiStringPrimitiveValueCallback</struct>
-	  </ptrtype>
-	  <description>
-	    The callback to be called to describe a String value.
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiStringPrimitiveValueCallback</struct>
+          </ptrtype>
+          <description>
+            The callback to be called to describe a String value.
+          </description>
+        </field>
         <field id="reserved5">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved6">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved7">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved8">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved9">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved10">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved11">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved12">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved13">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved14">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
         <field id="reserved15">
-	  <ptrtype>
-	    <struct>jvmtiReservedCallback</struct>
-	  </ptrtype>
-	  <description>
-	    Reserved for future use..
-	  </description>
-	</field>
+          <ptrtype>
+            <struct>jvmtiReservedCallback</struct>
+          </ptrtype>
+          <description>
+            Reserved for future use..
+          </description>
+        </field>
       </typedef>
 
 
     <intro>
       <rationale>
-	The heap dumping functionality (below) uses a callback
-	for each object.  While it would seem that a buffered approach
-	would provide better throughput, tests do
-	not show this to be the case--possibly due to locality of
-	memory reference or array access overhead.
+        The heap dumping functionality (below) uses a callback
+        for each object.  While it would seem that a buffered approach
+        would provide better throughput, tests do
+        not show this to be the case--possibly due to locality of
+        memory reference or array access overhead.
       </rationale>
 
       <issue>
         Still under investigation as to if java.lang.ref references
-	are reported as a different type of reference.
+        are reported as a different type of reference.
       </issue>
 
       <issue>
         Should or can an indication of the cost or relative cost of
-	these operations be included?
+        these operations be included?
       </issue>
 
     </intro>
@@ -4032,7 +4032,7 @@
       <synopsis>Heap Iteration Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes (but does not pass in) an object in the heap.
+        Describes (but does not pass in) an object in the heap.
         <p/>
         This function should return a bit vector of the desired
         <datalink id="jvmtiHeapVisitControl">visit control flags</datalink>.
@@ -4044,41 +4044,41 @@
       </description>
       <parameters>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of object (zero if the class is not tagged).
-	    If the object represents a runtime class,
+          <jlong/>
+          <description>
+            The tag of the class of object (zero if the class is not tagged).
+            If the object represents a runtime class,
             the <code>class_tag</code> is the tag
-	    associated with <code>java.lang.Class</code>
+            associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    The object tag value, or zero if the object is not tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            The object tag value, or zero if the object is not tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="length">
-	  <jint/>
-	  <description>
-	    If this object is an array, the length of the array. Otherwise negative one (-1).
-	  </description>
-	</param>
+          <jint/>
+          <description>
+            If this object is an array, the length of the array. Otherwise negative one (-1).
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -4087,8 +4087,8 @@
       <synopsis>Heap Reference Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes a reference from an object or the VM (the referrer) to another object
-	(the referree) or a heap root to a referree.
+        Describes a reference from an object or the VM (the referrer) to another object
+        (the referree) or a heap root to a referree.
         <p/>
         This function should return a bit vector of the desired
         <datalink id="jvmtiHeapVisitControl">visit control flags</datalink>.
@@ -4099,38 +4099,38 @@
         function restrictions</internallink>.
       </description>
       <parameters>
-	<param id="reference_kind">
-	  <enum>jvmtiHeapReferenceKind</enum>
-	  <description>
-	    The kind of reference.
-	  </description>
-	</param>
-	<param id="reference_info">
-	  <inptr>
-	    <struct>jvmtiHeapReferenceInfo</struct>
-	  </inptr>
-	  <description>
-	    Details about the reference.
+        <param id="reference_kind">
+          <enum>jvmtiHeapReferenceKind</enum>
+          <description>
+            The kind of reference.
+          </description>
+        </param>
+        <param id="reference_info">
+          <inptr>
+            <struct>jvmtiHeapReferenceInfo</struct>
+          </inptr>
+          <description>
+            Details about the reference.
             Set when the <datalink id="jvmtiHeapReferenceCallback.reference_kind">reference_kind</datalink> is
             <datalink id="JVMTI_HEAP_REFERENCE_FIELD"/>,
-	    <datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/>,
-	    <datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/>,
-	    <datalink id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL"/>,
+            <datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/>,
+            <datalink id="JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT"/>,
+            <datalink id="JVMTI_HEAP_REFERENCE_CONSTANT_POOL"/>,
             <datalink id="JVMTI_HEAP_REFERENCE_STACK_LOCAL"/>,
             or <datalink id="JVMTI_HEAP_REFERENCE_JNI_LOCAL"/>.
             Otherwise <code>NULL</code>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of referree object (zero if the class is not tagged).
+          <jlong/>
+          <description>
+            The tag of the class of referree object (zero if the class is not tagged).
             If the referree object represents a runtime class,
             the <code>class_tag</code> is the tag
             associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="referrer_class_tag">
           <jlong/>
           <description>
@@ -4142,47 +4142,47 @@
           </description>
         </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the referree object (in bytes).
+          <jlong/>
+          <description>
+            Size of the referree object (in bytes).
             See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    Points to the referree object tag value, or zero if the object is not
-	    tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            Points to the referree object tag value, or zero if the object is not
+            tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="referrer_tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    Points to the tag of the referrer object, or
+          <outptr><jlong/></outptr>
+          <description>
+            Points to the tag of the referrer object, or
             points to the zero if the referrer
-	    object is not tagged.
+            object is not tagged.
             <code>NULL</code> if the referrer in not an object (that is,
             this callback is reporting a heap root).
-	    To set the tag value to be associated with the referrer object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
+            To set the tag value to be associated with the referrer object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
             If this callback is reporting a reference from an object to itself,
             <code>referrer_tag_ptr == tag_ptr</code>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="length">
-	  <jint/>
-	  <description>
-	    If this object is an array, the length of the array. Otherwise negative one (-1).
-	  </description>
-	</param>
+          <jint/>
+          <description>
+            If this object is an array, the length of the array. Otherwise negative one (-1).
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -4205,58 +4205,58 @@
         function restrictions</internallink>.
       </description>
       <parameters>
-	<param id="kind">
-	  <enum>jvmtiHeapReferenceKind</enum>
-	  <description>
-	    The kind of field -- instance or static (<datalink id="JVMTI_HEAP_REFERENCE_FIELD"/> or
+        <param id="kind">
+          <enum>jvmtiHeapReferenceKind</enum>
+          <description>
+            The kind of field -- instance or static (<datalink id="JVMTI_HEAP_REFERENCE_FIELD"/> or
             <datalink id="JVMTI_HEAP_REFERENCE_STATIC_FIELD"/>).
-	  </description>
-	</param>
-	<param id="info">
-	  <inptr>
-	    <struct>jvmtiHeapReferenceInfo</struct>
-	  </inptr>
-	  <description>
-	    Which field (the field index).
-	  </description>
-	</param>
+          </description>
+        </param>
+        <param id="info">
+          <inptr>
+            <struct>jvmtiHeapReferenceInfo</struct>
+          </inptr>
+          <description>
+            Which field (the field index).
+          </description>
+        </param>
         <param id="object_class_tag">
-	  <jlong/>
-	  <description>
+          <jlong/>
+          <description>
             The tag of the class of the object (zero if the class is not tagged).
             If the object represents a runtime class, the
             <code>object_class_tag</code> is the tag
             associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="object_tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    Points to the tag of the object, or zero if the object is not
-	    tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            Points to the tag of the object, or zero if the object is not
+            tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="value">
-	  <jvalue/>
-	  <description>
-	    The value of the field.
-	  </description>
-	</param>
+          <jvalue/>
+          <description>
+            The value of the field.
+          </description>
+        </param>
         <param id="value_type">
-	  <enum>jvmtiPrimitiveType</enum>
-	  <description>
-	    The type of the field.
-	  </description>
-	</param>
+          <enum>jvmtiPrimitiveType</enum>
+          <description>
+            The type of the field.
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -4265,7 +4265,7 @@
       <synopsis>Array Primitive Value Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes the values in an array of a primitive type.
+        Describes the values in an array of a primitive type.
         <p/>
         This function should return a bit vector of the desired
         <datalink id="jvmtiHeapVisitControl">visit control flags</datalink>.
@@ -4277,52 +4277,52 @@
       </description>
       <parameters>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of the array object (zero if the class is not tagged).
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            The tag of the class of the array object (zero if the class is not tagged).
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the array (in bytes).
+          <jlong/>
+          <description>
+            Size of the array (in bytes).
             See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    Points to the tag of the array object, or zero if the object is not
-	    tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            Points to the tag of the array object, or zero if the object is not
+            tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="element_count">
-	  <jint/>
-	  <description>
-	    The length of the primitive array.
-	  </description>
-	</param>
+          <jint/>
+          <description>
+            The length of the primitive array.
+          </description>
+        </param>
         <param id="element_type">
-	  <enum>jvmtiPrimitiveType</enum>
-	  <description>
-	    The type of the elements of the array.
-	  </description>
-	</param>
+          <enum>jvmtiPrimitiveType</enum>
+          <description>
+            The type of the elements of the array.
+          </description>
+        </param>
         <param id="elements">
-	  <vmbuf><void/></vmbuf>
-	  <description>
-	    The elements of the array in a packed array of <code>element_count</code>
+          <vmbuf><void/></vmbuf>
+          <description>
+            The elements of the array in a packed array of <code>element_count</code>
             items of <code>element_type</code> size each.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -4331,7 +4331,7 @@
       <synopsis>String Primitive Value Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes the value of a java.lang.String.
+        Describes the value of a java.lang.String.
         <p/>
         This function should return a bit vector of the desired
         <datalink id="jvmtiHeapVisitControl">visit control flags</datalink>.
@@ -4343,48 +4343,48 @@
       </description>
       <parameters>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of the String class (zero if the class is not tagged).
+          <jlong/>
+          <description>
+            The tag of the class of the String class (zero if the class is not tagged).
             <issue>Is this needed?</issue>
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the string (in bytes).
+          <jlong/>
+          <description>
+            Size of the string (in bytes).
             See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    Points to the tag of the String object, or zero if the object is not
-	    tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            Points to the tag of the String object, or zero if the object is not
+            tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="value">
-	  <vmbuf><jchar/></vmbuf>
-	  <description>
-	    The value of the String, encoded as a Unicode string.
-	  </description>
-	</param>
+          <vmbuf><jchar/></vmbuf>
+          <description>
+            The value of the String, encoded as a Unicode string.
+          </description>
+        </param>
         <param id="value_length">
-	  <jint/>
-	  <description>
-	    The length of the string.
+          <jint/>
+          <description>
+            The length of the string.
             The length is equal to the number of 16-bit Unicode
             characters in the string.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -4406,9 +4406,9 @@
         directly and indirectly reachable from the specified object or,
         if <code>initial_object</code> is not specified, all objects
         reachable from the heap roots.
-	The heap root are the set of system classes,
-	JNI globals, references from thread stacks, and other objects used as roots
-	for the purposes of garbage collection.
+        The heap root are the set of system classes,
+        JNI globals, references from thread stacks, and other objects used as roots
+        for the purposes of garbage collection.
         <p/>
         This function operates by traversing the reference graph.
         Let <i>A</i>, <i>B</i>, ... represent objects.
@@ -4435,7 +4435,7 @@
         <datalink
          id="jvmtiHeapReferenceCallback.reference_info"><code>reference_info</code></datalink>
         parameters of the <functionlink id="jvmtiHeapReferenceCallback"/> callback.
-	<p/>
+        <p/>
         This function reports a Java programming language view of object references,
         not a virtual machine implementation view. The following object references
         are reported when they are non-null:
@@ -4817,18 +4817,18 @@
       </capabilities>
       <parameters>
         <param id="object">
-	  <jobject/>
-	    <description>
-	      The object whose tag is to be retrieved.
-	    </description>
-	</param>
+          <jobject/>
+            <description>
+              The object whose tag is to be retrieved.
+            </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    On return, the referenced long is set to the value
-	    of the tag.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            On return, the referenced long is set to the value
+            of the tag.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -4849,17 +4849,17 @@
       </capabilities>
       <parameters>
         <param id="object">
-	  <jobject/>
-	    <description>
-	      The object whose tag is to be set.
-	    </description>
-	</param>
+          <jobject/>
+            <description>
+              The object whose tag is to be set.
+            </description>
+        </param>
         <param id="tag">
-	  <jlong/>
-	  <description>
-	    The new value of the tag.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            The new value of the tag.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -4868,63 +4868,63 @@
     <function id="GetObjectsWithTags" num="114">
       <synopsis>Get Objects With Tags</synopsis>
       <description>
-	Return objects in the heap with the specified tags.
-	The format is parallel arrays of objects and tags.
+        Return objects in the heap with the specified tags.
+        The format is parallel arrays of objects and tags.
       </description>
       <origin>new</origin>
       <capabilities>
         <required id="can_tag_objects"></required>
       </capabilities>
       <parameters>
-	<param id="tag_count">
-	  <jint min="0"/>
-	    <description>
-	      Number of tags to scan for.
-	    </description>
-	</param>
-	<param id="tags">
-	  <inbuf incount="tag_count">
-	    <jlong/>
-	  </inbuf>
-	    <description>
-	      Scan for objects with these tags.
-	      Zero is not permitted in this array.
-	    </description>
-	</param>
-	<param id="count_ptr">
-	  <outptr>
-	    <jint/>
-	  </outptr>
-	    <description>
-	      Return the number of objects with any of the tags
-	      in <paramlink id="tags"/>.
-	    </description>
-	</param>
-	<param id="object_result_ptr">
-	  <allocbuf outcount="count_ptr">
-	    <jobject/>
-	    <nullok>this information is not returned</nullok>
-	  </allocbuf>
-	    <description>
-	      Returns the array of objects with any of the tags
-	      in <paramlink id="tags"/>.
-	    </description>
-	</param>
-	<param id="tag_result_ptr">
-	  <allocbuf outcount="count_ptr">
-	    <jlong/>
-	    <nullok>this information is not returned</nullok>
-	  </allocbuf>
-	    <description>
-	      For each object in <paramlink id="object_result_ptr"/>,
-	      return the tag at the corresponding index.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
-	  Zero is present in <paramlink id="tags"></paramlink>.
-	</error>
+        <param id="tag_count">
+          <jint min="0"/>
+            <description>
+              Number of tags to scan for.
+            </description>
+        </param>
+        <param id="tags">
+          <inbuf incount="tag_count">
+            <jlong/>
+          </inbuf>
+            <description>
+              Scan for objects with these tags.
+              Zero is not permitted in this array.
+            </description>
+        </param>
+        <param id="count_ptr">
+          <outptr>
+            <jint/>
+          </outptr>
+            <description>
+              Return the number of objects with any of the tags
+              in <paramlink id="tags"/>.
+            </description>
+        </param>
+        <param id="object_result_ptr">
+          <allocbuf outcount="count_ptr">
+            <jobject/>
+            <nullok>this information is not returned</nullok>
+          </allocbuf>
+            <description>
+              Returns the array of objects with any of the tags
+              in <paramlink id="tags"/>.
+            </description>
+        </param>
+        <param id="tag_result_ptr">
+          <allocbuf outcount="count_ptr">
+            <jlong/>
+            <nullok>this information is not returned</nullok>
+          </allocbuf>
+            <description>
+              For each object in <paramlink id="object_result_ptr"/>,
+              return the tag at the corresponding index.
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
+          Zero is present in <paramlink id="tags"></paramlink>.
+        </error>
       </errors>
     </function>
 
@@ -4997,51 +4997,51 @@
       <internallink id="Heap"><b>current Heap functions</b></internallink>.
         <p/>
         <constants id="jvmtiHeapObjectFilter" label="Heap Object Filter Enumeration" kind="enum">
-	  <constant id="JVMTI_HEAP_OBJECT_TAGGED" num="1">
-	    Tagged objects only.
-	  </constant>
-	  <constant id="JVMTI_HEAP_OBJECT_UNTAGGED" num="2">
-	    Untagged objects only.
-	  </constant>
-	  <constant id="JVMTI_HEAP_OBJECT_EITHER" num="3">
-	    Either tagged or untagged objects.
-	  </constant>
-	</constants>
+          <constant id="JVMTI_HEAP_OBJECT_TAGGED" num="1">
+            Tagged objects only.
+          </constant>
+          <constant id="JVMTI_HEAP_OBJECT_UNTAGGED" num="2">
+            Untagged objects only.
+          </constant>
+          <constant id="JVMTI_HEAP_OBJECT_EITHER" num="3">
+            Either tagged or untagged objects.
+          </constant>
+        </constants>
 
         <constants id="jvmtiHeapRootKind" label="Heap Root Kind Enumeration" kind="enum">
-	  <constant id="JVMTI_HEAP_ROOT_JNI_GLOBAL" num="1">
-	    JNI global reference.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_SYSTEM_CLASS" num="2">
-	    System class.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_MONITOR" num="3">
-	    Monitor.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_STACK_LOCAL" num="4">
-	    Stack local.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_JNI_LOCAL" num="5">
-	    JNI local reference.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_THREAD" num="6">
-	    Thread.
-	  </constant>
-	  <constant id="JVMTI_HEAP_ROOT_OTHER" num="7">
-	    Other.
-	  </constant>
-	</constants>
+          <constant id="JVMTI_HEAP_ROOT_JNI_GLOBAL" num="1">
+            JNI global reference.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_SYSTEM_CLASS" num="2">
+            System class.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_MONITOR" num="3">
+            Monitor.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_STACK_LOCAL" num="4">
+            Stack local.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_JNI_LOCAL" num="5">
+            JNI local reference.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_THREAD" num="6">
+            Thread.
+          </constant>
+          <constant id="JVMTI_HEAP_ROOT_OTHER" num="7">
+            Other.
+          </constant>
+        </constants>
 
         <constants id="jvmtiObjectReferenceKind" label="Object Reference Enumeration" kind="enum">
-	  <constant id="JVMTI_REFERENCE_CLASS" num="1">
-	    Reference from an object to its class.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_FIELD" num="2">
-	    Reference from an object to the value of one of its instance fields.
-	    For references of this kind the <code>referrer_index</code>
-	    parameter to the <internallink id="jvmtiObjectReferenceCallback">
+          <constant id="JVMTI_REFERENCE_CLASS" num="1">
+            Reference from an object to its class.
+          </constant>
+          <constant id="JVMTI_REFERENCE_FIELD" num="2">
+            Reference from an object to the value of one of its instance fields.
+            For references of this kind the <code>referrer_index</code>
+            parameter to the <internallink id="jvmtiObjectReferenceCallback">
             jvmtiObjectReferenceCallback</internallink> is the index of the
- 	    the instance field. The index is based on the order of all the
+            the instance field. The index is based on the order of all the
             object's fields. This includes all fields of the directly declared
             static and instance fields in the class, and includes all fields (both
             public and private) fields declared in superclasses and superinterfaces.
@@ -5049,31 +5049,31 @@
             declared class (see <functionlink id="GetClassFields"/>), with the total
             number of fields (both public and private) declared in all superclasses
             and superinterfaces. The index starts at zero.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_ARRAY_ELEMENT" num="3">
-	    Reference from an array to one of its elements.
-	    For references of this kind the <code>referrer_index</code>
+          </constant>
+          <constant id="JVMTI_REFERENCE_ARRAY_ELEMENT" num="3">
+            Reference from an array to one of its elements.
+            For references of this kind the <code>referrer_index</code>
             parameter to the <internallink id="jvmtiObjectReferenceCallback">
             jvmtiObjectReferenceCallback</internallink> is the array index.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_CLASS_LOADER" num="4">
-	    Reference from a class to its class loader.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_SIGNERS" num="5">
-	    Reference from a class to its signers array.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_PROTECTION_DOMAIN" num="6">
-	    Reference from a class to its protection domain.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_INTERFACE" num="7">
-	    Reference from a class to one of its interfaces.
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_STATIC_FIELD" num="8">
-	    Reference from a class to the value of one of its static fields.
-	    For references of this kind the <code>referrer_index</code>
-	    parameter to the <internallink id="jvmtiObjectReferenceCallback">
+          </constant>
+          <constant id="JVMTI_REFERENCE_CLASS_LOADER" num="4">
+            Reference from a class to its class loader.
+          </constant>
+          <constant id="JVMTI_REFERENCE_SIGNERS" num="5">
+            Reference from a class to its signers array.
+          </constant>
+          <constant id="JVMTI_REFERENCE_PROTECTION_DOMAIN" num="6">
+            Reference from a class to its protection domain.
+          </constant>
+          <constant id="JVMTI_REFERENCE_INTERFACE" num="7">
+            Reference from a class to one of its interfaces.
+          </constant>
+          <constant id="JVMTI_REFERENCE_STATIC_FIELD" num="8">
+            Reference from a class to the value of one of its static fields.
+            For references of this kind the <code>referrer_index</code>
+            parameter to the <internallink id="jvmtiObjectReferenceCallback">
             jvmtiObjectReferenceCallback</internallink> is the index of the
- 	    the static field. The index is based on the order of all the
+            the static field. The index is based on the order of all the
             object's fields. This includes all fields of the directly declared
             static and instance fields in the class, and includes all fields (both
             public and private) fields declared in superclasses and superinterfaces.
@@ -5083,30 +5083,30 @@
             and superinterfaces. The index starts at zero.
             Note: this definition differs from that in the <jvmti/> 1.0 Specification.
             <rationale>No known implementations used the 1.0 definition.</rationale>
-	  </constant>
-	  <constant id="JVMTI_REFERENCE_CONSTANT_POOL" num="9">
-	    Reference from a class to a resolved entry in the constant pool.
-	    For references of this kind the <code>referrer_index</code>
+          </constant>
+          <constant id="JVMTI_REFERENCE_CONSTANT_POOL" num="9">
+            Reference from a class to a resolved entry in the constant pool.
+            For references of this kind the <code>referrer_index</code>
             parameter to the <internallink id="jvmtiObjectReferenceCallback">
             jvmtiObjectReferenceCallback</internallink> is the index into
             constant pool table of the class, starting at 1. See
             <vmspec chapter="4.4"/>.
-	  </constant>
-	</constants>
+          </constant>
+        </constants>
 
         <constants id="jvmtiIterationControl" label="Iteration Control Enumeration" kind="enum">
-	  <constant id="JVMTI_ITERATION_CONTINUE" num="1">
-	    Continue the iteration.
+          <constant id="JVMTI_ITERATION_CONTINUE" num="1">
+            Continue the iteration.
             If this is a reference iteration, follow the references of this object.
-	  </constant>
-	  <constant id="JVMTI_ITERATION_IGNORE" num="2">
-	    Continue the iteration.
+          </constant>
+          <constant id="JVMTI_ITERATION_IGNORE" num="2">
+            Continue the iteration.
             If this is a reference iteration, ignore the references of this object.
-	  </constant>
-	  <constant id="JVMTI_ITERATION_ABORT" num="0">
-	    Abort the iteration.
-	  </constant>
-	</constants>
+          </constant>
+          <constant id="JVMTI_ITERATION_ABORT" num="0">
+            Abort the iteration.
+          </constant>
+        </constants>
     </intro>
 
     <callback id="jvmtiHeapObjectCallback">
@@ -5114,7 +5114,7 @@
       <synopsis>Heap Object Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes (but does not pass in) an object in the heap.
+        Describes (but does not pass in) an object in the heap.
         <p/>
         Return value should be <code>JVMTI_ITERATION_CONTINUE</code> to continue iteration,
         or <code>JVMTI_ITERATION_ABORT</code> to stop iteration.
@@ -5124,35 +5124,35 @@
       </description>
       <parameters>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of object (zero if the class is not tagged).
-	    If the object represents a runtime class,
+          <jlong/>
+          <description>
+            The tag of the class of object (zero if the class is not tagged).
+            If the object represents a runtime class,
             the <code>class_tag</code> is the tag
-	    associated with <code>java.lang.Class</code>
+            associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    The object tag value, or zero if the object is not tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            The object tag value, or zero if the object is not tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -5161,8 +5161,8 @@
       <synopsis>Heap Root Object Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes (but does not pass in) an object that is a root for the purposes
-	of garbage collection.
+        Describes (but does not pass in) an object that is a root for the purposes
+        of garbage collection.
         <p/>
         Return value should be <code>JVMTI_ITERATION_CONTINUE</code> to continue iteration,
         <code>JVMTI_ITERATION_IGNORE</code> to continue iteration without pursuing
@@ -5172,41 +5172,41 @@
         function restrictions</internallink>.
       </description>
       <parameters>
-	<param id="root_kind">
-	  <enum>jvmtiHeapRootKind</enum>
-	  <description>
-	    The kind of heap root.
-	  </description>
-	</param>
+        <param id="root_kind">
+          <enum>jvmtiHeapRootKind</enum>
+          <description>
+            The kind of heap root.
+          </description>
+        </param>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of object (zero if the class is not tagged).
+          <jlong/>
+          <description>
+            The tag of the class of object (zero if the class is not tagged).
             If the object represents a runtime class, the <code>class_tag</code> is the tag
             associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    The object tag value, or zero if the object is not tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            The object tag value, or zero if the object is not tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -5215,8 +5215,8 @@
       <synopsis>Stack Reference Object Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes (but does not pass in) an object on the stack that is a root for
-	the purposes of garbage collection.
+        Describes (but does not pass in) an object on the stack that is a root for
+        the purposes of garbage collection.
         <p/>
         Return value should be <code>JVMTI_ITERATION_CONTINUE</code> to continue iteration,
         <code>JVMTI_ITERATION_IGNORE</code> to continue iteration without pursuing
@@ -5226,66 +5226,66 @@
         function restrictions</internallink>.
       </description>
       <parameters>
-	<param id="root_kind">
-	  <enum>jvmtiHeapRootKind</enum>
-	  <description>
-	    The kind of root (either <code>JVMTI_HEAP_ROOT_STACK_LOCAL</code> or
-	    <code>JVMTI_HEAP_ROOT_JNI_LOCAL</code>).
-	  </description>
-	</param>
+        <param id="root_kind">
+          <enum>jvmtiHeapRootKind</enum>
+          <description>
+            The kind of root (either <code>JVMTI_HEAP_ROOT_STACK_LOCAL</code> or
+            <code>JVMTI_HEAP_ROOT_JNI_LOCAL</code>).
+          </description>
+        </param>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
+          <jlong/>
+          <description>
            The tag of the class of object (zero if the class is not tagged).
            If the object represents a runtime class, the  <code>class_tag</code> is the tag
            associated with <code>java.lang.Class</code>
            (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            Size of the object (in bytes). See <functionlink id="GetObjectSize"/>.
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    The object tag value, or zero if the object is not tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            The object tag value, or zero if the object is not tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="thread_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the thread corresponding to this stack, zero if not tagged.
-	  </description>
-	</param>
+          <jlong/>
+          <description>
+            The tag of the thread corresponding to this stack, zero if not tagged.
+          </description>
+        </param>
         <param id="depth">
-	  <jint/>
-	  <description>
-	    The depth of the frame.
-	  </description>
-	</param>
+          <jint/>
+          <description>
+            The depth of the frame.
+          </description>
+        </param>
         <param id="method">
-	  <jmethodID/>
-	  <description>
-	    The method executing in this frame.
-	  </description>
-	</param>
+          <jmethodID/>
+          <description>
+            The method executing in this frame.
+          </description>
+        </param>
         <param id="slot">
-	  <jint/>
-	  <description>
-	    The slot number.
-	  </description>
-	</param>
+          <jint/>
+          <description>
+            The slot number.
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -5294,8 +5294,8 @@
       <synopsis>Object Reference Callback</synopsis>
       <description>
         Agent supplied callback function.
-	Describes a reference from an object (the referrer) to another object
-	(the referree).
+        Describes a reference from an object (the referrer) to another object
+        (the referree).
         <p/>
         Return value should be <code>JVMTI_ITERATION_CONTINUE</code> to continue iteration,
         <code>JVMTI_ITERATION_IGNORE</code> to continue iteration without pursuing
@@ -5305,77 +5305,77 @@
         function restrictions</internallink>.
       </description>
       <parameters>
-	<param id="reference_kind">
-	  <enum>jvmtiObjectReferenceKind</enum>
-	  <description>
-	    The type of reference.
-	  </description>
-	</param>
+        <param id="reference_kind">
+          <enum>jvmtiObjectReferenceKind</enum>
+          <description>
+            The type of reference.
+          </description>
+        </param>
         <param id="class_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the class of referree object (zero if the class is not tagged).
+          <jlong/>
+          <description>
+            The tag of the class of referree object (zero if the class is not tagged).
             If the referree object represents a runtime class,
             the  <code>class_tag</code> is the tag
             associated with <code>java.lang.Class</code>
             (zero if <code>java.lang.Class</code> is not tagged).
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="size">
-	  <jlong/>
-	  <description>
-	    Size of the referree object (in bytes).
+          <jlong/>
+          <description>
+            Size of the referree object (in bytes).
             See <functionlink id="GetObjectSize"/>.
-	  </description>
-	</param>
+          </description>
+        </param>
         <param id="tag_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    The referree object tag value, or zero if the object is not
-	    tagged.
-	    To set the tag value to be associated with the object
-	    the agent sets the <code>jlong</code> pointed to by the parameter.
-	  </description>
-	</param>
+          <outptr><jlong/></outptr>
+          <description>
+            The referree object tag value, or zero if the object is not
+            tagged.
+            To set the tag value to be associated with the object
+            the agent sets the <code>jlong</code> pointed to by the parameter.
+          </description>
+        </param>
         <param id="referrer_tag">
-	  <jlong/>
-	  <description>
-	    The tag of the referrer object, or zero if the referrer
-	    object is not tagged.
-	  </description>
-	</param>
-	<param id="referrer_index">
-	  <jint/>
-	  <description>
-	    For references of type <code>JVMTI_REFERENCE_FIELD</code> or
+          <jlong/>
+          <description>
+            The tag of the referrer object, or zero if the referrer
+            object is not tagged.
+          </description>
+        </param>
+        <param id="referrer_index">
+          <jint/>
+          <description>
+            For references of type <code>JVMTI_REFERENCE_FIELD</code> or
             <code>JVMTI_REFERENCE_STATIC_FIELD</code> the index
-	    of the field in the referrer object. The index is based on the
-	    order of all the object's fields - see <internallink
-	    id="JVMTI_REFERENCE_FIELD">JVMTI_REFERENCE_FIELD</internallink>
+            of the field in the referrer object. The index is based on the
+            order of all the object's fields - see <internallink
+            id="JVMTI_REFERENCE_FIELD">JVMTI_REFERENCE_FIELD</internallink>
             or <internallink
-	    id="JVMTI_REFERENCE_STATIC_FIELD">JVMTI_REFERENCE_STATIC_FIELD
-	    </internallink> for further description.
-	    <p/>
-	    For references of type <code>JVMTI_REFERENCE_ARRAY_ELEMENT</code>
-	    the array index - see <internallink id="JVMTI_REFERENCE_ARRAY_ELEMENT">
-	    JVMTI_REFERENCE_ARRAY_ELEMENT</internallink> for further description.
-	    <p/>
-	    For references of type <code>JVMTI_REFERENCE_CONSTANT_POOL</code>
-	    the index into the constant pool of the class - see
-	    <internallink id="JVMTI_REFERENCE_CONSTANT_POOL">
-	    JVMTI_REFERENCE_CONSTANT_POOL</internallink> for further
-	    description.
-	    <p/>
-	    For references of other kinds the <code>referrer_index</code> is
-	    <code>-1</code>.
-	  </description>
-	</param>
+            id="JVMTI_REFERENCE_STATIC_FIELD">JVMTI_REFERENCE_STATIC_FIELD
+            </internallink> for further description.
+            <p/>
+            For references of type <code>JVMTI_REFERENCE_ARRAY_ELEMENT</code>
+            the array index - see <internallink id="JVMTI_REFERENCE_ARRAY_ELEMENT">
+            JVMTI_REFERENCE_ARRAY_ELEMENT</internallink> for further description.
+            <p/>
+            For references of type <code>JVMTI_REFERENCE_CONSTANT_POOL</code>
+            the index into the constant pool of the class - see
+            <internallink id="JVMTI_REFERENCE_CONSTANT_POOL">
+            JVMTI_REFERENCE_CONSTANT_POOL</internallink> for further
+            description.
+            <p/>
+            For references of other kinds the <code>referrer_index</code> is
+            <code>-1</code>.
+          </description>
+        </param>
         <param id="user_data">
-	  <outptr><void/></outptr>
-	  <description>
-	    The user supplied data that was passed into the iteration function.
-	  </description>
-	</param>
+          <outptr><void/></outptr>
+          <description>
+            The user supplied data that was passed into the iteration function.
+          </description>
+        </param>
       </parameters>
     </callback>
 
@@ -5384,9 +5384,9 @@
       <description>
         This function iterates over all objects that are directly
         and indirectly reachable from the specified object.
-	For each object <i>A</i> (known
-	as the referrer) with a reference to object <i>B</i> the specified
-	callback function is called to describe the object reference.
+        For each object <i>A</i> (known
+        as the referrer) with a reference to object <i>B</i> the specified
+        callback function is called to describe the object reference.
         The callback is called exactly once for each reference from a referrer;
         this is true even if there are reference cycles or multiple paths to
         the referrer.
@@ -5415,29 +5415,29 @@
       </capabilities>
       <parameters>
         <param id="object">
-	  <jobject/>
-	    <description>
-	      The object
-	    </description>
-	</param>
+          <jobject/>
+            <description>
+              The object
+            </description>
+        </param>
         <param id="object_reference_callback">
-	  <ptrtype>
-	    <struct>jvmtiObjectReferenceCallback</struct>
-	  </ptrtype>
-	    <description>
-	      The callback to be called to describe each
-	      object reference.
-	    </description>
-	</param>
+          <ptrtype>
+            <struct>jvmtiObjectReferenceCallback</struct>
+          </ptrtype>
+            <description>
+              The callback to be called to describe each
+              object reference.
+            </description>
+        </param>
         <param id="user_data">
-	  <inbuf>
-	    <void/>
-	    <nullok><code>NULL</code> is passed as the user supplied data</nullok>
-	  </inbuf>
-	  <description>
-	    User supplied data to be passed to the callback.
-	  </description>
-	</param>
+          <inbuf>
+            <void/>
+            <nullok><code>NULL</code> is passed as the user supplied data</nullok>
+          </inbuf>
+          <description>
+            User supplied data to be passed to the callback.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -5448,17 +5448,17 @@
       <description>
         This function iterates over the root objects and all objects that
         are directly and indirectly reachable from the root objects.
-	The root objects comprise the set of system classes,
-	JNI globals, references from thread stacks, and other objects used as roots
-	for the purposes of garbage collection.
-	<p/>
-	For each root the <paramlink id="heap_root_callback"></paramlink>
-	or <paramlink id="stack_ref_callback"></paramlink> callback is called.
-	An object can be a root object for more than one reason and in that case
-	the appropriate callback is called for each reason.
-	<p/>
-	For each object reference the <paramlink id="object_ref_callback"></paramlink>
-	callback function is called to describe the object reference.
+        The root objects comprise the set of system classes,
+        JNI globals, references from thread stacks, and other objects used as roots
+        for the purposes of garbage collection.
+        <p/>
+        For each root the <paramlink id="heap_root_callback"></paramlink>
+        or <paramlink id="stack_ref_callback"></paramlink> callback is called.
+        An object can be a root object for more than one reason and in that case
+        the appropriate callback is called for each reason.
+        <p/>
+        For each object reference the <paramlink id="object_ref_callback"></paramlink>
+        callback function is called to describe the object reference.
         The callback is called exactly once for each reference from a referrer;
         this is true even if there are reference cycles or multiple paths to
         the referrer.
@@ -5471,13 +5471,13 @@
         <p/>
         See <functionlink id="FollowReferences"/> for the object
         references which are reported.
-	<p/>
-	Roots are always reported to the profiler before any object references
-	are reported. In other words, the <paramlink id="object_ref_callback"></paramlink>
-	callback will not be called until the appropriate callback has been called
-	for all roots. If the <paramlink id="object_ref_callback"></paramlink> callback is
-	specified as <code>NULL</code> then this function returns after
-	reporting the root objects to the profiler.
+        <p/>
+        Roots are always reported to the profiler before any object references
+        are reported. In other words, the <paramlink id="object_ref_callback"></paramlink>
+        callback will not be called until the appropriate callback has been called
+        for all roots. If the <paramlink id="object_ref_callback"></paramlink> callback is
+        specified as <code>NULL</code> then this function returns after
+        reporting the root objects to the profiler.
         <p/>
         During the execution of this function the state of the heap
         does not change: no objects are allocated, no objects are
@@ -5494,48 +5494,48 @@
       </capabilities>
       <parameters>
         <param id="heap_root_callback">
-	  <ptrtype>
-	    <struct>jvmtiHeapRootCallback</struct>
-	    <nullok>do not report heap roots</nullok>
-	  </ptrtype>
-	    <description>
-	      The callback function to be called for each heap root of type
-	      <code>JVMTI_HEAP_ROOT_JNI_GLOBAL</code>,
-	      <code>JVMTI_HEAP_ROOT_SYSTEM_CLASS</code>,
-	      <code>JVMTI_HEAP_ROOT_MONITOR</code>,
-	      <code>JVMTI_HEAP_ROOT_THREAD</code>, or
-	      <code>JVMTI_HEAP_ROOT_OTHER</code>.
-	    </description>
-	</param>
+          <ptrtype>
+            <struct>jvmtiHeapRootCallback</struct>
+            <nullok>do not report heap roots</nullok>
+          </ptrtype>
+            <description>
+              The callback function to be called for each heap root of type
+              <code>JVMTI_HEAP_ROOT_JNI_GLOBAL</code>,
+              <code>JVMTI_HEAP_ROOT_SYSTEM_CLASS</code>,
+              <code>JVMTI_HEAP_ROOT_MONITOR</code>,
+              <code>JVMTI_HEAP_ROOT_THREAD</code>, or
+              <code>JVMTI_HEAP_ROOT_OTHER</code>.
+            </description>
+        </param>
         <param id="stack_ref_callback">
-	  <ptrtype>
-	    <struct>jvmtiStackReferenceCallback</struct>
-	    <nullok>do not report stack references</nullok>
-	  </ptrtype>
-	    <description>
-	      The callback function to be called for each heap root of
-	      <code>JVMTI_HEAP_ROOT_STACK_LOCAL</code> or
-	      <code>JVMTI_HEAP_ROOT_JNI_LOCAL</code>.
-	    </description>
-	</param>
+          <ptrtype>
+            <struct>jvmtiStackReferenceCallback</struct>
+            <nullok>do not report stack references</nullok>
+          </ptrtype>
+            <description>
+              The callback function to be called for each heap root of
+              <code>JVMTI_HEAP_ROOT_STACK_LOCAL</code> or
+              <code>JVMTI_HEAP_ROOT_JNI_LOCAL</code>.
+            </description>
+        </param>
         <param id="object_ref_callback">
-	  <ptrtype>
-	    <struct>jvmtiObjectReferenceCallback</struct>
-	    <nullok>do not follow references from the root objects</nullok>
-	  </ptrtype>
-	    <description>
-	      The callback function to be called for each object reference.
-	    </description>
-	</param>
+          <ptrtype>
+            <struct>jvmtiObjectReferenceCallback</struct>
+            <nullok>do not follow references from the root objects</nullok>
+          </ptrtype>
+            <description>
+              The callback function to be called for each object reference.
+            </description>
+        </param>
         <param id="user_data">
-	  <inbuf>
-	    <void/>
-	    <nullok><code>NULL</code> is passed as the user supplied data</nullok>
-	  </inbuf>
-	  <description>
-	    User supplied data to be passed to the callback.
-	  </description>
-	</param>
+          <inbuf>
+            <void/>
+            <nullok><code>NULL</code> is passed as the user supplied data</nullok>
+          </inbuf>
+          <description>
+            User supplied data to be passed to the callback.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -5545,17 +5545,17 @@
       <synopsis>Iterate Over Heap</synopsis>
       <description>
         Iterate over all objects in the heap. This includes both reachable and
-	unreachable objects.
-	<p/>
-	The <paramlink id="object_filter"></paramlink> parameter indicates the
-	objects for which the callback function is called. If this parameter
-	is <code>JVMTI_HEAP_OBJECT_TAGGED</code> then the callback will only be
-	called for every object that is tagged. If the parameter is
-	<code>JVMTI_HEAP_OBJECT_UNTAGGED</code> then the callback will only be
-	for objects that are not tagged. If the parameter
-	is <code>JVMTI_HEAP_OBJECT_EITHER</code> then the callback will be
-	called for every object in the heap, irrespective of whether it is
-	tagged or not.
+        unreachable objects.
+        <p/>
+        The <paramlink id="object_filter"></paramlink> parameter indicates the
+        objects for which the callback function is called. If this parameter
+        is <code>JVMTI_HEAP_OBJECT_TAGGED</code> then the callback will only be
+        called for every object that is tagged. If the parameter is
+        <code>JVMTI_HEAP_OBJECT_UNTAGGED</code> then the callback will only be
+        for objects that are not tagged. If the parameter
+        is <code>JVMTI_HEAP_OBJECT_EITHER</code> then the callback will be
+        called for every object in the heap, irrespective of whether it is
+        tagged or not.
         <p/>
         During the execution of this function the state of the heap
         does not change: no objects are allocated, no objects are
@@ -5571,30 +5571,30 @@
         <required id="can_tag_objects"></required>
       </capabilities>
       <parameters>
-	<param id="object_filter">
-	  <enum>jvmtiHeapObjectFilter</enum>
-	  <description>
-	    Indicates the objects for which the callback function is called.
-	  </description>
-	</param>
+        <param id="object_filter">
+          <enum>jvmtiHeapObjectFilter</enum>
+          <description>
+            Indicates the objects for which the callback function is called.
+          </description>
+        </param>
         <param id="heap_object_callback">
-	  <ptrtype>
-	    <struct>jvmtiHeapObjectCallback</struct>
-	  </ptrtype>
-	    <description>
-	      The iterator function to be called for each
-	      object matching the <paramlink id="object_filter"/>.
-	    </description>
-	</param>
+          <ptrtype>
+            <struct>jvmtiHeapObjectCallback</struct>
+          </ptrtype>
+            <description>
+              The iterator function to be called for each
+              object matching the <paramlink id="object_filter"/>.
+            </description>
+        </param>
         <param id="user_data">
-	  <inbuf>
-	    <void/>
-	    <nullok><code>NULL</code> is passed as the user supplied data</nullok>
-	  </inbuf>
-	  <description>
-	    User supplied data to be passed to the callback.
-	  </description>
-	</param>
+          <inbuf>
+            <void/>
+            <nullok><code>NULL</code> is passed as the user supplied data</nullok>
+          </inbuf>
+          <description>
+            User supplied data to be passed to the callback.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -5606,63 +5606,63 @@
         Iterate over all objects in the heap that are instances of the specified class.
         This includes direct instances of the specified class and
         instances of all subclasses of the specified class.
-	This includes both reachable and unreachable objects.
-	<p/>
-	The <paramlink id="object_filter"></paramlink> parameter indicates the
-	objects for which the callback function is called. If this parameter
-	is <code>JVMTI_HEAP_OBJECT_TAGGED</code> then the callback will only be
-	called for every object that is tagged. If the parameter is
-	<code>JVMTI_HEAP_OBJECT_UNTAGGED</code> then the callback will only be
-	called for objects that are not tagged. If the parameter
-	is <code>JVMTI_HEAP_OBJECT_EITHER</code> then the callback will be
-	called for every object in the heap, irrespective of whether it is
-	tagged or not.
-	<p/>
-	During the execution of this function the state of the heap
-	does not change: no objects are allocated, no objects are
-	garbage collected, and the state of objects (including
-	held values) does not change.
-	As a result, threads executing Java
-	programming language code, threads attempting to resume the
-	execution of Java programming language code, and threads
-	attempting to execute JNI functions are typically stalled.
+        This includes both reachable and unreachable objects.
+        <p/>
+        The <paramlink id="object_filter"></paramlink> parameter indicates the
+        objects for which the callback function is called. If this parameter
+        is <code>JVMTI_HEAP_OBJECT_TAGGED</code> then the callback will only be
+        called for every object that is tagged. If the parameter is
+        <code>JVMTI_HEAP_OBJECT_UNTAGGED</code> then the callback will only be
+        called for objects that are not tagged. If the parameter
+        is <code>JVMTI_HEAP_OBJECT_EITHER</code> then the callback will be
+        called for every object in the heap, irrespective of whether it is
+        tagged or not.
+        <p/>
+        During the execution of this function the state of the heap
+        does not change: no objects are allocated, no objects are
+        garbage collected, and the state of objects (including
+        held values) does not change.
+        As a result, threads executing Java
+        programming language code, threads attempting to resume the
+        execution of Java programming language code, and threads
+        attempting to execute JNI functions are typically stalled.
       </description>
       <origin>new</origin>
       <capabilities>
         <required id="can_tag_objects"></required>
       </capabilities>
       <parameters>
-	<param id="klass">
-	  <jclass/>
-	    <description>
-	      Iterate over objects of this class only.
-	    </description>
-	</param>
-	<param id="object_filter">
-	  <enum>jvmtiHeapObjectFilter</enum>
-	  <description>
-	    Indicates the objects for which the callback function is called.
-	  </description>
-	</param>
-	<param id="heap_object_callback">
-	  <ptrtype>
-	    <struct>jvmtiHeapObjectCallback</struct>
-	  </ptrtype>
-	    <description>
-	      The iterator function to be called for each
-	      <paramlink id="klass"/> instance matching
+        <param id="klass">
+          <jclass/>
+            <description>
+              Iterate over objects of this class only.
+            </description>
+        </param>
+        <param id="object_filter">
+          <enum>jvmtiHeapObjectFilter</enum>
+          <description>
+            Indicates the objects for which the callback function is called.
+          </description>
+        </param>
+        <param id="heap_object_callback">
+          <ptrtype>
+            <struct>jvmtiHeapObjectCallback</struct>
+          </ptrtype>
+            <description>
+              The iterator function to be called for each
+              <paramlink id="klass"/> instance matching
               the <paramlink id="object_filter"/>.
-	    </description>
-	</param>
+            </description>
+        </param>
         <param id="user_data">
-	  <inbuf>
-	    <void/>
-	    <nullok><code>NULL</code> is passed as the user supplied data</nullok>
-	  </inbuf>
-	  <description>
-	    User supplied data to be passed to the callback.
-	  </description>
-	</param>
+          <inbuf>
+            <void/>
+            <nullok><code>NULL</code> is passed as the user supplied data</nullok>
+          </inbuf>
+          <description>
+            User supplied data to be passed to the callback.
+          </description>
+        </param>
       </parameters>
       <errors>
       </errors>
@@ -5684,50 +5684,50 @@
     <function id="GetLocalObject" num="21">
       <synopsis>Get Local Variable - Object</synopsis>
       <description>
-	This function can be used to retrieve the value of a local
+        This function can be used to retrieve the value of a local
         variable whose type is <code>Object</code> or a subclass of <code>Object</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jobject/></outptr>
-	    <description>
-	      On return, points to the variable's value.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jobject/></outptr>
+            <description>
+              On return, points to the variable's value.
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
           The variable type is not
           <code>Object</code> or a subclass of <code>Object</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
@@ -5742,487 +5742,487 @@
       </description>
       <origin>new</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jobject/></outptr>
-	    <description>
-	      On return, points to the variable's value.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  If the specified frame is a static method frame.
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jobject/></outptr>
+            <description>
+              On return, points to the variable's value.
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          If the specified frame is a static method frame.
+        </error>
       </errors>
     </function>
     <function id="GetLocalInt" num="22">
       <synopsis>Get Local Variable - Int</synopsis>
       <description>
-	This function can be used to retrieve the value of a local
+        This function can be used to retrieve the value of a local
         variable whose type is <code>int</code>,
         <code>short</code>, <code>char</code>, <code>byte</code>, or
-	<code>boolean</code>.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jint/></outptr>
-	  <description>
-	    On return, points to the variable's value.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not
+        <code>boolean</code>.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jint/></outptr>
+          <description>
+            On return, points to the variable's value.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not
           <code>int</code>, <code>short</code>,
           <code>char</code>, <code>byte</code>, or
-  	  <code>boolean</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+          <code>boolean</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="GetLocalLong" num="23">
       <synopsis>Get Local Variable - Long</synopsis>
       <description>
-	This function can be used to retrieve the value of a local
+        This function can be used to retrieve the value of a local
         variable whose type is <code>long</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jlong/></outptr>
-	  <description>
-	    On return, points to the variable's value.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>long</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jlong/></outptr>
+          <description>
+            On return, points to the variable's value.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>long</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="GetLocalFloat" num="24">
       <synopsis>Get Local Variable - Float</synopsis>
       <description>
-	This function can be used to retrieve the value of a local
+        This function can be used to retrieve the value of a local
         variable whose type is <code>float</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jfloat/></outptr>
-	  <description>
-	    On return, points to the variable's value.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>float</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jfloat/></outptr>
+          <description>
+            On return, points to the variable's value.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>float</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="GetLocalDouble" num="25">
       <synopsis>Get Local Variable - Double</synopsis>
       <description>
-	This function can be used to retrieve the value of a local
+        This function can be used to retrieve the value of a local
         variable whose type is <code>long</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value_ptr">
-	  <outptr><jdouble/></outptr>
-	  <description>
-	    On return, points to the variable's value.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>double</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value_ptr">
+          <outptr><jdouble/></outptr>
+          <description>
+            On return, points to the variable's value.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>double</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="SetLocalObject" num="26">
       <synopsis>Set Local Variable - Object</synopsis>
       <description>
-	This function can be used to set the value of a local
+        This function can be used to set the value of a local
         variable whose type is <code>Object</code> or a subclass of <code>Object</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value">
-	  <jobject/>
-	    <description>
-	      The new value for the variable.
-	    </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not
-	  <code>Object</code> or a subclass of <code>Object</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The supplied <paramlink id="value"/> is not compatible
-	  with the variable type.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value">
+          <jobject/>
+            <description>
+              The new value for the variable.
+            </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not
+          <code>Object</code> or a subclass of <code>Object</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The supplied <paramlink id="value"/> is not compatible
+          with the variable type.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="SetLocalInt" num="27">
       <synopsis>Set Local Variable - Int</synopsis>
       <description>
-	This function can be used to set the value of a local
+        This function can be used to set the value of a local
         variable whose type is <code>int</code>,
         <code>short</code>, <code>char</code>, <code>byte</code>, or
-	<code>boolean</code>.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value">
-	  <jint/>
-	  <description>
-	    The new value for the variable.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not
+        <code>boolean</code>.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value">
+          <jint/>
+          <description>
+            The new value for the variable.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not
           <code>int</code>, <code>short</code>,
           <code>char</code>, <code>byte</code>, or
-  	  <code>boolean</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+          <code>boolean</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="SetLocalLong" num="28">
       <synopsis>Set Local Variable - Long</synopsis>
       <description>
-	This function can be used to set the value of a local
+        This function can be used to set the value of a local
         variable whose type is <code>long</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value">
-	  <jlong/>
-	  <description>
-	    The new value for the variable.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>long</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value">
+          <jlong/>
+          <description>
+            The new value for the variable.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>long</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="SetLocalFloat" num="29">
       <synopsis>Set Local Variable - Float</synopsis>
       <description>
-	This function can be used to set the value of a local
+        This function can be used to set the value of a local
         variable whose type is <code>float</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value">
-	  <jfloat/>
-	  <description>
-	    The new value for the variable.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>float</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value">
+          <jfloat/>
+          <description>
+            The new value for the variable.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>float</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
 
     <function id="SetLocalDouble" num="30">
       <synopsis>Set Local Variable - Double</synopsis>
       <description>
-	This function can be used to set the value of a local
+        This function can be used to set the value of a local
         variable whose type is <code>double</code>.
       </description>
       <origin>jvmdi</origin>
       <capabilities>
-	<required id="can_access_local_variables"></required>
-      </capabilities>
-      <parameters>
- 	<param id="thread">
-	  <jthread null="current" frame="frame"/>
-	  <description>
-	    The thread of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="depth">
-	  <jframeID thread="thread"/>
-	  <description>
-	    The depth of the frame containing the variable's value.
-	  </description>
-	</param>
-	<param id="slot">
-	  <jint/>
-	  <description>
-	    The variable's slot number.
-	  </description>
-	</param>
-	<param id="value">
-	  <jdouble/>
-	  <description>
-	    The new value for the variable.
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_INVALID_SLOT">
-	  Invalid <code>slot</code>.
-	</error>
-	<error id="JVMTI_ERROR_TYPE_MISMATCH">
-	  The variable type is not <code>double</code>.
-	</error>
-	<error id="JVMTI_ERROR_OPAQUE_FRAME">
-	  Not a visible frame
-	</error>
+        <required id="can_access_local_variables"></required>
+      </capabilities>
+      <parameters>
+        <param id="thread">
+          <jthread null="current" frame="frame"/>
+          <description>
+            The thread of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="depth">
+          <jframeID thread="thread"/>
+          <description>
+            The depth of the frame containing the variable's value.
+          </description>
+        </param>
+        <param id="slot">
+          <jint/>
+          <description>
+            The variable's slot number.
+          </description>
+        </param>
+        <param id="value">
+          <jdouble/>
+          <description>
+            The new value for the variable.
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_INVALID_SLOT">
+          Invalid <code>slot</code>.
+        </error>
+        <error id="JVMTI_ERROR_TYPE_MISMATCH">
+          The variable type is not <code>double</code>.
+        </error>
+        <error id="JVMTI_ERROR_OPAQUE_FRAME">
+          Not a visible frame
+        </error>
       </errors>
     </function>
   </category>
@@ -6235,79 +6235,79 @@
     <function id="SetBreakpoint" num="38">
       <synopsis>Set Breakpoint</synopsis>
       <description>
-	Set a breakpoint at the instruction indicated by
-	<code>method</code> and <code>location</code>.
-	An instruction can only have one breakpoint.
-	<p/>
-	Whenever the designated instruction is about to be executed, a
-	<eventlink id="Breakpoint"></eventlink> event is generated.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_generate_breakpoint_events"></required>
-      </capabilities>
-      <parameters>
-	<param id="klass">
-	  <jclass method="method"/>
-	    <description>
-	      The class in which to set the breakpoint
-	    </description>
-	</param>
-	<param id="method">
-	  <jmethodID class="klass"/>
-	    <description>
-	      The method in which to set the breakpoint
-	    </description>
-	</param>
-	<param id="location">
-	  <jlocation/>
-	  <description>
-	    the index of the instruction at which to set the breakpoint
-
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_DUPLICATE">
-	  The designated bytecode already has a breakpoint.
-	</error>
+        Set a breakpoint at the instruction indicated by
+        <code>method</code> and <code>location</code>.
+        An instruction can only have one breakpoint.
+        <p/>
+        Whenever the designated instruction is about to be executed, a
+        <eventlink id="Breakpoint"></eventlink> event is generated.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_generate_breakpoint_events"></required>
+      </capabilities>
+      <parameters>
+        <param id="klass">
+          <jclass method="method"/>
+            <description>
+              The class in which to set the breakpoint
+            </description>
+        </param>
+        <param id="method">
+          <jmethodID class="klass"/>
+            <description>
+              The method in which to set the breakpoint
+            </description>
+        </param>
+        <param id="location">
+          <jlocation/>
+          <description>
+            the index of the instruction at which to set the breakpoint
+
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_DUPLICATE">
+          The designated bytecode already has a breakpoint.
+        </error>
       </errors>
     </function>
 
     <function id="ClearBreakpoint" num="39">
       <synopsis>Clear Breakpoint</synopsis>
       <description>
-	Clear the breakpoint at the bytecode indicated by
-	<code>method</code> and <code>location</code>.
-      </description>
-      <origin>jvmdi</origin>
-      <capabilities>
-	<required id="can_generate_breakpoint_events"></required>
-      </capabilities>
-      <parameters>
-	<param id="klass">
-	  <jclass method="method"/>
-	    <description>
-	      The class in which to clear the breakpoint
-	    </description>
-	</param>
-	<param id="method">
-	  <jmethodID class="klass"/>
-	    <description>
-	      The method in which to clear the breakpoint
-	    </description>
-	</param>
-	<param id="location">
-	  <jlocation/>
-	  <description>
-	    the index of the instruction at which to clear the breakpoint
-	  </description>
-	</param>
-      </parameters>
-      <errors>
-	<error id="JVMTI_ERROR_NOT_FOUND">
-	  There's no breakpoint at the designated bytecode.
-	</error>
+        Clear the breakpoint at the bytecode indicated by
+        <code>method</code> and <code>location</code>.
+      </description>
+      <origin>jvmdi</origin>
+      <capabilities>
+        <required id="can_generate_breakpoint_events"></required>
+      </capabilities>
+      <parameters>
+        <param id="klass">
+          <jclass method="method"/>
+            <description>
+              The class in which to clear the breakpoint
+            </description>
+        </param>
+        <param id="method">
+          <jmethodID class="klass"/>
+            <description>
+              The method in which to clear the breakpoint
+            </description>
+        </param>
+        <param id="location">
+          <jlocation/>
+          <description>
+            the index of the instruction at which to clear the breakpoint
+          </description>
+        </param>
+      </parameters>
+      <errors>
+        <error id="JVMTI_ERROR_NOT_FOUND">
+          There's no breakpoi