From 6c1129bdc274eeb822a1924cb22d852ea9cd62de Mon Sep 17 00:00:00 2001 From: Eugene Burmako Date: Fri, 24 Jan 2014 22:46:34 +0300 Subject: unifies method and constructor handling in JavaMirrors This automatically brings performance fixes and correct handling of values class / by-name params into the constructor land. --- .../files/run/reflection-magicsymbols-invoke.check | 2 +- test/files/run/t6411.check | 96 ---------------------- test/files/run/t6411.scala | 81 ------------------ test/files/run/t6411a.check | 96 ++++++++++++++++++++++ test/files/run/t6411a.scala | 81 ++++++++++++++++++ test/files/run/t6411b.check | 1 + test/files/run/t6411b.scala | 12 +++ 7 files changed, 191 insertions(+), 178 deletions(-) delete mode 100644 test/files/run/t6411.check delete mode 100644 test/files/run/t6411.scala create mode 100644 test/files/run/t6411a.check create mode 100644 test/files/run/t6411a.scala create mode 100644 test/files/run/t6411b.check create mode 100644 test/files/run/t6411b.scala (limited to 'test/files') diff --git a/test/files/run/reflection-magicsymbols-invoke.check b/test/files/run/reflection-magicsymbols-invoke.check index 352aefaf25..7f9767f095 100644 --- a/test/files/run/reflection-magicsymbols-invoke.check +++ b/test/files/run/reflection-magicsymbols-invoke.check @@ -28,7 +28,7 @@ it's important to print the list of AnyVal's members if some of them change (possibly, adding and/or removing magic symbols), we must update this test constructor AnyVal: ()AnyVal method getClass: ()Class[_ <: AnyVal] -testing AnyVal.: class java.lang.InstantiationException: null +testing AnyVal.: class scala.ScalaReflectionException: unsupported symbol constructor AnyVal when invoking constructor mirror for scala.AnyVal.(): AnyVal (bound to null) testing AnyVal.getClass: class scala.ScalaReflectionException: expected a member of class Integer, you provided method scala.AnyVal.getClass ============ AnyRef diff --git a/test/files/run/t6411.check b/test/files/run/t6411.check deleted file mode 100644 index 9226146195..0000000000 --- a/test/files/run/t6411.check +++ /dev/null @@ -1,96 +0,0 @@ -meth = method yg_1 -as seen by Scala reflection: def yg_1[T](y: Y[T]): T -as seen by Java reflection: public java.lang.Object a$.yg_1(java.lang.Object) -result = 1 -meth = method yg_1 -as seen by Scala reflection: def yg_1[T](y: Y[T]): T -as seen by Java reflection: public java.lang.Object a$.yg_1(java.lang.Object) -result = 1 -meth = method yi_2 -as seen by Scala reflection: def yi_2(y: Y[Int]): Int -as seen by Java reflection: public int a$.yi_2(java.lang.Integer) -result = 2 -meth = method yi_2 -as seen by Scala reflection: def yi_2(y: Y[Int]): Int -as seen by Java reflection: public int a$.yi_2(java.lang.Integer) -result = class java.lang.IllegalArgumentException: argument type mismatch -meth = method ys_3 -as seen by Scala reflection: def ys_3(y: Y[String]): String -as seen by Java reflection: public java.lang.String a$.ys_3(java.lang.String) -result = class java.lang.IllegalArgumentException: argument type mismatch -meth = method ys_3 -as seen by Scala reflection: def ys_3(y: Y[String]): String -as seen by Java reflection: public java.lang.String a$.ys_3(java.lang.String) -result = 3 -meth = method ya_4 -as seen by Scala reflection: def ya_4(ys: Array[Y[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.ya_4(Y[]) -result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String -meth = method ya_4 -as seen by Scala reflection: def ya_4(ys: Array[Y[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.ya_4(Y[]) -result = List(4) -meth = method yl_5 -as seen by Scala reflection: def yl_5(ys: List[Y[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.yl_5(scala.collection.immutable.List) -result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String -meth = method yl_5 -as seen by Scala reflection: def yl_5(ys: List[Y[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.yl_5(scala.collection.immutable.List) -result = List(5) -meth = method yni_7 -as seen by Scala reflection: def yni_7(y: => Y[Int]): Int -as seen by Java reflection: public int a$.yni_7(scala.Function0) -result = 7 -meth = method yns_8 -as seen by Scala reflection: def yns_8(y: => Y[String]): String -as seen by Java reflection: public java.lang.String a$.yns_8(scala.Function0) -result = 8 -meth = method zg_1 -as seen by Scala reflection: def zg_1[T](z: Z[T]): T -as seen by Java reflection: public java.lang.Object a$.zg_1(Z) -result = 1 -meth = method zg_1 -as seen by Scala reflection: def zg_1[T](z: Z[T]): T -as seen by Java reflection: public java.lang.Object a$.zg_1(Z) -result = 1 -meth = method zi_2 -as seen by Scala reflection: def zi_2(z: Z[Int]): Int -as seen by Java reflection: public int a$.zi_2(Z) -result = 2 -meth = method zi_2 -as seen by Scala reflection: def zi_2(z: Z[Int]): Int -as seen by Java reflection: public int a$.zi_2(Z) -result = class java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer -meth = method zs_3 -as seen by Scala reflection: def zs_3(z: Z[String]): String -as seen by Java reflection: public java.lang.String a$.zs_3(Z) -result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String -meth = method zs_3 -as seen by Scala reflection: def zs_3(z: Z[String]): String -as seen by Java reflection: public java.lang.String a$.zs_3(Z) -result = 3 -meth = method za_4 -as seen by Scala reflection: def za_4(zs: Array[Z[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.za_4(Z[]) -result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String -meth = method za_4 -as seen by Scala reflection: def za_4(zs: Array[Z[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.za_4(Z[]) -result = List(4) -meth = method zl_5 -as seen by Scala reflection: def zl_5(zs: List[Z[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.zl_5(scala.collection.immutable.List) -result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String -meth = method zl_5 -as seen by Scala reflection: def zl_5(zs: List[Z[String]]): List[String] -as seen by Java reflection: public scala.collection.immutable.List a$.zl_5(scala.collection.immutable.List) -result = List(5) -meth = method zni_7 -as seen by Scala reflection: def zni_7(z: => Z[Int]): Int -as seen by Java reflection: public int a$.zni_7(scala.Function0) -result = 7 -meth = method zns_8 -as seen by Scala reflection: def zns_8(z: => Z[String]): String -as seen by Java reflection: public java.lang.String a$.zns_8(scala.Function0) -result = 8 diff --git a/test/files/run/t6411.scala b/test/files/run/t6411.scala deleted file mode 100644 index 3bfeac2890..0000000000 --- a/test/files/run/t6411.scala +++ /dev/null @@ -1,81 +0,0 @@ -import scala.reflect.runtime.universe._ -import scala.reflect.runtime.{currentMirror => cm} -import scala.language.reflectiveCalls - -class Y[T](val i: T) extends AnyVal { - override def toString = s"Y($i)" -} -class Z[T](val i: T) extends AnyRef { - override def toString = s"Z($i)" -} - -object a { - def yg_1[T](y: Y[T]) = y.i - def yi_2(y: Y[Int]) = y.i - def ys_3(y: Y[String]) = y.i - def ya_4(ys: Array[Y[String]]) = ys.toList.map(_.i) - def yl_5(ys: List[Y[String]]) = ys.map(_.i) - def yv_6(ys: Y[String]*) = ys.toList.map(_.i) - def yni_7(y: => Y[Int]) = y.i - def yns_8(y: => Y[String]) = y.i - - def zg_1[T](z: Z[T]) = z.i - def zi_2(z: Z[Int]) = z.i - def zs_3(z: Z[String]) = z.i - def za_4(zs: Array[Z[String]]) = zs.toList.map(_.i) - def zl_5(zs: List[Z[String]]) = zs.map(_.i) - def zv_6(zs: Z[String]*) = zs.toList.map(_.i) - def zni_7(z: => Z[Int]) = z.i - def zns_8(z: => Z[String]) = z.i -} - -object Test extends App { - def test(methName: String, arg: Any) = { - val moduleA = cm.reflect(a) - val msym = moduleA.symbol.typeSignature.declaration(TermName(methName)).asMethod - println(s"meth = $msym") - val mmirror = moduleA.reflectMethod(msym) - val mresult = - try { mmirror(arg) } - catch { - case ex: Exception => - val ex1 = scala.reflect.runtime.ReflectionUtils.unwrapThrowable(ex) - s"${ex1.getClass}: ${ex1.getMessage}" - } - println(s"as seen by Scala reflection: ${msym.asInstanceOf[scala.reflect.internal.Symbols#Symbol].defString}") - println(s"as seen by Java reflection: ${mmirror.asInstanceOf[{val jmeth: java.lang.reflect.Method}].jmeth}") - println(s"result = $mresult") - } - - test("yg_1", new Y(1)) - test("yg_1", new Y("1")) - test("yi_2", new Y(2)) - test("yi_2", new Y("2")) - test("ys_3", new Y(3)) - test("ys_3", new Y("3")) - test("ya_4", Array(new Y(4))) - test("ya_4", Array(new Y("4"))) - test("yl_5", List(new Y(5))) - test("yl_5", List(new Y("5"))) - // FIXME: disabled because of SI-7056 - // test("yv_6", new Y(6)) - // test("yv_6", new Y("6")) - test("yni_7", new Y(7)) - test("yns_8", new Y("8")) - - test("zg_1", new Z(1)) - test("zg_1", new Z("1")) - test("zi_2", new Z(2)) - test("zi_2", new Z("2")) - test("zs_3", new Z(3)) - test("zs_3", new Z("3")) - test("za_4", Array(new Z(4))) - test("za_4", Array(new Z("4"))) - test("zl_5", List(new Z(5))) - test("zl_5", List(new Z("5"))) - // FIXME: disabled because of SI-7056 - // test("zv_6", new Z(6)) - // test("zv_6", new Z("6")) - test("zni_7", new Z(7)) - test("zns_8", new Z("8")) -} \ No newline at end of file diff --git a/test/files/run/t6411a.check b/test/files/run/t6411a.check new file mode 100644 index 0000000000..9226146195 --- /dev/null +++ b/test/files/run/t6411a.check @@ -0,0 +1,96 @@ +meth = method yg_1 +as seen by Scala reflection: def yg_1[T](y: Y[T]): T +as seen by Java reflection: public java.lang.Object a$.yg_1(java.lang.Object) +result = 1 +meth = method yg_1 +as seen by Scala reflection: def yg_1[T](y: Y[T]): T +as seen by Java reflection: public java.lang.Object a$.yg_1(java.lang.Object) +result = 1 +meth = method yi_2 +as seen by Scala reflection: def yi_2(y: Y[Int]): Int +as seen by Java reflection: public int a$.yi_2(java.lang.Integer) +result = 2 +meth = method yi_2 +as seen by Scala reflection: def yi_2(y: Y[Int]): Int +as seen by Java reflection: public int a$.yi_2(java.lang.Integer) +result = class java.lang.IllegalArgumentException: argument type mismatch +meth = method ys_3 +as seen by Scala reflection: def ys_3(y: Y[String]): String +as seen by Java reflection: public java.lang.String a$.ys_3(java.lang.String) +result = class java.lang.IllegalArgumentException: argument type mismatch +meth = method ys_3 +as seen by Scala reflection: def ys_3(y: Y[String]): String +as seen by Java reflection: public java.lang.String a$.ys_3(java.lang.String) +result = 3 +meth = method ya_4 +as seen by Scala reflection: def ya_4(ys: Array[Y[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.ya_4(Y[]) +result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +meth = method ya_4 +as seen by Scala reflection: def ya_4(ys: Array[Y[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.ya_4(Y[]) +result = List(4) +meth = method yl_5 +as seen by Scala reflection: def yl_5(ys: List[Y[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.yl_5(scala.collection.immutable.List) +result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +meth = method yl_5 +as seen by Scala reflection: def yl_5(ys: List[Y[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.yl_5(scala.collection.immutable.List) +result = List(5) +meth = method yni_7 +as seen by Scala reflection: def yni_7(y: => Y[Int]): Int +as seen by Java reflection: public int a$.yni_7(scala.Function0) +result = 7 +meth = method yns_8 +as seen by Scala reflection: def yns_8(y: => Y[String]): String +as seen by Java reflection: public java.lang.String a$.yns_8(scala.Function0) +result = 8 +meth = method zg_1 +as seen by Scala reflection: def zg_1[T](z: Z[T]): T +as seen by Java reflection: public java.lang.Object a$.zg_1(Z) +result = 1 +meth = method zg_1 +as seen by Scala reflection: def zg_1[T](z: Z[T]): T +as seen by Java reflection: public java.lang.Object a$.zg_1(Z) +result = 1 +meth = method zi_2 +as seen by Scala reflection: def zi_2(z: Z[Int]): Int +as seen by Java reflection: public int a$.zi_2(Z) +result = 2 +meth = method zi_2 +as seen by Scala reflection: def zi_2(z: Z[Int]): Int +as seen by Java reflection: public int a$.zi_2(Z) +result = class java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer +meth = method zs_3 +as seen by Scala reflection: def zs_3(z: Z[String]): String +as seen by Java reflection: public java.lang.String a$.zs_3(Z) +result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +meth = method zs_3 +as seen by Scala reflection: def zs_3(z: Z[String]): String +as seen by Java reflection: public java.lang.String a$.zs_3(Z) +result = 3 +meth = method za_4 +as seen by Scala reflection: def za_4(zs: Array[Z[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.za_4(Z[]) +result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +meth = method za_4 +as seen by Scala reflection: def za_4(zs: Array[Z[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.za_4(Z[]) +result = List(4) +meth = method zl_5 +as seen by Scala reflection: def zl_5(zs: List[Z[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.zl_5(scala.collection.immutable.List) +result = class java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +meth = method zl_5 +as seen by Scala reflection: def zl_5(zs: List[Z[String]]): List[String] +as seen by Java reflection: public scala.collection.immutable.List a$.zl_5(scala.collection.immutable.List) +result = List(5) +meth = method zni_7 +as seen by Scala reflection: def zni_7(z: => Z[Int]): Int +as seen by Java reflection: public int a$.zni_7(scala.Function0) +result = 7 +meth = method zns_8 +as seen by Scala reflection: def zns_8(z: => Z[String]): String +as seen by Java reflection: public java.lang.String a$.zns_8(scala.Function0) +result = 8 diff --git a/test/files/run/t6411a.scala b/test/files/run/t6411a.scala new file mode 100644 index 0000000000..3bfeac2890 --- /dev/null +++ b/test/files/run/t6411a.scala @@ -0,0 +1,81 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{currentMirror => cm} +import scala.language.reflectiveCalls + +class Y[T](val i: T) extends AnyVal { + override def toString = s"Y($i)" +} +class Z[T](val i: T) extends AnyRef { + override def toString = s"Z($i)" +} + +object a { + def yg_1[T](y: Y[T]) = y.i + def yi_2(y: Y[Int]) = y.i + def ys_3(y: Y[String]) = y.i + def ya_4(ys: Array[Y[String]]) = ys.toList.map(_.i) + def yl_5(ys: List[Y[String]]) = ys.map(_.i) + def yv_6(ys: Y[String]*) = ys.toList.map(_.i) + def yni_7(y: => Y[Int]) = y.i + def yns_8(y: => Y[String]) = y.i + + def zg_1[T](z: Z[T]) = z.i + def zi_2(z: Z[Int]) = z.i + def zs_3(z: Z[String]) = z.i + def za_4(zs: Array[Z[String]]) = zs.toList.map(_.i) + def zl_5(zs: List[Z[String]]) = zs.map(_.i) + def zv_6(zs: Z[String]*) = zs.toList.map(_.i) + def zni_7(z: => Z[Int]) = z.i + def zns_8(z: => Z[String]) = z.i +} + +object Test extends App { + def test(methName: String, arg: Any) = { + val moduleA = cm.reflect(a) + val msym = moduleA.symbol.typeSignature.declaration(TermName(methName)).asMethod + println(s"meth = $msym") + val mmirror = moduleA.reflectMethod(msym) + val mresult = + try { mmirror(arg) } + catch { + case ex: Exception => + val ex1 = scala.reflect.runtime.ReflectionUtils.unwrapThrowable(ex) + s"${ex1.getClass}: ${ex1.getMessage}" + } + println(s"as seen by Scala reflection: ${msym.asInstanceOf[scala.reflect.internal.Symbols#Symbol].defString}") + println(s"as seen by Java reflection: ${mmirror.asInstanceOf[{val jmeth: java.lang.reflect.Method}].jmeth}") + println(s"result = $mresult") + } + + test("yg_1", new Y(1)) + test("yg_1", new Y("1")) + test("yi_2", new Y(2)) + test("yi_2", new Y("2")) + test("ys_3", new Y(3)) + test("ys_3", new Y("3")) + test("ya_4", Array(new Y(4))) + test("ya_4", Array(new Y("4"))) + test("yl_5", List(new Y(5))) + test("yl_5", List(new Y("5"))) + // FIXME: disabled because of SI-7056 + // test("yv_6", new Y(6)) + // test("yv_6", new Y("6")) + test("yni_7", new Y(7)) + test("yns_8", new Y("8")) + + test("zg_1", new Z(1)) + test("zg_1", new Z("1")) + test("zi_2", new Z(2)) + test("zi_2", new Z("2")) + test("zs_3", new Z(3)) + test("zs_3", new Z("3")) + test("za_4", Array(new Z(4))) + test("za_4", Array(new Z("4"))) + test("zl_5", List(new Z(5))) + test("zl_5", List(new Z("5"))) + // FIXME: disabled because of SI-7056 + // test("zv_6", new Z(6)) + // test("zv_6", new Z("6")) + test("zni_7", new Z(7)) + test("zns_8", new Z("8")) +} \ No newline at end of file diff --git a/test/files/run/t6411b.check b/test/files/run/t6411b.check new file mode 100644 index 0000000000..e20bed6d8d --- /dev/null +++ b/test/files/run/t6411b.check @@ -0,0 +1 @@ +Bar(Foo(3)) diff --git a/test/files/run/t6411b.scala b/test/files/run/t6411b.scala new file mode 100644 index 0000000000..af30108826 --- /dev/null +++ b/test/files/run/t6411b.scala @@ -0,0 +1,12 @@ +import scala.reflect.runtime.universe._ + +case class Foo(n: Int) extends AnyVal +case class Bar(foo: Foo) + +object Test extends App { + val mirror = runtimeMirror(getClass.getClassLoader) + val cm = mirror.reflectClass(typeOf[Bar].typeSymbol.asClass) + val ctor = typeOf[Bar].declaration(nme.CONSTRUCTOR).asMethod + val ctorm = cm.reflectConstructor(ctor) + println(ctorm(Foo(3))) +} \ No newline at end of file -- cgit v1.2.3