Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8000518

Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P2
    • Resolution: Fixed
    • Affects Version/s: 8
    • Fix Version/s: 8
    • Component/s: tools
    • Labels:
      None
    • Subcomponent:
    • Resolved In Build:
      b71
    • CPU:
      generic
    • OS:
      generic
    • Verification:
      Verified

      Backports

        Description

        but >>only<< if StringValueExp.java is put on the same command line.
        If StringValueExp.java is left out from the comman dline, the generated class file for BinaryOpValueExp.java is fine.

        I found this bug while comparing the build results between the old build and the new build in the build-infra project.

        How to reproduce, first build a full jdk using the old buildsystem, then:
        cd jdk/make/javax/management
        <boot-jdk>/bin/java -Xbootclasspath/p:../../../../build/linux-amd64/langtools/dist/bootstrap/lib/javac.jar -jar ../../../../build/linux-amd64/langtools/dist/bootstrap/lib/javac.jar -Xlint:-path -source 7 -target 7 -encoding ascii -Xbootclasspath:../../../../build/linux-amd64/classes -sourcepath ../../../src/closed/solaris/classes:../../../src/closed/share/classes:../../../../build/linux-amd64/gensrc:../../../src/solaris/classes:../../../src/share/classes -d /tmp/classes ../../../src/share/classes/javax/management/BinaryOpValueExp.java

        A correct BinaryOpValueExp.class can be found below /tmp/classes

        <boot-jdk>/bin/java -Xbootclasspath/p:../../../../build/linux-amd64/langtools/dist/bootstrap/lib/javac.jar -jar ../../../../build/linux-amd64/langtools/dist/bootstrap/lib/javac.jar -Xlint:-path -source 7 -target 7 -encoding ascii -Xbootclasspath:../../../../build/linux-amd64/classes -sourcepath ../../../src/closed/solaris/classes:../../../src/closed/share/classes:../../../../build/linux-amd64/gensrc:../../../src/solaris/classes:../../../src/share/classes -d /tmp/classes2 ../../../src/share/classes/javax/management/BinaryOpValueExp.java ../../../src/share/classes/javax/management/StringValueExp.java

        A BinaryOpValueExp.class with duplicate "<init>":(Ljava/lang/String;)V is created below /tmp/classes2

        Javaps of the good and bad BinaryOpValueExp.class are attached.

        The commit in langtools that causes this behaviour is (commenting it out fixes the problem):

        7181320: javac NullPointerException for switch labels with cast to String expressions
        Reviewed-by: mcimadamore

        --- a/src/share/classes/com/sun/tools/javac/code/Types.java Fri Aug 17
        17:30:03 2012 -0700
        +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Mon Aug 20
        21:24:10 2012 +0530
        @@ -1589,9 +1589,16 @@ public class Types {
               * type parameters in t are deleted.
               */
              public Type erasure(Type t) {
        - return erasure(t, false);
        + return eraseNotNeeded(t)? t : erasure(t, false);
              }
              //where
        + private boolean eraseNotNeeded(Type t) {
        + // We don't want to erase primitive types and String type as that
        + // operation is idempotent. Also, erasing these could result in loss
        + // of information such as constant values attached to such types.
        + return (t.tag<= lastBaseTag) || (syms.stringType.tsym == t.tsym);
        + }
        +

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  vromero Vicente Arturo Romero Zaldivar
                  Reporter:
                  erikj Erik Joelsson
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  4 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: