Skip to content

Commit e60a20d

Browse files
committed
Get rid of all new***Array methods expect one.
This one is able to encode creation of array of any type and any dimension. Note, it does not handle value classes.
1 parent 4136421 commit e60a20d

File tree

3 files changed

+22
-53
lines changed

3 files changed

+22
-53
lines changed

src/dotty/runtime/Arrays.scala

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -26,42 +26,6 @@ object Arrays {
2626

2727
/** Create an array of a reference type T.
2828
*/
29-
def newRefArray[T](componentType: Class[T])(length: Int): Array[T] =
30-
jlr.Array.newInstance(componentType, length).asInstanceOf[Array[T]]
31-
32-
/** Create a Byte[] array */
33-
def newByteArray(length: Int): Array[Byte] =
34-
jlr.Array.newInstance(classOf[Byte], length).asInstanceOf[Array[Byte]]
35-
36-
/** Create a Short[] array */
37-
def newShortArray(length: Int): Array[Short] =
38-
jlr.Array.newInstance(classOf[Short], length).asInstanceOf[Array[Short]]
39-
40-
/** Create a Char[] array */
41-
def newCharArray(length: Int): Array[Char] =
42-
jlr.Array.newInstance(classOf[Char], length).asInstanceOf[Array[Char]]
43-
44-
/** Create an Int[] array */
45-
def newIntArray(length: Int): Array[Int] =
46-
jlr.Array.newInstance(classOf[Int], length).asInstanceOf[Array[Int]]
47-
48-
/** Create a Long[] array */
49-
def newLongArray(length: Int): Array[Long] =
50-
jlr.Array.newInstance(classOf[Long], length).asInstanceOf[Array[Long]]
51-
52-
/** Create a Float[] array */
53-
def newFloatArray(length: Int): Array[Float] =
54-
jlr.Array.newInstance(classOf[Float], length).asInstanceOf[Array[Float]]
55-
56-
/** Create a Double[] array */
57-
def newDoubleArray(length: Int): Array[Double] =
58-
jlr.Array.newInstance(classOf[Double], length).asInstanceOf[Array[Double]]
59-
60-
/** Create a Boolean[] array */
61-
def newBooleanArray(length: Int): Array[Boolean] =
62-
jlr.Array.newInstance(classOf[Boolean], length).asInstanceOf[Array[Boolean]]
63-
64-
/** Create a scala.runtime.BoxedUnit[] array */
65-
def newUnitArray(length: Int): Array[Unit] =
66-
jlr.Array.newInstance(classOf[scala.runtime.BoxedUnit], length).asInstanceOf[Array[Unit]]
29+
def newArray[Arr](componentType: Class[_], returnType: Class[Arr], dimensions: Array[Int]): Arr =
30+
jlr.Array.newInstance(componentType, dimensions: _*).asInstanceOf[Arr]
6731
}

src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -363,21 +363,21 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
363363
* kind for the given element type in `typeArg`. No type arguments or
364364
* `length` arguments are given.
365365
*/
366-
def newArray(typeArg: Tree, pos: Position)(implicit ctx: Context): Tree = {
367-
val elemType = typeArg.tpe
368-
val elemClass = elemType.classSymbol
369-
def newArr(kind: String) =
370-
ref(defn.DottyArraysModule).select(s"new${kind}Array".toTermName).withPos(pos)
371-
if (TypeErasure.isUnboundedGeneric(elemType))
372-
newArr("Generic").appliedToTypeTrees(typeArg :: Nil)
373-
else if (elemClass.isPrimitiveValueClass)
374-
newArr(elemClass.name.toString)
375-
else {
376-
val typeApplied = newArr("Ref").appliedToTypeTrees(typeArg :: Nil)
377-
val classOfArg =
378-
ref(defn.Predef_classOf).appliedToTypeTrees(typeArg :: Nil)
379-
Apply(typeApplied, classOfArg :: Nil).withPos(typeArg.pos)
380-
}
366+
def newArray(elemTpe: Type, returnTpe: Type, pos: Position, dims: JavaSeqLiteral)(implicit ctx: Context): Tree = {
367+
val elemClass = elemTpe.classSymbol
368+
def newArr(symbol: TermSymbol) =
369+
ref(defn.DottyArraysModule).select(symbol).withPos(pos)
370+
371+
if (!ctx.erasedTypes)
372+
if (TypeErasure.isUnboundedGeneric(elemTpe)) {
373+
//exists only before erasure
374+
assert(dims.elems.tail.isEmpty)
375+
newArr(defn.newGenericArrayMethod).appliedToType(elemTpe).appliedTo(dims.elems.head)
376+
}
377+
else
378+
newArr(defn.newArrayMethod).appliedToTypeTrees(TypeTree(returnTpe) :: Nil).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
379+
else // after erasure
380+
newArr(defn.newArrayMethod).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
381381
}
382382

383383
// ------ Creating typed equivalents of trees that exist only in untyped form -------

src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ class Definitions {
246246
def DottyPredefModule(implicit ctx: Context) = DottyPredefModuleRef.symbol
247247
lazy val DottyArraysModuleRef = ctx.requiredModuleRef("dotty.runtime.Arrays")
248248
def DottyArraysModule(implicit ctx: Context) = DottyArraysModuleRef.symbol
249+
def newGenericArrayMethod(implicit ctx: Context) = DottyArraysModule.requiredMethod("newGenericArray")
250+
def newArrayMethod(implicit ctx: Context) = DottyArraysModule.requiredMethod("newArray")
249251

250252
lazy val NilModuleRef = ctx.requiredModuleRef("scala.collection.immutable.Nil")
251253
def NilModule(implicit ctx: Context) = NilModuleRef.symbol
@@ -277,6 +279,9 @@ class Definitions {
277279
def Array_clone(implicit ctx: Context) = Array_cloneR.symbol
278280
lazy val ArrayConstructorR = ArrayClass.requiredMethodRef(nme.CONSTRUCTOR)
279281
def ArrayConstructor(implicit ctx: Context) = ArrayConstructorR.symbol
282+
lazy val ArrayModuleType = ctx.requiredModuleRef("scala.Array")
283+
def ArrayModule(implicit ctx: Context) = ArrayModuleType.symbol.moduleClass.asClass
284+
280285

281286
lazy val UnitType: TypeRef = valueTypeRef("scala.Unit", BoxedUnitType, java.lang.Void.TYPE, UnitEnc)
282287
def UnitClass(implicit ctx: Context) = UnitType.symbol.asClass

0 commit comments

Comments
 (0)