Skip to content

Commit 495917e

Browse files
committed
Squash: Change NewArray to have a unique length.
1 parent 5f01a88 commit 495917e

File tree

14 files changed

+53
-61
lines changed

14 files changed

+53
-61
lines changed

compiler/src/main/scala/org/scalajs/nscplugin/GenJSCode.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3672,12 +3672,11 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
36723672
*/
36733673
def genNewArray(arrayTypeRef: jstpe.ArrayTypeRef, arguments: List[js.Tree])(
36743674
implicit pos: Position): js.Tree = {
3675-
assert(arguments.length <= arrayTypeRef.dimensions,
3676-
"too many arguments for array constructor: found " + arguments.length +
3677-
" but array has only " + arrayTypeRef.dimensions +
3678-
" dimension(s)")
3675+
assert(arguments.size == 1,
3676+
"expected exactly 1 argument for array constructor: found " +
3677+
s"${arguments.length} at $pos")
36793678

3680-
js.NewArray(arrayTypeRef, arguments)
3679+
js.NewArray(arrayTypeRef, arguments.head)
36813680
}
36823681

36833682
/** Gen JS code for an array literal. */

ir/shared/src/main/scala/org/scalajs/ir/Hashers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,10 @@ object Hashers {
321321
mixTree(lhs)
322322
mixTree(rhs)
323323

324-
case NewArray(typeRef, lengths) =>
324+
case NewArray(typeRef, length) =>
325325
mixTag(TagNewArray)
326326
mixArrayTypeRef(typeRef)
327-
mixTrees(lengths)
327+
mixTrees(length :: Nil) // mixed as a list for historical reasons
328328

329329
case ArrayValue(typeRef, elems) =>
330330
mixTag(TagArrayValue)

ir/shared/src/main/scala/org/scalajs/ir/Printers.scala

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -511,15 +511,13 @@ object Printers {
511511
print(rhs)
512512
print(')')
513513

514-
case NewArray(typeRef, lengths) =>
514+
case NewArray(typeRef, length) =>
515515
print("new ")
516516
print(typeRef.base)
517-
for (length <- lengths) {
518-
print('[')
519-
print(length)
520-
print(']')
521-
}
522-
for (dim <- lengths.size until typeRef.dimensions)
517+
print('[')
518+
print(length)
519+
print(']')
520+
for (dim <- 1 until typeRef.dimensions)
523521
print("[]")
524522

525523
case ArrayValue(typeRef, elems) =>

ir/shared/src/main/scala/org/scalajs/ir/Serializers.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,10 @@ object Serializers {
363363
writeTagAndPos(TagBinaryOp)
364364
writeByte(op); writeTree(lhs); writeTree(rhs)
365365

366-
case NewArray(tpe, lengths) =>
366+
case NewArray(tpe, length) =>
367367
writeTagAndPos(TagNewArray)
368-
writeArrayTypeRef(tpe); writeTrees(lengths)
368+
writeArrayTypeRef(tpe)
369+
writeTrees(length :: Nil) // written as a list of historical reasons
369370

370371
case ArrayValue(tpe, elems) =>
371372
writeTagAndPos(TagArrayValue)
@@ -1232,10 +1233,10 @@ object Serializers {
12321233
val lengths = readTrees()
12331234
lengths match {
12341235
case length :: Nil =>
1235-
NewArray(arrayTypeRef, lengths)
1236+
NewArray(arrayTypeRef, length)
12361237

12371238
case _ =>
1238-
if (true /* hacks.use16 */) { // scalastyle:ignore
1239+
if (hacks.use16) {
12391240
// Rewrite as a call to j.l.r.Array.newInstance
12401241
val ArrayTypeRef(base, origDims) = arrayTypeRef
12411242
val newDims = origDims - lengths.size

ir/shared/src/main/scala/org/scalajs/ir/Transformers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ object Transformers {
114114
case BinaryOp(op, lhs, rhs) =>
115115
BinaryOp(op, transformExpr(lhs), transformExpr(rhs))
116116

117-
case NewArray(tpe, lengths) =>
118-
NewArray(tpe, lengths map transformExpr)
117+
case NewArray(tpe, length) =>
118+
NewArray(tpe, transformExpr(length))
119119

120120
case ArrayValue(tpe, elems) =>
121121
ArrayValue(tpe, elems map transformExpr)

ir/shared/src/main/scala/org/scalajs/ir/Traversers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ object Traversers {
101101
traverse(lhs)
102102
traverse(rhs)
103103

104-
case NewArray(tpe, lengths) =>
105-
lengths foreach traverse
104+
case NewArray(tpe, length) =>
105+
traverse(length)
106106

107107
case ArrayValue(tpe, elems) =>
108108
elems foreach traverse

ir/shared/src/main/scala/org/scalajs/ir/Trees.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ object Trees {
523523
}
524524
}
525525

526-
sealed case class NewArray(typeRef: ArrayTypeRef, lengths: List[Tree])(
526+
sealed case class NewArray(typeRef: ArrayTypeRef, length: Tree)(
527527
implicit val pos: Position) extends Tree {
528528
val tpe = ArrayType(typeRef, nullable = false)
529529
}

ir/shared/src/test/scala/org/scalajs/ir/PrintersTest.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -557,10 +557,10 @@ class PrintersTest {
557557
}
558558

559559
@Test def printNewArray(): Unit = {
560-
assertPrintEquals("new int[3]", NewArray(ArrayTypeRef(IntRef, 1), List(i(3))))
561-
assertPrintEquals("new int[3][]", NewArray(ArrayTypeRef(IntRef, 2), List(i(3))))
562-
assertPrintEquals("new java.lang.Object[3][4][][]",
563-
NewArray(ArrayTypeRef(ObjectClass, 4), List(i(3), i(4))))
560+
assertPrintEquals("new int[3]", NewArray(ArrayTypeRef(IntRef, 1), i(3)))
561+
assertPrintEquals("new int[3][]", NewArray(ArrayTypeRef(IntRef, 2), i(3)))
562+
assertPrintEquals("new java.lang.Object[3][][][]",
563+
NewArray(ArrayTypeRef(ObjectClass, 4), i(3)))
564564
}
565565

566566
@Test def printArrayValue(): Unit = {

linker/shared/src/main/scala/org/scalajs/linker/backend/emitter/FunctionEmitter.scala

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,8 +1047,8 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
10471047
if noExtractYet || semantics.asInstanceOfs == Unchecked =>
10481048
AsInstanceOf(rec(expr), tpe)
10491049

1050-
case NewArray(tpe, lengths) =>
1051-
NewArray(tpe, recs(lengths))
1050+
case NewArray(tpe, length) =>
1051+
NewArray(tpe, rec(length))
10521052
case ArrayValue(tpe, elems) =>
10531053
ArrayValue(tpe, recs(elems))
10541054
case JSArrayConstr(items) if !needsToTranslateAnySpread(items) =>
@@ -1346,8 +1346,8 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
13461346
allowSideEffects && test(expr) // may TypeError
13471347

13481348
// Array operations with conditional exceptions
1349-
case NewArray(tpe, lengths) =>
1350-
allowBehavior(semantics.negativeArraySizes) && allowUnpure && lengths.forall(test)
1349+
case NewArray(tpe, length) =>
1350+
allowBehavior(semantics.negativeArraySizes) && allowUnpure && test(length)
13511351
case ArraySelect(array, index) =>
13521352
allowBehavior(semantics.arrayIndexOutOfBounds) && allowUnpure && testNPE(array) && test(index)
13531353

@@ -1759,9 +1759,9 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
17591759
redo(BinaryOp(op, newLhs, newRhs))(env)
17601760
}
17611761

1762-
case NewArray(tpe, lengths) =>
1763-
unnest(lengths) { (newLengths, env) =>
1764-
redo(NewArray(tpe, newLengths))(env)
1762+
case NewArray(tpe, length) =>
1763+
unnest(length) { (newLength, env) =>
1764+
redo(NewArray(tpe, newLength))(env)
17651765
}
17661766

17671767
case ArrayValue(tpe, elems) =>
@@ -2701,14 +2701,8 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
27012701
js.Apply(genGetDataOf(newLhs) DOT cpn.newArray, newRhs :: Nil)
27022702
}
27032703

2704-
case NewArray(typeRef, lengths) =>
2705-
lengths match {
2706-
case length :: Nil =>
2707-
js.New(genArrayConstrOf(typeRef), transformExprNoChar(length) :: Nil)
2708-
case _ =>
2709-
throw new AssertionError(
2710-
s"Illegal legacy NewArray with lengths $lengths at $pos")
2711-
}
2704+
case NewArray(typeRef, length) =>
2705+
js.New(genArrayConstrOf(typeRef), transformExprNoChar(length) :: Nil)
27122706

27132707
case ArrayValue(typeRef, elems) =>
27142708
val preserveChar = typeRef match {

linker/shared/src/main/scala/org/scalajs/linker/backend/wasmemitter/FunctionEmitter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2877,7 +2877,7 @@ private class FunctionEmitter private (
28772877
}
28782878

28792879
private def genNewArray(tree: NewArray): Type = {
2880-
val NewArray(arrayTypeRef, length :: Nil) = tree: @unchecked
2880+
val NewArray(arrayTypeRef, length) = tree
28812881

28822882
markPosition(tree)
28832883

linker/shared/src/main/scala/org/scalajs/linker/checker/ClassDefChecker.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -663,14 +663,9 @@ private final class ClassDefChecker(classDef: ClassDef,
663663
checkTree(lhs, env)
664664
checkTree(rhs, env)
665665

666-
case NewArray(typeRef, lengths) =>
667-
if (lengths.isEmpty)
668-
reportError("NewArray must have non-0 dimensions")
669-
if (lengths.size > 1)
670-
reportError(i"Illegal legacy NewArray with ${lengths.size} dimensions")
671-
666+
case NewArray(typeRef, length) =>
672667
checkArrayTypeRef(typeRef)
673-
checkTrees(lengths, env)
668+
checkTree(length, env)
674669

675670
case ArrayValue(typeRef, elems) =>
676671
checkArrayTypeRef(typeRef)

linker/shared/src/main/scala/org/scalajs/linker/checker/IRChecker.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,8 @@ private final class IRChecker(unit: LinkingUnit, reporter: ErrorReporter) {
491491
typecheckExpect(lhs, env, expectedLhsType)
492492
typecheckExpect(rhs, env, expectedRhsType)
493493

494-
case NewArray(typeRef, lengths) =>
495-
for (length <- lengths)
496-
typecheckExpect(length, env, IntType)
494+
case NewArray(typeRef, length) =>
495+
typecheckExpect(length, env, IntType)
497496

498497
case ArrayValue(typeRef, elems) =>
499498
val elemType = arrayElemType(typeRef)

linker/shared/src/main/scala/org/scalajs/linker/frontend/optimizer/OptimizerCore.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,8 @@ private[optimizer] abstract class OptimizerCore(
530530
pretransformBinaryOp(tree)(finishTransform(isStat))
531531
}
532532

533-
case NewArray(tpe, lengths) =>
534-
NewArray(tpe, lengths map transformExpr)
533+
case NewArray(tpe, length) =>
534+
NewArray(tpe, transformExpr(length))
535535

536536
case ArrayValue(tpe, elems) =>
537537
ArrayValue(tpe, elems map transformExpr)
@@ -1667,10 +1667,10 @@ private[optimizer] abstract class OptimizerCore(
16671667
case LoadModule(moduleClassName) =>
16681668
if (hasElidableConstructors(moduleClassName)) Skip()(stat.pos)
16691669
else stat
1670-
case NewArray(_, lengths) if lengths.forall(isNonNegativeIntLiteral(_)) =>
1670+
case NewArray(_, length) if isNonNegativeIntLiteral(length) =>
16711671
Skip()(stat.pos)
1672-
case NewArray(_, lengths) if semantics.negativeArraySizes == CheckedBehavior.Unchecked =>
1673-
Block(lengths.map(keepOnlySideEffects))(stat.pos)
1672+
case NewArray(_, length) if semantics.negativeArraySizes == CheckedBehavior.Unchecked =>
1673+
keepOnlySideEffects(length)
16741674
case ArrayValue(_, elems) =>
16751675
Block(elems.map(keepOnlySideEffects(_)))(stat.pos)
16761676
case ArrayLength(array) =>
@@ -1919,8 +1919,8 @@ private[optimizer] abstract class OptimizerCore(
19191919
}
19201920
}
19211921

1922-
case NewArray(typeRef, lengths) =>
1923-
recs(lengths).mapOrKeepGoing(NewArray(typeRef, _))
1922+
case NewArray(typeRef, length) =>
1923+
rec(length).mapOrKeepGoing(NewArray(typeRef, _))
19241924

19251925
case ArrayValue(typeRef, elems) =>
19261926
recs(elems).mapOrKeepGoing(ArrayValue(typeRef, _))
@@ -4966,7 +4966,7 @@ private[optimizer] abstract class OptimizerCore(
49664966
lhs match {
49674967
case PreTransLit(ClassOf(elementTypeRef)) if elementTypeRef != VoidRef =>
49684968
val arrayTypeRef = ArrayTypeRef.of(elementTypeRef)
4969-
NewArray(arrayTypeRef, List(finishTransformExpr(rhs))).toPreTransform
4969+
NewArray(arrayTypeRef, finishTransformExpr(rhs)).toPreTransform
49704970
case _ =>
49714971
default
49724972
}

project/BinaryIncompatibilities.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ object BinaryIncompatibilities {
99

1010
ProblemFilters.exclude[IncompatibleResultTypeProblem]("org.scalajs.ir.Trees#*.tpe"),
1111

12+
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.scalajs.ir.Trees#NewArray.this"),
13+
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.scalajs.ir.Trees#NewArray.apply"),
14+
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.scalajs.ir.Trees#NewArray.copy"),
15+
ProblemFilters.exclude[IncompatibleResultTypeProblem]("org.scalajs.ir.Trees#NewArray.copy$default$2"),
16+
ProblemFilters.exclude[DirectMissingMethodProblem]("org.scalajs.ir.Trees#NewArray.lengths"),
17+
1218
ProblemFilters.exclude[DirectMissingMethodProblem]("org.scalajs.ir.Types#ClassType.this"),
1319
ProblemFilters.exclude[DirectMissingMethodProblem]("org.scalajs.ir.Types#ClassType.apply"),
1420
ProblemFilters.exclude[DirectMissingMethodProblem]("org.scalajs.ir.Types#ClassType.copy"),

0 commit comments

Comments
 (0)