summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2014-06-04 08:37:28 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2014-06-04 08:37:28 +0200
commit56f9140d4e3c8f697251897f30e2af677ddebf69 (patch)
tree9d30b2639e2b5597a46cf77f9aff372ba9dc6eed /src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
parentb24e7573a17332606d9f9da49a397e02abec1b63 (diff)
downloadscala-56f9140d4e3c8f697251897f30e2af677ddebf69.tar.gz
scala-56f9140d4e3c8f697251897f30e2af677ddebf69.tar.bz2
scala-56f9140d4e3c8f697251897f30e2af677ddebf69.zip
Fix emitting Array(1).clone() in GenBCode
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala7
1 files changed, 6 insertions, 1 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 {