[Javalist] Segítség! Java7 compiler BUG???

Peter Verhas peter at verhas.com
2012. Júl. 21., Szo, 17:56:41 CEST


A következő osztályt alkottam:

public class Bug{
    public static Number q(Number in) {
        return in instanceof Long ? 1L : 1.0;
    }
}

Ebből a következős sikerült a Java-nak fordítania:
verhasp:test verhasp$ javac Bug.java 
verhasp:test verhasp$ javap -v Bug.class 
Classfile /Users/verhasp/projects/test/Bug.class
  Last modified 2012.07.21.; size 392 bytes
  MD5 checksum 7a7a2b3ddba08525477330df16f4ca78
  Compiled from "Bug.java"
public class Bug
  SourceFile: "Bug.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#15         //  java/lang/Object."<init>":()V
   #2 = Class              #16            //  java/lang/Long
   #3 = Methodref          #17.#18        //  java/lang/Double.valueOf:(D)Ljava/lang/Double;
   #4 = Class              #19            //  Bug
   #5 = Class              #20            //  java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               q
  #11 = Utf8               (Ljava/lang/Number;)Ljava/lang/Number;
  #12 = Utf8               StackMapTable
  #13 = Utf8               SourceFile
  #14 = Utf8               Bug.java
  #15 = NameAndType        #6:#7          //  "<init>":()V
  #16 = Utf8               java/lang/Long
  #17 = Class              #21            //  java/lang/Double
  #18 = NameAndType        #22:#23        //  valueOf:(D)Ljava/lang/Double;
  #19 = Utf8               Bug
  #20 = Utf8               java/lang/Object
  #21 = Utf8               java/lang/Double
  #22 = Utf8               valueOf
  #23 = Utf8               (D)Ljava/lang/Double;
{
  public Bug();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return        
      LineNumberTable:
        line 1: 0

  public static java.lang.Number q(java.lang.Number);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0       
         1: instanceof    #2                  // class java/lang/Long
         4: ifeq          11
         7: dconst_1      
         8: goto          12
        11: dconst_1      
        12: invokestatic  #3                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
        15: areturn       
      LineNumberTable:
        line 3: 0
      StackMapTable: number_of_entries = 2
           frame_type = 11 /* same */
           frame_type = 64 /* same_locals_1_stack_item */
          stack = [ double ]

}


A biztonság kedvéért command line-ból fordítottam ezzel:

verhasp:test verhasp$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

Ha értő szem megnézi a kódot, akkor láthatja (no meg tapasztalhatja is futtatás közben), hogy ez bizony mindig Double értéket fog visszaadni, akkor is, ha paraméter 'in' Long. Ha megfordítom a feltételt, és persze a feltételes kifejezés két felét is ezzel, illetve ha nem azt vizsgálom, hogy Long-e, hanem azt, hogy Double, akkor is mindig Double értéket akar visszaadni a javap disassembly alapján. Megpróbáltam 1.6.0_33 verziójú Java-val is (nem az összes verziót, annyi türelmem nincs), ott is ugyanaz az eredmény.

Azért mielőtt bugreportot küldenék az ORACLE-nak, megkérdezném a tisztelt társaságot, hogy mit nézek itt nagyon be?

A workaround megvan, mert a

public class Bug{
    public static Number q(Number in) {
        if( in instanceof Long )
        return 1L; else return 1.0;
    }
}

működik rendesen.

--
Verhás Péter
peter at verhas.com
+36(30)9306805
skype: verhas




--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120721/75ea346c/attachment.html>


További információk a(z) Javalist levelezőlistáról