[Scala 2.11.1] Multiple `isDefinedAt` generated by compiler when using tagged types

42 views
Skip to first unread message

amsayk

unread,
Jul 9, 2014, 8:54:13 PM7/9/14
to scala-l...@googlegroups.com

test.scala
-------------

object main {

  type Tagged[T] = { type Tag = T }

  type @@[+T, Tag] = T with Tagged[Tag]

  def d() : PartialFunction[Int @@ Float, Any] = {case _ =>}

  def main(args: Array[String]):Unit = {

    d()
  }
}

scala> :load test.scala
Loading test.scala...
defined object main
scala> main.main(Array())
java.lang.ClassFormatError: Duplicate method name&signature in class file main$$anonfun$d$1
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
  at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:87)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  at main$.d(<console>:13)
  at main$.main(<console>:17)
  ... 32 elided

scala> main.main(Array())
java.lang.ClassFormatError: Duplicate method name&signature in class file main$$anonfun$d$1
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
  at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:87)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  at main$.d(<console>:13)
  at main$.main(<console>:17)
  ... 32 elided

scala> :javap main$$anonfun$d$1
  Size 1361 bytes
  MD5 checksum c7a82ba8510bdc92cbce7467751a7abb
  Compiled from "test.scala"
public final class main$$anonfun$d$1 extends scala.runtime.AbstractPartialFunction<java.lang.Object, java.lang.Object> implements scala.Serializable
  Signature: #3                           // Lscala/runtime/AbstractPartialFunction<Ljava/lang/Object;Ljava/lang/Object;>;Lscala/Serializable;
  SourceFile: "test.scala"
  EnclosingMethod: #10.#13                // main$.d
  InnerClasses:
       public static final #2; //class main$$anonfun$d$1
Error: unknown attribute
    Scala: length = 0x0
     
  minor version: 0
  major version: 50
  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
Constant pool:
   #1 = Utf8               main$$anonfun$d$1
   #2 = Class              #1             //  main$$anonfun$d$1
   #3 = Utf8               Lscala/runtime/AbstractPartialFunction<Ljava/lang/Object;Ljava/lang/Object;>;Lscala/Serializable;
   #4 = Utf8               scala/runtime/AbstractPartialFunction
   #5 = Class              #4             //  scala/runtime/AbstractPartialFunction
   #6 = Utf8               scala/Serializable
   #7 = Class              #6             //  scala/Serializable
   #8 = Utf8               test.scala
   #9 = Utf8               main$
  #10 = Class              #9             //  main$
  #11 = Utf8               d
  #12 = Utf8               ()Lscala/PartialFunction;
  #13 = NameAndType        #11:#12        //  d:()Lscala/PartialFunction;
  #14 = Utf8               applyOrElse
  #15 = Utf8               (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object;
  #16 = Utf8               scala/runtime/BoxesRunTime
  #17 = Class              #16            //  scala/runtime/BoxesRunTime
  #18 = Utf8               unboxToInt
  #19 = Utf8               (Ljava/lang/Object;)I
  #20 = NameAndType        #18:#19        //  unboxToInt:(Ljava/lang/Object;)I
  #21 = Methodref          #17.#20        //  scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
  #22 = Utf8               scala/runtime/BoxedUnit
  #23 = Class              #22            //  scala/runtime/BoxedUnit
  #24 = Utf8               UNIT
  #25 = Utf8               Lscala/runtime/BoxedUnit;
  #26 = NameAndType        #24:#25        //  UNIT:Lscala/runtime/BoxedUnit;
  #27 = Fieldref           #23.#26        //  scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
  #28 = Utf8               this
  #29 = Utf8               Lmain$$anonfun$d$1;
  #30 = Utf8               x1
  #31 = Utf8               Ljava/lang/Object;
  #32 = Utf8               default
  #33 = Utf8               Lscala/Function1;
  #34 = Utf8               isDefinedAt
  #35 = Utf8               (I)Z
  #36 = Utf8               I
  #37 = Utf8               (Ljava/lang/Object;)Z
  #38 = NameAndType        #34:#35        //  isDefinedAt:(I)Z
  #39 = Methodref          #2.#38         //  main$$anonfun$d$1.isDefinedAt:(I)Z
  #40 = Utf8               x
  #41 = Utf8               (ILscala/Function1;)Ljava/lang/Object;
  #42 = NameAndType        #14:#41        //  applyOrElse:(ILscala/Function1;)Ljava/lang/Object;
  #43 = Methodref          #2.#42         //  main$$anonfun$d$1.applyOrElse:(ILscala/Function1;)Ljava/lang/Object;
  #44 = Utf8               <init>
  #45 = Utf8               ()V
  #46 = NameAndType        #44:#45        //  "<init>":()V
  #47 = Methodref          #5.#46         //  scala/runtime/AbstractPartialFunction."<init>":()V
  #48 = Utf8               Code
  #49 = Utf8               LocalVariableTable
  #50 = Utf8               LineNumberTable
  #51 = Utf8               Signature
  #52 = Utf8               <A1:Ljava/lang/Object;B1:Ljava/lang/Object;>(TA1;Lscala/Function1<TA1;TB1;>;)TB1;
  #53 = Utf8               SourceFile
  #54 = Utf8               EnclosingMethod
  #55 = Utf8               InnerClasses
  #56 = Utf8               Scala
{
  public final <A1 extends java.lang.Object, B1 extends java.lang.Object> B1 applyOrElse(A1, scala.Function1<A1, B1>);
    descriptor: (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object;
    flags: ACC_PUBLIC, ACC_FINAL
    Code:
      stack=1, locals=5, args_size=3
         0: aload_1       
         1: invokestatic  #21                 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
         4: istore_3      
         5: getstatic     #27                 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
         8: astore        4
        10: aload         4
        12: areturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      13     0  this   Lmain$$anonfun$d$1;
            0      13     1    x1   Ljava/lang/Object;
            0      13     2 default   Lscala/Function1;
      LineNumberTable:
        line 8: 0
    Signature: #52                          // <A1:Ljava/lang/Object;B1:Ljava/lang/Object;>(TA1;Lscala/Function1<TA1;TB1;>;)TB1;

  public final boolean isDefinedAt(int);
    descriptor: (I)Z
    flags: ACC_PUBLIC, ACC_FINAL
    Code:
      stack=1, locals=4, args_size=2
         0: iload_1       
         1: istore_2      
         2: iconst_1      
         3: istore_3      
         4: iload_3       
         5: ireturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lmain$$anonfun$d$1;
            0       6     1    x1   I
      LineNumberTable:
        line 8: 0

  public final boolean isDefinedAt(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
    flags: ACC_PUBLIC, ACC_FINAL, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0       
         1: aload_1       
         2: invokestatic  #21                 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
         5: invokevirtual #39                 // Method isDefinedAt:(I)Z
         8: ireturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  this   Lmain$$anonfun$d$1;
            0       9     1     x   Ljava/lang/Object;
      LineNumberTable:
        line 8: 0

  public final java.lang.Object applyOrElse(java.lang.Object, scala.Function1);
    descriptor: (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object;
    flags: ACC_PUBLIC, ACC_FINAL, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=3, locals=3, args_size=3
         0: aload_0       
         1: aload_1       
         2: invokestatic  #21                 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
         5: aload_2       
         6: invokevirtual #43                 // Method applyOrElse:(ILscala/Function1;)Ljava/lang/Object;
         9: areturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lmain$$anonfun$d$1;
            0      10     1     x   Ljava/lang/Object;
            0      10     2 default   Lscala/Function1;
      LineNumberTable:
        line 8: 0

  public main$$anonfun$d$1();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #47                 // Method scala/runtime/AbstractPartialFunction."<init>":()V
         4: return        
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lmain$$anonfun$d$1;
      LineNumberTable:
        line 8: 0
}

Is this expected behavior; Any workarounds

Simon Ochsenreither

unread,
Jul 9, 2014, 9:21:17 PM7/9/14
to scala-l...@googlegroups.com
It seems like applyOrElse is causing the issue, not isDefinedAt, but this surely isn't supposed to happen.
Reply all
Reply to author
Forward
0 new messages