[ 
https://issues.apache.org/jira/browse/BCEL-323?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tomo Suzuki updated BCEL-323:
-----------------------------
    Description: 
fdh1. Problem

With OpenJDK 13 EA, BCELifer does not give "default" modifier for an 
[interface's default 
method|https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html].

[https://travis-ci.org/apache/commons-bcel/jobs/556441835]
{code:java}
[INFO] 
[INFO] Results:
[INFO] 
[ERROR] Failures: 
[ERROR]   BCELifierTestCase.testJavapCompare:90->testClassOnPath:80 
expected:<...a8Example {
 public [default ]void hello();
 Code:...> but was:<...a8Example {
 public []void hello();
 Code:...>
[INFO] 
[ERROR] Tests run: 130, Failures: 1, Errors: 0, Skipped: 1{code}
 

I'm checking why it fails.

Memo for myself:
{code:java}
export JAVA_HOME=${HOME}/local/jdk-13
export PATH=${JAVA_HOME}/bin:$PATH{code}
h1. Difference causing Test Failure

In OpenJDK 13, the default parameter for the interface disappears after 
BCELifier creates the class file.

!screenshot-1.png! 
  
{code:java}
$ java -version
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+28)
OpenJDK 64-Bit Server VM (build 13-ea+28, mixed mode, sharing){code}
h2. What does BCELifierTestCase do?

The test compares two output of javap command:
 * javap "target/test-classes/Java8Example.class" (which is copied from 
./src/test/resources/Java8Example.class in git)
 * javap another Java8Example.class which is generated by BCELifer.
 ** Actually the class file is not directly created by BCELifer.
 *** BCELifer writes Java8ExampleCreator.java
 *** The test runs "javac" to compile Java8ExampleCreator.
 *** The test runs "java" to run Java8ExampleCreator, which in turn generates 
Java8Example.class

JDK 13's javap command adds "default" for the first Java8Example.class but not 
on the second one.

h2. Question to Answer

Q. In theory, because Java8Example.class is generated by BCEL, not JDK, the 
output should not change. Which part of BCEL relies on JDK?

A. This question is irrelevant, because the output class files are all the same 
(see below).

Q. Is there difference between Java8ExampleCreator.java files from JDK 8 and 
JDK 13?
A. They are the same.

Q. How to see the difference between Java8Example.class from JDK 8 and JDK 13?

* javap (screenshot shown above)

 !screenshot-2.png! 

* binary diff editor?

Q. What about JDK 11?

A. JDK 11's javap does not show "default" for both Java8Example.class files. 
JDK11's generated Java8Example.class has 1 attributes. The resulting 
Java8Example.class files are all the same across JDKs:

{code}
$ md5sum /tmp/target-jdk*/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk11/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk13/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk8/Java8Example.class{code}

So it's the matter of javap command showing "default" or not.

Q. JDK 13's javap outputs "default" under certain condition. What is the 
condition?






  was:
fdh1. Problem

With OpenJDK 13 EA, BCELifer does not give "default" modifier for an 
[interface's default 
method|https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html].

[https://travis-ci.org/apache/commons-bcel/jobs/556441835]
{code:java}
[INFO] 
[INFO] Results:
[INFO] 
[ERROR] Failures: 
[ERROR]   BCELifierTestCase.testJavapCompare:90->testClassOnPath:80 
expected:<...a8Example {
 public [default ]void hello();
 Code:...> but was:<...a8Example {
 public []void hello();
 Code:...>
[INFO] 
[ERROR] Tests run: 130, Failures: 1, Errors: 0, Skipped: 1{code}
 

I'm checking why it fails.

Memo for myself:
{code:java}
export JAVA_HOME=${HOME}/local/jdk-13
export PATH=${JAVA_HOME}/bin:$PATH{code}
h1. Difference causing Test Failure

In OpenJDK 13, the default parameter for the interface disappears after 
BCELifier creates the class file.

!screenshot-1.png! 
  
{code:java}
$ java -version
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+28)
OpenJDK 64-Bit Server VM (build 13-ea+28, mixed mode, sharing){code}
h2. What does BCELifierTestCase do?

The test compares two output of javap command:
 * javap "target/test-classes/Java8Example.class" (which is copied from 
./src/test/resources/Java8Example.class in git)
 * javap another Java8Example.class which is generated by BCELifer.
 ** Actually the class file is not directly created by BCELifer.
 *** BCELifer writes Java8ExampleCreator.java
 *** The test runs "javac" to compile Java8ExampleCreator.
 *** The test runs "java" to run Java8ExampleCreator, which in turn generates 
Java8Example.class

JDK 13's javap command adds "default" for the first Java8Example.class but not 
on the second one.

h2. Question to Answer

Q. In theory, because Java8Example.class is generated by BCEL, not JDK, the 
output should not change. Which part of BCEL relies on JDK?

Q. Is there difference between Java8ExampleCreator.java files from JDK 8 and 
JDK 13?
A. They are the same.

Q. How to see the difference between Java8Example.class from JDK 8 and JDK 13?

* javap (screenshot shown above)

 !screenshot-2.png! 

* binary diff editor?

Q. What about JDK 11?

A. JDK 11's javap does not show "default" for both Java8Example.class files. 
JDK11's generated Java8Example.class has 1 attributes. The resulting 
Java8Example.class files are all the same across JDKs:

{code}
$ md5sum /tmp/target-jdk*/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk11/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk13/Java8Example.class
f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk8/Java8Example.class{code}

So it's the matter of javap command showing "default" or not.

Q. Which part of BCEL/BCELifer is responsible to write "default" into class 
files.

A. This question is irrelevant, because the output class files are all the same.







> JDK 13 build failing in master: BCELifierTestCase.testJavapCompare
> ------------------------------------------------------------------
>
>                 Key: BCEL-323
>                 URL: https://issues.apache.org/jira/browse/BCEL-323
>             Project: Commons BCEL
>          Issue Type: Improvement
>            Reporter: Tomo Suzuki
>            Priority: Minor
>         Attachments: screenshot-1.png, screenshot-2.png
>
>
> fdh1. Problem
> With OpenJDK 13 EA, BCELifer does not give "default" modifier for an 
> [interface's default 
> method|https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html].
> [https://travis-ci.org/apache/commons-bcel/jobs/556441835]
> {code:java}
> [INFO] 
> [INFO] Results:
> [INFO] 
> [ERROR] Failures: 
> [ERROR]   BCELifierTestCase.testJavapCompare:90->testClassOnPath:80 
> expected:<...a8Example {
>  public [default ]void hello();
>  Code:...> but was:<...a8Example {
>  public []void hello();
>  Code:...>
> [INFO] 
> [ERROR] Tests run: 130, Failures: 1, Errors: 0, Skipped: 1{code}
>  
> I'm checking why it fails.
> Memo for myself:
> {code:java}
> export JAVA_HOME=${HOME}/local/jdk-13
> export PATH=${JAVA_HOME}/bin:$PATH{code}
> h1. Difference causing Test Failure
> In OpenJDK 13, the default parameter for the interface disappears after 
> BCELifier creates the class file.
> !screenshot-1.png! 
>   
> {code:java}
> $ java -version
> openjdk version "13-ea" 2019-09-17
> OpenJDK Runtime Environment (build 13-ea+28)
> OpenJDK 64-Bit Server VM (build 13-ea+28, mixed mode, sharing){code}
> h2. What does BCELifierTestCase do?
> The test compares two output of javap command:
>  * javap "target/test-classes/Java8Example.class" (which is copied from 
> ./src/test/resources/Java8Example.class in git)
>  * javap another Java8Example.class which is generated by BCELifer.
>  ** Actually the class file is not directly created by BCELifer.
>  *** BCELifer writes Java8ExampleCreator.java
>  *** The test runs "javac" to compile Java8ExampleCreator.
>  *** The test runs "java" to run Java8ExampleCreator, which in turn generates 
> Java8Example.class
> JDK 13's javap command adds "default" for the first Java8Example.class but 
> not on the second one.
> h2. Question to Answer
> Q. In theory, because Java8Example.class is generated by BCEL, not JDK, the 
> output should not change. Which part of BCEL relies on JDK?
> A. This question is irrelevant, because the output class files are all the 
> same (see below).
> Q. Is there difference between Java8ExampleCreator.java files from JDK 8 and 
> JDK 13?
> A. They are the same.
> Q. How to see the difference between Java8Example.class from JDK 8 and JDK 13?
> * javap (screenshot shown above)
>  !screenshot-2.png! 
> * binary diff editor?
> Q. What about JDK 11?
> A. JDK 11's javap does not show "default" for both Java8Example.class files. 
> JDK11's generated Java8Example.class has 1 attributes. The resulting 
> Java8Example.class files are all the same across JDKs:
> {code}
> $ md5sum /tmp/target-jdk*/Java8Example.class
> f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk11/Java8Example.class
> f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk13/Java8Example.class
> f4c51ee3d4864cb226e79cfca8dbe6da  /tmp/target-jdk8/Java8Example.class{code}
> So it's the matter of javap command showing "default" or not.
> Q. JDK 13's javap outputs "default" under certain condition. What is the 
> condition?



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to