Apache Commons BCEL
Version 6.9.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.9.0.

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields, and byte code instructions.

Maintenance and bug fix release.

Changes
-------
*           Add Support for Java 16 records #290. Thanks to Pablo Nicolas Diaz, Gary Gregory, Paul King, Mark Roberts.
*           Add null guard for InstructionFactory.createInvoke() #289. Thanks to Heewon Lee.
*           Avoid possible NullPointerException in org.apache.bcel.classfile.DescendingVisitor.accept(E[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in AnnotationEntryGen.getAnnotationAttributes(ConstantPoolGen, AnnotationEntryGen[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in AnnotationEntryGen.copyValues(ElementValuePair[], ConstantPoolGen, boolean). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in ArrayElementValueGen.ArrayElementValueGen(int, ElementValue[], ConstantPoolGen). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.generic.ClassGen.setMethods(Method[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.generic.ClassGen.unpackAnnotations(Attribute[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.classfile.ParameterAnnotationEntry.createParameterAnnotationEntries(Attribute[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.generic.ClassGen.ClassGen(JavaClass). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.generic.FieldGenOrMethodGen.addAll(Attribute[]). Thanks to Gary Gregory.
*           Avoid possible NullPointerException in org.apache.bcel.classfile.ParameterAnnotationEntry.createParameterAnnotationEntries(Attribute[]). Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.MethodParameters.setParameters(MethodParameter[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.ParameterAnnotations.setParameterAnnotationTable(ParameterAnnotationEntry[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.LocalVariableTypeTable.setLocalVariableTable(LocalVariable[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.LocalVariableTable.setLocalVariableTable(LocalVariable[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.LineNumberTable.setLineNumberTable(LineNumber[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.JavaClass.setMethods(Method[] with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.JavaClass.setInterfaces(int[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.JavaClass.setInterfaceNames(String[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.JavaClass.setFields(Field[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.JavaClass.setAttributes(Attribute[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.ConstantPool.setConstantPool(Constant[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.FieldOrMethod.setAttributes(Attribute[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.Annotations.setAnnotationTable(AnnotationEntry[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.ArrayElementValue.ArrayElementValue(int, ElementValue[], ConstantPool) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.BootstrapMethod.BootstrapMethod(int, int[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.BootstrapMethod.setBootstrapArguments(int[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.BootstrapMethods.BootstrapMethods(int, int, BootstrapMethod[], ConstantPool) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException after calling org.apache.bcel.classfile.BootstrapMethods.setBootstrapMethods(BootstrapMethod[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.InstructionList.redirectLocalVariables(LocalVariableGen[], InstructionHandle, InstructionHandle) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.InstructionList.redirectExceptionHandlers(CodeExceptionGen[], InstructionHandle, InstructionHandle) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.InstructionList.findHandle(InstructionHandle[], int[], int, int) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.MethodGen.setArgumentTypes(Type[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.MethodGen.setArgumentNames(String[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.MethodGen.removeRuntimeAttributes(Attribute[]) with null. Thanks to Gary Gregory.
*           Avoid NullPointerException calling org.apache.bcel.generic.MethodGen.makeMutableVersion(AnnotationEntry[]) with null. Thanks to Gary Gregory.
*           Bump org.apache.commons:commons-parent from 66 to 69 #283, #297. Thanks to Dependabot.
*           Bump org.jetbrains.kotlin:kotlin-stdlib from 1.9.22 to 1.9.23 #284. Thanks to Dependabot.
*           Bump commons-io:commons-io from 2.15.1 to 2.16.1 #295, #300. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-bcel/changes-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------
Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.8.2
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.8.2.

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields, and byte code instructions.

Maintenance and bug fix release.

New Features
------------
*           Fix ConcurrentModificationException in org.apache.bcel.util.SyntheticRepository.getInstance() #275. Thanks to Guillaume Nodet.
*           Add Maven property project.build.outputTimestamp for build reproducibility. Thanks to Gary Gregory.

Changes
-------
*           Bump GitHub various actions for CI builds. Thanks to Dependabot.
*           Bump org.assertj:assertj-core from 3.25.1 to 3.25.2. Thanks to Dependabot.
*           Bump org.apache.commons:commons-parent from 65 to 66. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-bcel/changes-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------
Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.8.1
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.8.1.

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields, and byte code instructions.

Maintenance and bug fix release.

Fixed Bugs
-----------

*           Replace internal use of StringBuffer with StringBuilder. Thanks to Gary Gregory.
* BCEL-370: CONSTANT_Dynamic is not handled in LDC #254. Thanks to Gary Gregory.
*           BCELComparator now uses generics. Thanks to Gary Gregory.
*           Avoid NullPointerException in ClassGen.BCELComparator#equals() and ClassGen.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in Constant.BCELComparator#equals() and Constant.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in Field.BCELComparator#equals() and Field.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in FieldGen.BCELComparator#equals() and FieldGen.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in JavaClass.BCELComparator#equals() and JavaClass.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in Method.BCELComparator#equals() and Method.BCELComparator#hashCode(). Thanks to Gary Gregory.
*           Avoid NullPointerException in MethodGen.BCELComparator#equals() and MethodGen.BCELComparator#hashCode(). Thanks to Gary Gregory.

Changes
--------

*           Bump GitHub various actions for CI builds. Thanks to Dependabot.
*           Bump jna.version from 5.13.0 to 5.14.0 #250. Thanks to Dependabot.
*           Bump org.jetbrains.kotlin:kotlin-stdlib from 1.9.21 to 1.9.22 #252. Thanks to Dependabot.
*           Bump org.apache.commons:commons-exec from 1.3 to 1.4.0 #255. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.8.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.8.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Maintenance and bug fix release.

New Features
-------------

*           Add and use InvalidMethodSignatureException extending ClassFormatException. Thanks to Gary Gregory.
*           Increase code coverage in Class2HTMLTestCase with new test input Java4Example #186. Thanks to nbauma109.
*           Add verifier tests on some opcodes #180. Thanks to nbauma109.
*           Added signature test cases for class/method, and bad signatures #182. Thanks to nbauma109.
*           Add Const.MAJOR_20. Thanks to Gary Gregory.
*           Add Const.MINOR_20. Thanks to Gary Gregory.
*           Add Const.MAJOR_21. Thanks to Gary Gregory.
*           Add Const.MINOR_21. Thanks to Gary Gregory.
*           [Bcelifier] stackmap support to pass JDK verifier #177. Thanks to nbauma109, Gary Gregory, Mark Roberts.
*           Fix SpotBugs [ERROR] Class org.apache.bcel.util.ClassVector defines non-transient non-serializable instance field vec [org.apache.bcel.util.ClassVector] In ClassVector.java SE_BAD_FIELD. Thanks to Gary Gregory.
*           Fix SpotBugs [ERROR] Switch statement found in org.apache.bcel.util.BCELFactory.visitAllocationInstruction(AllocationInstruction) where one case falls through to the next case [org.apache.bcel.util.BCELFactory, org.apache.bcel.util.BCELFactory] At BCELFactory.java:[lines 188-191]Another occurrence at BCELFactory.java:[lines 192-196] SF_SWITCH_FALLTHROUGH. Thanks to Gary Gregory.

Fixed Bugs
-----------

*           When parsing an class with an invalid constant reference, ensure ClassParser.parse() throws ClassFormatException, not NullPointerException. Thanks to OSS-Fuzz.
*           Ensure that references to a constant pool entry with index zero trigger a ClassFormatException, not a NullPointerException. Thanks to OSS-Fuzz.
*           Ensure that references to the unused constant pool entry after a long/double entry triggers a ClassFormatException, not a NullPointerException. Thanks to OSS-Fuzz.
*           Test and coverage of InstructionFactory #190. Thanks to nbauma109.
*           Verifier: test and coverage for SWAP instruction #188. Thanks to nbauma109.
*           Exception parsing Kotlin class with 'fun `method name with () in it`()' #205. Thanks to Jason Copenhaver, Gary Gregory.
*           Fix null pointers in AnnotationEntry #213. Thanks to nbauma109, Gary Gregory.
*           Field not found, search field in both super class and implemented interfaces (5x duplicated code to find field by name and type is refactored to a new method and now supports package-private) #181. Thanks to nbauma109.
* BCEL-366: Use alternative name for broken classes under test #220. Thanks to Slawomir Jaranowski.
* BCEL-367: Fixes java.lang.IndexOutOfBoundsException for ATHROW on empty stack #223. Thanks to Katherine Hough, Gary Gregory.
* BCEL-368: Fixes java.lang.StackOverflowError in Select#toString(boolean) #229. Thanks to Katherine Hough, Gary Gregory.
*           Fix for type.getType(...) use on non-signature type names #221. Thanks to nbauma109, Judit Knoll, Gary Gregory.
*           Fix EmptyVisitorTestCase on Java 21. Thanks to Gary Gregory.

Changes
--------

*           Bump commons-parent from 54 to 65 #189, #198, #222. Thanks to Gary Gregory, Dependabot.
*           Bump jna.version from 5.12.1 to 5.13.0 #203. Thanks to Dependabot.
*           Bump kotlin-stdlib from 1.8.10 to 1.9.21 #217, #219, #227, #231, #235, #245, #247. Thanks to Dependabot.
*           Bump commons-io from 2.11.0 to 2.15.1. Thanks to Dependabot.
*           Bump commons-lang3 from 3.12.0 to 3.14.0. Thanks to Gary Gregory.
*           Bump org.codehaus.mojo:exec-maven-plugin from 3.1.0 to 3.1.1 #246. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.7.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.7.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Maintenance and bug fix release.

New Features
-------------

*           Add org.apache.bcel.classfile.ClassFormatException.ClassFormatException(Throwable). Thanks to Gary Gregory.
*           Add org.apache.bcel.classfile.JavaClass.EXTENSION. Thanks to Gary Gregory.
*           Add org.apache.bcel.classfile.Module.EXTENSION. Thanks to Gary Gregory.
*           Add org.apache.bcel.util.Args. Thanks to Gary Gregory.
*           Add org.apache.bcel.generic.ArrayType.getClassName(). Thanks to Gary Gregory.
*           Add org.apache.bcel.generic.Type.getClassName(). Thanks to Gary Gregory.
*           Add org.apache.bcel.classfile.Utility.packageToPath(String). Thanks to Gary Gregory.
*           org.apache.bcel.classfile.MethodParameter now implements org.apache.bcel.classfile.Node. Thanks to Gary Gregory, Mark Roberts.
*           Add org.apache.bcel.classfile.JavaClass.getSourceFilePath(). Thanks to nbauma109, Gary Gregory.
*           Add org.apache.bcel.generic.PUSH.PUSH(ConstantPoolGen, ArrayType). Thanks to nbauma109, Gary Gregory.

Fixed Bugs
-----------

*           Avoid internal NPE in org.apache.bcel.util.ClassPath.getInputStream(String, String). Thanks to Gary Gregory.
*           InstructionConstants.ALOAD_0 value is wrong (regression from 6.6.0). Thanks to Gary Gregory.
*           InstructionConstants.DCONST_0 value is wrong (regression from 6.6.0). Thanks to Gary Gregory.
*           org.apache.bcel.classfile.Attribute constructors now throw ClassFormatException on invalid name index input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.CodeException constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.ConstantInvokeDynamic.ConstantInvokeDynamic(DataInput). Thanks to Gary Gregory.
*           org.apache.bcel.classfile.ConstantValue constructors now throw ClassFormatException on invalid length input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.Deprecated constructors now throw ClassFormatException on invalid length input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.EnclosingMethod constructors now throw ClassFormatException on invalid length, class index, or method index input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.ExceptionTable constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.InnerClasses constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.LineNumber constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.LocalVariable constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.LocalVariableTable constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.LocalVariableTypeTable constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.ModuleMainClass constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.ModulePackages constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.NestHost constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.NestMembers constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.Signature constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.SourceFile constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.StackMap constructors now throw ClassFormatException on invalid input. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.StackMapEntry.StackMapEntry(DataInput, ConstantPool) reads signed instead of unsigned shorts from its DataInput. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.StackMapType.StackMapType(DataInput, ConstantPool) reads signed instead of unsigned shorts from its DataInput. Thanks to Gary Gregory.
*           org.apache.bcel.classfile.Synthetic constructors now throw ClassFormatException on invalid length input. Thanks to Gary Gregory.
*           org.apache.bcel.util.ClassPath hashCode() and equals() don't match. Thanks to Gary Gregory.
*           Fix code duplication in org.apache.bcel.verifier.structurals.ExceptionHandlers.ExceptionHandlers(MethodGen). Thanks to Mark Roberts, Gary Gregory.
*           Improve test coverage to bcel/generic and UtilityTest #162. Thanks to Sam Ng, Gary Gregory.
*           Code coverage and bug fixes for bcelifier #171. Thanks to nbauma109, Gary Gregory.
*           Code coverage and unit tests on the verifier #166. Thanks to nbauma109, Gary Gregory.
*           Typo in SimpleElementValue error message #161. Thanks to nbauma109, Gary Gregory.
*           org.apache.bcel.classfile.Attribute constructors now throw ClassFormatException on invalid length input. Thanks to Mark Thomas, Gary Gregory.
*           References to constant pool entries that are not of the expected type should throw ClassFormatException, not ClassCastException. Thanks to OSS-Fuzz.
*           When parsing an invalid class, ensure ClassParser.parse() throws ClassFormatException, not IllegalArgumentException. Thanks to OSS-Fuzz.
*           org.apache.bcel.classfile.Code constructors now throw ClassFormatException on invalid input. Thanks to OSS-Fuzz.
*           org.apache.bcel.classfile.StackMapType constructors now throw ClassFormatException on invalid input. Thanks to OSS-Fuzz.
*           When parsing class files, limit arrays to no more than 255 dimensions as per section 4.4.1 of the JVM specification. Thanks to OSS-Fuzz.
*           Tests and coverage for Utility class #175. Thanks to nbauma109.
*           Unit tests and coverage for binary operations #174. Thanks to nbauma109.
*           Fix possible NullPointerException in org.apache.bcel.classfile.StackMap.setStackMap(StackMapEntry[]). Thanks to Gary Gregory.

Changes
--------

*           Bump spotbugs-maven-plugin from 4.7.2.2 to 4.7.3.0 #167. Thanks to Gary Gregory.
*           Bump jmh.version from 1.35 to 1.36 #170. Thanks to Dependabot.
*           Bump pmd from 6.51.0 to 6.52.0. Thanks to Gary Gregory.
*           Bump japicmp from 0.16.0 to 0.17.1. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.6.1
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.6.1!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Maintenance and bug fix release.

Fixed Bugs
-----------

*           Keep ConstantPool.getConstant(int) backward compatible with 6.5.0 #157. Thanks to Kengo TODA, Gary Gregory.

Changes
--------

*           Bump actions/setup-java from 3.5.1 to 3.6.0 #159. Thanks to Dependabot.
*           Bump spotbugs from 4.7.2 to 4.7.3. Thanks to Gary Gregory.
*           Bump pmd from 6.50.0 to 6.51.0. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/proper/commons-bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------


Apache Commons BCEL
Version 6.6.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.6.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.


New Features
-------------

*           Add github/codeql-action.
*           Make Annotations implement Iterable<AnnotationEntry>. Thanks to Gary Gregory.
*           Make BootstrapMethods implement Iterable<BootstrapMethod>. Thanks to Gary Gregory.
*           Make ConstantPool implement Iterable<Constant>. Thanks to Gary Gregory.
*           Make InnerClasses implement Iterable<InnerClass>. Thanks to Gary Gregory.
*           Make LineNumberTable implement Iterable<LineNumber>. Thanks to Gary Gregory.
*           Make LocalVariableTable implement Iterable<LocalVariable>. Thanks to Gary Gregory.
*           Make LocalVariableTypeTable implement Iterable<LocalVariable>. Thanks to Gary Gregory.
*           Make MethodParameters implement Iterable<MethodParameter>. Thanks to Gary Gregory.
*           Make ParameterAnnotations implement Iterable<ParameterAnnotationEntry>. Thanks to Gary Gregory.
*           Add Const.MAJOR_15 Thanks to Gary Gregory.
*           Add Const.MAJOR_16 Thanks to Gary Gregory.
*           Add Const.MAJOR_17 Thanks to Gary Gregory.
*           Add Const.MAJOR_18 Thanks to Gary Gregory.
*           Add Const.MAJOR_19 Thanks to Gary Gregory.
*           Add Const.MINOR_15 Thanks to Gary Gregory.
*           Add Const.MINOR_16 Thanks to Gary Gregory.
*           Add Const.MINOR_17 Thanks to Gary Gregory.
*           Add Const.MINOR_18 Thanks to Gary Gregory.
*           Add Const.MINOR_19 Thanks to Gary Gregory.

Fixed Bugs
-----------

*           Improve test case coverage; fix Utility.encode bug #46. Thanks to Mark Roberts, Gary Gregory.
* BCEL-342: Migrate test suite to JUnit Jupiter #68. Thanks to Allon Murienik, Gary Gregory.
* BCEL-343: JUnit Assertion improvement #69. Thanks to Allon Murienik, Gary Gregory.
*           Minor improvements to comments and toString() methods #71. Thanks to Mark Roberts.
*           Minor Improvements #83. Thanks to Arturo Bernal.
*           Inline variable and avoid unnecessary variable. #94. Thanks to Arturo Bernal.
*           Formalize PerformanceTest #168. Thanks to Mark Roberts, Gary Gregory.
*           Java 8 improvements #95. Thanks to Arturo Bernal.
* BCEL-345: Make documentation wording more inclusive #98. Thanks to Christine Poerschke.
*           Force unsigned short for LineNumber.toString() #118. Thanks to Mark Roberts, Gary Gregory.
*           Fix IllegalStateException when calling toString(ConstantPool) on a Module or ModuleRequires #125. Thanks to Tim Boudreau, Gary Gregory.
*           Generate HTML in UTF-8 instead of whatever happens to be the default platform encoding. Thanks to Gary Gregory.
* BCEL-303: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-307: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-308: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-309: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-311: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-312: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-313: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
* BCEL-337: Several fixes to the verifier #117. Thanks to Mark Roberts, Gary Gregory.
*           Close resources #138. Thanks to Michael Ernst, Gary Gregory.
*           Improve condy (constant dynamic) support #139. Thanks to Alexander Kriegisch, Gary Gregory.
*           Fix typos #140. Thanks to Michael Ernst.
* BCEL-363: Enforce MAX_CP_ENTRIES in ConstantPoolGen and ConstantPool.dump #147. Thanks to Richard Atkins, Gary Gregory.
*           Minor Changes #99. Thanks to Arturo Bernal, Gary Gregory.
*           Simplify boolean expressions #152. Thanks to Arturo Bernal.
*           Use Math.max #151. Thanks to Arturo Bernal.
*           org.apache.bcel.classfile.Signature.translate(String) does not detect EOF correctly. Thanks to Gary Gregory.
*           Fix SpotBugs [ERROR] High: Found reliance on default encoding in new org.apache.bcel.util.BCELifier(JavaClass, OutputStream): new java.io.PrintWriter(OutputStream) [org.apache.bcel.util.BCELifier] At BCELifier.java:[line 169] DM_DEFAULT_ENCODING. Thanks to Gary Gregory.
*           Fix SpotBugs [ERROR] Medium: Unread field: org.apache.bcel.verifier.GraphicalVerifier.packFrame; should this field be static? [org.apache.bcel.verifier.GraphicalVerifier] At GraphicalVerifier.java:[line 43] SS_SHOULD_BE_STATIC. Thanks to Gary Gregory.
*           Fix SpotBugs [ERROR] Medium: new org.apache.bcel.util.ModularRuntimeImage(String) creates a java.net.URLClassLoader classloader, which should be performed within a doPrivileged block [org.apache.bcel.util.ModularRuntimeImage] At ModularRuntimeImage.java:[line 68] DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED. Thanks to Gary Gregory.

Changes
--------

*           Bump actions/cache from 2 to 3.0.10 #88, #93, #110, #119, #149, #154. Thanks to Dependabot, Gary Gregory.
*           Bump actions/checkout from 2.3.1 to 3.1.0 #59, #66, #73, #108, #115, #153. Thanks to Dependabot, Gary Gregory.
*           Bump actions/setup-java from 1.4.0 to 3.5.1 #62, #67. Thanks to Dependabot, Gary Gregory.
*           Bump tests from Apache Commons Lang 3.10 to 3.12.0 Thanks to Gary Gregory.
*           Bump commons-parent from 50 to 54. Thanks to Gary Gregory.
*           Bump biz.aQute.bndlib from 5.1.0 to 6.3.1, #54, #72, #81, #111. Thanks to Dependabot, Gary Gregory.
*           Bump maven-surefire-plugin from 3.0.0-M4 to 3.0.0-M7 #53, #124, #129. Thanks to Dependabot.
*           Bump maven-checkstyle-plugin from 3.1.0 to 3.2.0, #77, #141. Thanks to Gary Gregory, Dependabot.
*           Bump Jacoco from 0.8.5 to 0.8.8. Thanks to Dependabot, Gary Gregory.
*           Bump commons-io from 2.7 to 2.11.0 #65, #96. Thanks to Dependabot, Gary Gregory.
*           Bump exec-maven-plugin from 1.6.0 to 3.1.0 #51, #134. Thanks to Dependabot.
*           Bump commons.japicmp.version from 0.14.3 to 0.16.0. Thanks to Gary Gregory.
*           Bump maven-pmd-plugin from 3.13.0 to 3.19. #74, #103, #116, #130, #142, #144. Thanks to Dependabot.
*           Bump pmd from 6.44.0 to 6.50.0. Thanks to Dependabot, Gary Gregory.
*           Bump junit-jupiter from 5.7.0 to 5.9.1 #78, #90, #101, #112, #135. Thanks to Dependabot, Gary Gregory.
*           Bump jna.version from 5.6.0 to 5.12.1 #84, #102, #109, #120, #131. Thanks to Dependabot.
*           Bump jmh.version from 1.19 to 1.35 #92, #100, #122. Thanks to Dependabot.
*           Bump maven-javadoc-plugin from 3.2.0 to 3.4.1. Thanks to Gary Gregory.
*           Bump maven-bundle-plugin from 5.1.1 to 5.1.8. Thanks to Gary Gregory.
*           Bump taglist-maven-plugin from 2.4 to 3.0.0 #114. Thanks to Dependabot.
*           Bump spotbugs-maven-plugin from 4.5.3.0 to 4.7.2.1 #128, #132, #136, #144, #155. Thanks to Gary Gregory, Dependabot.
*           Bump spotbugs from 4.5.3 to 4.7.1. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons BCEL team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.5.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.5.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Minor feature and bug fix release.

Fixed Bugs
-----------

* BCEL-329: MethodGen duplicates some attributes. Thanks to Gary Gregory, Mark Roberts.

Changes
--------

* BCEL-330: Remove unnecessary references to Constants. Thanks to Mark Roberts.
* BCEL-336: MethodGen throws NullPointerException upon Invalid Class File Missing Constructor Body. Thanks to Tomo Suzuki, Gary Gregory.
*           Improve documentation of Pass3bVerifier (#37). Thanks to Michael Ernst.
*           Replaced deprecated constants in examples (#38). Thanks to Arthur Kupriyanov.
*           Update tests from JNA 5.4.0 to 5.5.0. Thanks to Gary Gregory.
*           Update tests JUnit from 4.12 to 4.13. Thanks to Gary Gregory.
*           Update tests from Apache Commons Lang 3.9 to 3.10. Thanks to Gary Gregory.
*           Update build maven-pmd-plugin 3.12.0 -> 3.13.0. Thanks to Gary Gregory.
*           Update tests maven-surefire-plugin 3.0.0-M3 -> 3.0.0-M4. Thanks to Gary Gregory.
*           Update build japicmp-maven-plugin 0.14.1 -> 0.14.3. Thanks to Gary Gregory.
*           Update build jacoco-maven-plugin 0.8.4 -> 0.8.5. Thanks to Gary Gregory.
*           Update tests from commons-io:commons-io 2.6 to 2.7. Thanks to Gary Gregory.
*           Add support for invokestatic of an InterfaceMethodref #39. Thanks to Mark Roberts.
*           Add attribute name(s) to Code.toString() #40. Thanks to Mark Roberts.
* BCEL-338: org.apache.bcel.generic.InstructionFactory.createInvoke() populates its internal ConstantPoolGen on bad input, then throws exception. Thanks to Gary Gregory.
* BCEL-339: Throw IllegalArgumentException, IllegalStateException, UnsupportedOperationException instead of RuntimeException. Thanks to Gary Gregory.
*           Make some annotation methods public (#45). Thanks to Mark Roberts.
*           Fix ConcurrentModificationException in the maven-bundle-plugin:4.2.1:manifest on Java 15-ea. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcel/changes-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.4.1
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.4.1!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Bug fix release.

Fixed Bugs
-----------

* BCEL-328: java.util.EmptyStackException at org.apache.bcel.classfile.DescendingVisitor.visitModule (DescendingVisitor.java:592). Thanks to Gary Gregory, Mark Roberts.

Changes
--------

*           Update build from Checkstyle Maven Plugin 3.0.0 to 3.1.0. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.4.0
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.4.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Feature and bug fix release.

New Features
-------------

* BCEL-318: Add method org.apache.bcel.classfile.ConstantUtf8.clearCache(). Thanks to Gary Gregory.
* BCEL-320: Add LruCacheClassPathRepository that can scan many JAR files without OutOfMemoryError. Thanks to Tomo Suzuki, Gary Gregory.
* BCEL-322: Add constants to org.apache.bcel.Const for Java 14. Thanks to Gary Gregory.
* BCEL-321: Refactor subclasses of ClassPathRepository for differences in underlying cache. Thanks to Tomo Suzuki.

Fixed Bugs
-----------

* BCEL-316: org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default. Thanks to Gary Gregory.
* BCEL-278: InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11. Thanks to Valery Barysoky.
* BCEL-270: Calling toString(ConstantPool) on InvokeInstruction throws NullPointerException. Thanks to Alexandru-Constantin Bledea.
* BCEL-323: org.apache.bcel.util.BCELifier to set major and minor versions. Thanks to Tomo Suzuki.
* BCEL-326: Add missing Java 9 and Java 11 class file attributes. #33 Thanks to Mark Roberts.
* BCEL-325: ClassDumper crashes on a module-info.class. #33 Thanks to Mark Roberts.
* BCEL-327: Update signature scanning in Utility to support TypeParameters. #32 Thanks to Mark Roberts.

Changes
--------

* BCEL-317: Pluggable cache for ConstantUtf8. Thanks to Tomo Suzuki, Gary Gregory.
* BCEL-299: Fix example src/examples/ClassDumper.java ClassDumper.processID(). Thanks to Gary Gregory, zhangminglei.
*           Update tests from JNA 4.5.0 to 5.3.1. Thanks to Gary Gregory.
*           Update tests from JNA 5.3.1. to 5.4.0. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-bcelchanges-report.html

For complete information on Apache Commons BCEL, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons BCEL website:

https://commons.apache.org/proper/commons-bcel

Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi

Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------


Apache Commons BCEL
Version 6.3.1
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.3.1!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Bug fix release

Fixed Bugs
-----------

* BCEL-267: Race conditions on static fields in BranchHandle and InstructionHandle. Thanks to Stephan Herrmann, Sebb, Gary Gregory, Torsten Curdt.
* BCEL-297: Possible NPE in override implementation of Object.equals (#20) Thanks to Mark Roberts, mingleizhang.
* BCEL-315: NullPointerException at org.apache.bcel.classfile.FieldOrMethod.dump(). Thanks to Gary Gregory.

Changes
--------

* BCEL-298: Add some files to .gitignore (#19) Thanks to mingleizhang.



Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.3
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.3!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.


New Features
-------------

*           Added org.apache.bcel.classfile.Visitor.visitConstantDynamic(ConstantDynamic) Thanks to Mark Thomas.
*           Added org.apache.bcel.classfile.ConstantDynamic Thanks to Mark Thomas.
*           Added fields in org.apache.bcel.Const for Java 9, 10, and 11. Thanks to Mark Thomas.
*           Added fields in org.apache.bcel.Const for Java 12 and 13 based on Java Early Access releases. Thanks to Mark Thomas.

Fixed Bugs
-----------

* BCEL-304: ClassPath.getClassFile() and friends do not work with JDK 9 and higher (PR #22.) Thanks to Gary Gregory, Ed Pavlak.
* BCEL-305: ClassPath.getClassFile() and friends do not work with JRE 9 and higher Thanks to Gary Gregory.

Changes
--------

*           Initial support for Java 11 Thanks to Mark Thomas, Gary Gregory.
*           Update Java requirement from Java 7 to Java 8. Thanks to Gary Gregory.



Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
Version 6.2
RELEASE NOTES


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.2!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Experimental Java 9 Support

Fixed Bugs
-----------

* BCEL-294: Incorrect comment in StackMap.java Thanks to Mark Roberts.
* BCEL-296: Incorrect comment in several classes. Thanks to Mark Roberts.
* BCEL-295: Fix local variable live range length; add test case. Thanks to Mark Roberts.
* BCEL-300: org.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19.
* BCEL-301: org.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 20.


Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team

-----------------------------------------------------------------------------

Apache Commons BCEL
    Version 6.1
  RELEASE NOTES


Introduction

The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.1!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Apache Commons BCEL 6.1 is a bugfix and feature release supporting bringing
experimental support for Java 9.

It requires Java 7 or higher to run.


COMPATIBILITY with 6.1
----------------------

Binary compatible - Yes

Source compatible - Yes, sort of;
 - The org.apache.bcel.classfile.Visitor interface has been enhanced with
 additional methods. If you implemented it directly instead of extending
 the EmptyVisitor class you'll have to implement the new methods.
 - The org.apache.bcel.generic.Visitor interface has been enhanced with an
 additional method. If you implemented it directly instead of extending
 the EmptyVisitor class you'll have to implement the new methods.

Semantic compatible - Yes

For full information about API changes please see the extended Clirr report:


https://commons.apache.org/bcel/clirr-report.html


COMPATIBILITY with Java 9
-------------------------

The MANIFEST.MF now contains an additional entry:

  Automatic-Module-Name: org.apache.bcel

This should make it possible to use Commons BCEL 6.1 as a module in the Java 9
module system. For more information see the corresponding issue and the
referenced mailing list discussions:

https://issues.apache.org/jira/browse/BCEL-293

The build currently on Java 9 fails with test failures related to Locales. We
are still working on this. For more information see:

https://issues.apache.org/jira/browse/BCEL-275


New Features
-------------

* BCEL-293: Add Automatic-Module-Name MANIFEST entry for Java 9 compatibility.
* BCEL-292: Add minimal Java 9 support.

Fixed Bugs
-----------

* BCEL-286: Utility.signatureToString fails if a method has multiple type
            arguments. Thanks to Mark Roberts.
* BCEL-287: IINC does not handle -128 properly. Thanks to Mark Roberts.
* BCEL-283: Support for StackMap should be different from StackMapTable.
            Thanks to Mark Roberts.
* BCEL-289: Crash when parsing constructor of inner classes with parameters
            annotated.
* BCEL-276: LocalVariableTypeTable is not updated.
            Thanks to Sam Yoon, Mark Roberts.
* BCEL-277: Resolving the String representation of a constant throws
            NoSuchElementException in case of CONSTANT_NameAndType constant.
            Thanks to Sam Yoon.


Have fun!
-Apache Commons Team

-----------------------------------------------------------------------------

Release Notes for 6.0


Introduction
------------
The Apache Commons BCEL team is pleased to announce the release of
Apache Commons BCEL 6.0!

The Byte Code Engineering Library (BCEL) is intended to give users a convenient
way to analyze, create, and manipulate compiled .class files. Classes are
represented by objects containing all the symbolic information of the given
class: methods, fields and byte code instructions.

Apache Commons BCEL 6.0 is a major release supporting the new features
introduced in Java 6, 7 and 8.

It requires Java 7 or higher to run.


COMPATIBILITY with 5.2
----------------------

Binary compatible - not strictly compatible
- The constant interface org.apache.bcel.Constants has been deprecated. Classes
 which implemented this interface in 5.2 now use the constants defined in the
 org.apache.bcel.Const class.
- The constant interface org.apache.bcel.generic.InstructionConstants has been
 deprecated. Classes which implemented this interface in 5.2 now use the
 constants defined in the org.apache.bcel.generic.InstructionConsts class.
- Return type of method 'public java.lang.Object getElementAt(int)' in
 org.apache.bcel.verifier.VerifierFactoryListModel has been changed to
 java.lang.String.
- The BCEL classes do no longer implement java.io.Serializable.

Source compatible - Yes, sort of;
 - The org.apache.bcel.classfile.Visitor interface has been enhanced with
 additional methods. If you implemented it directly instead of extending
 the EmptyVisitor class you'll have to implement the new methods.
 - The org.apache.bcel.generic.Visitor interface has been enhanced with an
 additional method. If you implemented it directly instead of extending
 the EmptyVisitor class you'll have to implement the new methods.

Semantic compatible - Yes, except:
 - BCEL 6.0 handles new attributes such as code annotations that could only
 be processed by implementing a custom AttributeReader in the previous
 versions. Code relying on this behavior will have to be adjusted since
 the AttributeReader will no longer be called in these cases.

For full information about API changes please see the extended Clirr report:


https://commons.apache.org/bcel/clirr-report.html

New Features
-------------

* BCEL-272: Add constants for Java 9 class file version 53.

Fixed Bugs
-----------

* BCEL-237: non-empty final arrays should be private as they are mutable.
* BCEL-243: Type.getType() needs to understand TypeVariableSignature(s).
* BCEL-271: FCONST pattern does not include FCONST_2.
* BCEL-264: Add missing Node.accept() implementations (ConstantMethodHandle,
            ConstantMethodType, ParameterAnnotationEntry).
* BCEL-221: BCELifier is not working for Java8Example (incomplete).
* BCEL-195: Addition of hashCode() to generic/Instruction.java breaks Targeters.
            Never make distinct BranchInstructions compare equal.
* BCEL-261: Select constructor allows partially constructed instance to escape.
            Re-ordered code to delay the escape.
* BCEL-259: Minor doc error in BranchInstruction.java.
* BCEL-260: ClassDumper example duplicates field attribute types.
* BCEL-258: No tests to check the output of dump methods.
* BCEL-257: INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL need to define dump()
            methods.
* BCEL-254: Two more methods that would be nice to be public.
* BCEL-245: Type class includes constants that reference subclasses.
* BCEL-253: Pass 3b verifier is too strict.
* BCEL-248: StackMapTable[Entry] should be removed and improvements merged into
            StackMap[Entry].
* BCEL-202: StackMap[Table]Entry.copy() needs to be deep; Improved support for
            StackMaps.
* BCEL-251: Pass3aVerifier visitANEWARRAY() does not allow 255 array dimensions.
* BCEL-249: Check for max Short seems wrong.
* BCEL-208: Need to check for an empty InstructionList.
* BCEL-217: long type instructions are not searched by InstructionFinder using
            regular expression.
* BCEL-239: Interfaces should not be used to define constants.
* BCEL-234: Code must not swallow Throwable.
* BCEL-209: Bug fixes and improvements to InvokeDynamic and BootStrapMethods
            implementation. Thanks to Mark Roberts.
* BCEL-187: Verification error when an invoke references a method defined in
            superclass. Thanks to Jérôme Leroux.
* BCEL-218: Remove ObjectType cache. Thanks to chas.
* BCEL-184: The verifier now checks if methods with a void return type attempt
            to return an object. Thanks to Jérôme Leroux.
* BCEL-207: MethodGen.removeLocalVariable now properly unreference the removed
            variable from the targetters of the instruction handlers delimiting
            the scope of the variable. Thanks to Mark Roberts.
* BCEL-197: Utility.signatureToString() no longer throws a ClassFormatException
            on TypeVariables found in generic signatures. Thanks to Mark Roberts.
* BCEL-194: Removed the 'index' variable from the LocalVariableGen's hash code. Thanks to Mark Roberts.
* BCEL-193: The verifier should not check for run time compatibility of objects
            assigned to arrays. Thanks to Jérôme Leroux.
* BCEL-188: Correct verification of the return value of a method. Thanks to Jérôme Leroux.
* BCEL-186: Performance degradation with the UTF8 cache. getInstance no longer
            uses cache.
* BCEL-181: org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks
            input streams.
* BCEL-28:  Mistake in "Peephole optimizer" example
            at https://commons.apache.org/bcel/manual.html
* BCEL-74:  BCEL cannot be used as java.system.class.loader.
* BCEL-77:  XSLT transforms broken in Turkish Locale.
* BCEL-79:  java.lang.ClassFormatError: LVTT entry for 'local' in class file
            org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT
            entry
* BCEL-81:  ClassParser.parse() throws NullPointerException if class does not
            exist and ClassParser(String) constructor is used.
* BCEL-85:  ArrayOutOfBoundsException in InstructionFinder.
* BCEL-87:  Website: Incorrect URL for source; version 5.2 is not in the bug
            page
* BCEL-88:  bcelified method doesn't pass verification.
* BCEL-89:  return type not verified by JustIce.
* BCEL-94:  @since tag incorrect for Annotation classes in BCEL trunk.
* BCEL-95:  InstructionFactory missing % operator for Float, Double.
* BCEL-96:  Fields in Annotations and AnnotationEntry are inaccessible to
            subclasses
* BCEL-97:  Add support for getResources to ClassPath.
* BCEL-98:  Two source files in repository are empty.
* BCEL-99:  Maven POM file calls in apache regex but code does not use it.
* BCEL-100: ClassParser throws unintelligible Exception.
* BCEL-101: verifier raises an AssertionViolatedException when done against
            Java 5 files with generics/annotations.
* BCEL-102: Verifier fails in pass 2 with "Number of LocalVariableTable
            attributes of Code attribute" on static methods.
* BCEL-107: ParameterAnnotationEntries are read not dumped.
* BCEL-108: RuntimeVisible Annotations duplicated.
* BCEL-112: ARRAYLENGTH incorrectly not StackConsumer.
* BCEL-114: Error in method search() defined in
            org.apache.bcel.util.InstructionFinder
* BCEL-115: Deleting all instructions of a list shows wrong behavior.
* BCEL-120: Make BCEL JAR OSGi compatible.
* BCEL-122: ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile.
* BCEL-124: tableswitch/lookupswitch invalid alignment of 4-byte operands.
* BCEL-125: Incorrect size calculation in InstructionFinder.
* BCEL-130: Class files containing "ParameterAnnotations" are dumped
            incorrectly.
* BCEL-131: Class files containing "StackMapTable" attributes (on method code)
            are dumped incorrectly.
* BCEL-132: org.apache.bcel.classfile.ClassParser: NullPointerException caused
            by fileopen failed.
* BCEL-133: org.apache.bcel.classfile.ClassParser: NullPointerException caused
            by invalid filename.
* BCEL-134: ExecutionVisitor doesn't support Class constant type for LDC and
            LDC_W.
* BCEL-135: BCELifier issue: BCELFactory fails to handle float and long
            constants.
* BCEL-137: "Invalid method signature: TT;" when using MethodGen for a method
            having a generic parameter.
* BCEL-138: FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize()
            output.
* BCEL-140: org.apache.bcel.generic.Instruction.equals(Object) does not follow
            Object.equals(Object) rules.
* BCEL-141: Select instructions should implement StackConsumer instead of
            StackProducer.
* BCEL-143: Fix CPL License issues with EnclosingMethod.java and
            LocalVariableTypeTable.java.
* BCEL-145: Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output.
* BCEL-146: SyntheticRepository.loadClass() fails to close the inputStream.
* BCEL-148: BCELifier produces incorrect code for methods containing loads of
            class literals from constant pool.
* BCEL-151: Code attribute size not updated.
* BCEL-152: Incorrect link for Jasmin assembler language.
* BCEL-153: Examples not present in source or binary downloads.
* BCEL-154: ClassParser.parse() generates NPE if it cannot open the file.
* BCEL-155: InstConstraintVisitor does not handle class constants.
* BCEL-156: Pass3bVerifier crashes on empty methods.
* BCEL-159: LocalVariableGen.getLocalVariable() computes incorrect length.
* BCEL-164: Method does not have a method to access parameter annotations.
* BCEL-167: ClassPath.getResource does not correctly perform URL escaping.
* BCEL-173: ClassParser fails to parse JDK classes in Java 8:
            ClassFormatException: Invalid byte tag in constant pool.
* BCEL-174: Verification of interfaces with default methods fails with Java 8.
* BCEL-177: When reading the number of parameters in a MethodParameters
            structure only read a single byte as per the JVM specification.

Changes
--------

* BCEL-262: InvokeInstruction.getClassName(ConstantPoolGen) should not throw 
            an exception when it detects an array. Thanks to Mark Roberts.
* BCEL-230: Document the Java platform requirement clearly and early.
* BCEL-211: Some additional clone methods should be public.
* BCEL-127: Document that Instruction Factory returns singleton instances.
* BCEL-198: better support for clone/copy methods.
* BCEL-201: modify several toString methods to make output similar to "javap".
* BCEL-205: add javadoc comments to LineNumber.java and LineNumberTable.java.
* BCEL-212: Inconsistent toString() results.
* BCEL-244: Update Java requirement from 5 to 7.
* BCEL-219: Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput)
            public. Thanks to Maxim Degtyarev.
* BCEL-76:  Add parent type processing for ClassPath class.
* BCEL-83:  Add support for getResource and getResourceAsStream to ClassPath.
* BCEL-92:  Properly parse StackMapTable attributes in Java 6 classfiles.
* BCEL-104: Javadoc overhaul.
* BCEL-119: BCEL is unnecessarily slow.
* BCEL-157: Add support for INVOKEDYNAMIC and MethodHandles.
* BCEL-160: Why using unstable sort at MethodGen.getLocalVariables() ?
* BCEL-163: Incorporate patch file from Findbugs.
* BCEL-175: Implement the MethodParameters attribute.

Removed
--------
* BCEL-242: Remove Serializable.
* BCEL-110: Problem with JAXB if the bcel classloader is used; remove the broken
            ClassLoader class.


Have fun!
-Apache Commons Team

Feedback
--------

Open source works best when you give feedback:

    https://commons.apache.org/bcel

Please direct all bug reports to JIRA:

    https://issues.apache.org/jira/browse/BCEL

Or subscribe to the commons-user mailing list

The Apache Commons Team
