diff options
author | Lukas Rytz <lukas.rytz@typesafe.com> | 2014-06-04 13:15:07 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@typesafe.com> | 2014-06-04 13:15:07 +0200 |
commit | e10ea0ca1d8dcf97e7bfcfed5b3a0a283381525e (patch) | |
tree | b526ce4f5a33958e8b552192fcb7cf8e95471ad9 /src | |
parent | a7ed0eba96d2032a8a23f2700eacfafbc250e7a0 (diff) | |
parent | 56f9140d4e3c8f697251897f30e2af677ddebf69 (diff) | |
download | scala-e10ea0ca1d8dcf97e7bfcfed5b3a0a283381525e.tar.gz scala-e10ea0ca1d8dcf97e7bfcfed5b3a0a283381525e.tar.bz2 scala-e10ea0ca1d8dcf97e7bfcfed5b3a0a283381525e.zip |
Merge pull request #3811 from lrytz/bcode/arrayClone
Fix emitting Array(1).clone() in GenBCode
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala | 7 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala | 3 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala index 1285ca6862..bffa4bc51d 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala @@ -686,7 +686,12 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder { case _ => } if ((targetTypeKind != null) && (sym == definitions.Array_clone) && invokeStyle.isDynamic) { - val target: String = targetTypeKind.asClassBType.internalName + // An invokevirtual points to a CONSTANT_Methodref_info which in turn points to a + // CONSTANT_Class_info of the receiver type. + // The JVMS is not explicit about this, but that receiver type may be an array type + // descriptor (instead of a class internal name): + // invokevirtual #2; //Method "[I".clone:()Ljava/lang/Object + val target: String = targetTypeKind.asRefBType.classOrArrayType bc.invokevirtual(target, "clone", "()Ljava/lang/Object;") } else { diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala index 9aedc7f8b4..5b0fa6f7a8 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala @@ -217,7 +217,8 @@ abstract class BTypes[G <: Global](val __global_dont_use: G) { sealed trait RefBType extends BType { /** * The class or array type of this reference type. Used for ANEWARRAY, MULTIANEWARRAY, - * INSTANCEOF and CHECKCAST instructions. + * INSTANCEOF and CHECKCAST instructions. Also used for emitting invokevirtual calls to + * (a: Array[T]).clone() for any T, see genApply. * * In contrast to the descriptor, this string does not contain the surrounding 'L' and ';' for * class types, for example "java/lang/String". |