summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2014-06-04 13:15:07 +0200
committerLukas Rytz <lukas.rytz@typesafe.com>2014-06-04 13:15:07 +0200
commite10ea0ca1d8dcf97e7bfcfed5b3a0a283381525e (patch)
treeb526ce4f5a33958e8b552192fcb7cf8e95471ad9 /src
parenta7ed0eba96d2032a8a23f2700eacfafbc250e7a0 (diff)
parent56f9140d4e3c8f697251897f30e2af677ddebf69 (diff)
downloadscala-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.scala7
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala3
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".