Skip to content

Commit 08d0286

Browse files
committed
Inline genUnchecked at its two call sites.
It had been factored out in `SJSGen` because of one condition that happens to be repeated. However, it is clearer that it does the right thing at each of its call sites. Given the amount of information that needed to be passed to this helper, inlining it twice actually removes additional checks. Ultimately, it seems simpler this way.
1 parent 244fa53 commit 08d0286

File tree

3 files changed

+13
-17
lines changed

3 files changed

+13
-17
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,10 @@ private[emitter] object CoreJSLib {
11711171
// Both values have the same "data" (could also be falsy values)
11721172
If(srcData && genIdentBracketSelect(srcData, "isArrayClass"), {
11731173
// Fast path: the values are array of the same type
1174-
genUncheckedArraycopy(List(src, srcPos, dest, destPos, length))
1174+
if (esVersion >= ESVersion.ES2015 && nullPointers == CheckedBehavior.Unchecked)
1175+
Apply(src DOT "copyTo", List(srcPos, dest, destPos, length))
1176+
else
1177+
genCallHelper(VarField.systemArraycopy, src, srcPos, dest, destPos, length)
11751178
}, {
11761179
genCallHelper(VarField.throwArrayStoreException, Null())
11771180
})

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,12 +875,19 @@ private[emitter] class FunctionEmitter(sjsGen: SJSGen) {
875875
implicit val env = env0
876876
val jsArgs = newArgs.map(transformExprNoChar(_))
877877

878+
def genUnchecked(): js.Tree = {
879+
if (esFeatures.esVersion >= ESVersion.ES2015 && semantics.nullPointers == CheckedBehavior.Unchecked)
880+
js.Apply(jsArgs.head DOT "copyTo", jsArgs.tail)
881+
else
882+
genCallHelper(VarField.systemArraycopy, jsArgs: _*)
883+
}
884+
878885
if (semantics.arrayStores == Unchecked) {
879-
genUncheckedArraycopy(jsArgs)
886+
genUnchecked()
880887
} else {
881888
(src.tpe, dest.tpe) match {
882889
case (PrimArray(srcPrimRef), PrimArray(destPrimRef)) if srcPrimRef == destPrimRef =>
883-
genUncheckedArraycopy(jsArgs)
890+
genUnchecked()
884891
case (RefArray(), RefArray()) =>
885892
genCallHelper(VarField.systemArraycopyRefs, jsArgs: _*)
886893
case _ =>

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -149,20 +149,6 @@ private[emitter] final class SJSGen(
149149
}
150150
}
151151

152-
def genUncheckedArraycopy(args: List[Tree])(
153-
implicit moduleContext: ModuleContext, globalKnowledge: GlobalKnowledge,
154-
pos: Position): Tree = {
155-
import TreeDSL._
156-
157-
assert(args.lengthCompare(5) == 0,
158-
s"wrong number of args for genUncheckedArrayCopy: $args")
159-
160-
if (esFeatures.esVersion >= ESVersion.ES2015 && semantics.nullPointers == CheckedBehavior.Unchecked)
161-
Apply(args.head DOT "copyTo", args.tail)
162-
else
163-
genCallHelper(VarField.systemArraycopy, args: _*)
164-
}
165-
166152
def genSelect(receiver: Tree, field: irt.FieldIdent)(
167153
implicit pos: Position): Tree = {
168154
DotSelect(receiver, Ident(genName(field.name))(field.pos))

0 commit comments

Comments
 (0)