miniboxing-plugin icon indicating copy to clipboard operation
miniboxing-plugin copied to clipboard

VarArgs transformation error

Open VladUreche opened this issue 9 years ago • 0 comments

$ cat tstar.scala 
package tstar

object Test {

  def foo1[T](t: T*) = println(t.toList)
  def bar1[T](t: T) = foo1(t,t,t)

  def foo2[@miniboxed T](t: T*) = println(t.toList)
  def bar2[@miniboxed T](t: T) = foo2(t,t,t)

  def main(args: Array[String]): Unit = {
    bar1(false) // This should print List(false, false, false). It does.
    bar2(false) // This should print List(false, false, false). It doesn't.
  }
}

$ mb-scalac tstar.scala -P:minibox:warn-off

$ mb-scala tstar.Test
List(false, false, false)
List(0, 0, 0)

The underlying problem:

$ mb-scalac tstar.scala -Xprint:erasure

tstar.scala:12: warning: The method tstar.Test.bar1 would benefit from miniboxing type parameter T, since it is instantiated by a primitive type.
    bar1(false) // This should print List(false, false, false). It does.
    ^
[[syntax trees at end of                   erasure]] // tstar.scala
package tstar {
  object Test extends Object {
    def <init>(): tstar.Test.type = {
      Test.super.<init>();
      ()
    };
    def foo1(t: Seq): Unit = scala.this.Predef.println(t.toList());
    def bar1(t: Object): Unit = Test.this.foo1(scala.this.Predef.genericWrapArray(Array[Object]{t, t, t}));
    def foo2(t: Seq): Unit = scala.this.Predef.println(t.toList());
    def foo2$n$D(T$TypeTag: Byte, t: Seq): Unit = scala.this.Predef.println(t.toList());
    def foo2$n$J(T$TypeTag: Byte, t: Seq): Unit = scala.this.Predef.println(t.toList());
    def bar2(t: Object): Unit = Test.this.foo2(scala.this.Predef.genericWrapArray(Array[Object]{t, t, t}));
    def bar2$n$D(T$TypeTag: Byte, t: Double): Unit = Test.this.foo2$n$D(T$TypeTag, scala.this.Predef.genericWrapArray(Array[Double]{t, t, t}));
    def bar2$n$J(T$TypeTag: Byte, t: Long): Unit = Test.this.foo2$n$J(T$TypeTag, scala.this.Predef.genericWrapArray(Array[Long]{t, t, t}));
    def main(args: Array[String]): Unit = {
      Test.this.bar1(scala.Boolean.box(false));
      Test.this.bar2$n$J(1, MiniboxConversions.this.boolean2minibox(false))
    }
  }
}

one warning found

Specifically:

    def bar2$n$D(T$TypeTag: Byte, t: Double): Unit = 
      foo2$n$D(T$TypeTag, Predef.genericWrapArray(Array[Double]{t, t, t}));
    def bar2$n$J(T$TypeTag: Byte, t: Long): Unit = 
      foo2$n$J(T$TypeTag, Predef.genericWrapArray(Array[Long]{t, t, t}));

Which should have been:

    def bar2$n$D(T$TypeTag: Byte, t: Double): Unit = 
      foo2$n$D(T$TypeTag, Predef.genericWrapArray(Array[Object]{minibox2box(t), ...}));
    def bar2$n$J(T$TypeTag: Byte, t: Long): Unit = 
      foo2$n$J(T$TypeTag, Predef.genericWrapArray(Array[Object]{minibox2box(t), ...}));

VladUreche avatar Jun 05 '15 10:06 VladUreche