Skip to content

Commit 99cfc45

Browse files
committed
Remove LabelIdent. Directly store LabelName instead.
The position of labels is always irrelevant, as they are synthetic. Therefore, storing them through `LabelIdent`s is wasteful.
1 parent b1946b9 commit 99cfc45

File tree

16 files changed

+86
-97
lines changed

16 files changed

+86
-97
lines changed

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.scalajs.ir
2929
import org.scalajs.ir.{Trees => js, Types => jstpe, ClassKind, Hashers, OriginalName}
3030
import org.scalajs.ir.Names.{
3131
LocalName,
32+
LabelName,
3233
SimpleFieldName,
3334
FieldName,
3435
SimpleMethodName,
@@ -2889,8 +2890,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
28892890
val labelParamSyms = tree.params.map(_.symbol)
28902891
val info = new EnclosingLabelDefInfoWithResultAsAssigns(labelParamSyms)
28912892

2892-
val labelIdent = encodeLabelSym(sym)
2893-
val labelName = labelIdent.name
2893+
val labelName = encodeLabelSym(sym)
28942894

28952895
val transformedRhs = withScopedVars(
28962896
enclosingLabelDefInfos := enclosingLabelDefInfos.get + (sym -> info)
@@ -2905,7 +2905,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
29052905
*/
29062906
object ReturnFromThisLabel {
29072907
def unapply(tree: js.Return): Option[js.Tree] = {
2908-
if (tree.label.name == labelName) Some(exprToStat(tree.expr))
2908+
if (tree.label == labelName) Some(exprToStat(tree.expr))
29092909
else None
29102910
}
29112911
}
@@ -2914,7 +2914,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
29142914
if (transformedRhs.tpe == jstpe.NothingType) {
29152915
// In this case, we do not need the outer block label
29162916
js.While(js.BooleanLiteral(true), {
2917-
js.Labeled(labelIdent, jstpe.VoidType, {
2917+
js.Labeled(labelName, jstpe.VoidType, {
29182918
transformedRhs match {
29192919
// Eliminate a trailing return@lab
29202920
case js.Block(stats :+ ReturnFromThisLabel(exprAsStat)) =>
@@ -2926,17 +2926,17 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
29262926
})
29272927
} else {
29282928
// When all else has failed, we need the full machinery
2929-
val blockLabelIdent = freshLabelIdent("block")
2929+
val blockLabelName = freshLabelName("block")
29302930
val bodyType =
29312931
if (isStat) jstpe.VoidType
29322932
else toIRType(tree.tpe)
2933-
js.Labeled(blockLabelIdent, bodyType, {
2933+
js.Labeled(blockLabelName, bodyType, {
29342934
js.While(js.BooleanLiteral(true), {
2935-
js.Labeled(labelIdent, jstpe.VoidType, {
2935+
js.Labeled(labelName, jstpe.VoidType, {
29362936
if (isStat)
2937-
js.Block(transformedRhs, js.Return(js.Skip(), blockLabelIdent))
2937+
js.Block(transformedRhs, js.Return(js.Skip(), blockLabelName))
29382938
else
2939-
js.Return(transformedRhs, blockLabelIdent)
2939+
js.Return(transformedRhs, blockLabelName)
29402940
})
29412941
})
29422942
})
@@ -3900,11 +3900,11 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
39003900

39013901
var clauses: List[(List[js.MatchableLiteral], js.Tree)] = Nil
39023902
var optElseClause: Option[js.Tree] = None
3903-
var optElseClauseLabel: Option[js.LabelIdent] = None
3903+
var optElseClauseLabel: Option[LabelName] = None
39043904

39053905
def genJumpToElseClause(implicit pos: ir.Position): js.Tree = {
39063906
if (optElseClauseLabel.isEmpty)
3907-
optElseClauseLabel = Some(freshLabelIdent("default"))
3907+
optElseClauseLabel = Some(freshLabelName("default"))
39083908
js.Return(js.Skip(), optElseClauseLabel.get)
39093909
}
39103910

@@ -4024,7 +4024,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
40244024
optElseClauseLabel.fold[js.Tree] {
40254025
buildMatch(clauses.reverse, elseClause, resultType)
40264026
} { elseClauseLabel =>
4027-
val matchResultLabel = freshLabelIdent("matchResult")
4027+
val matchResultLabel = freshLabelName("matchResult")
40284028
val patchedClauses = for ((alts, body) <- clauses) yield {
40294029
implicit val pos = body.pos
40304030
val newBody = js.Return(body, matchResultLabel)
@@ -4365,7 +4365,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
43654365
* all jumps to case labels are already caught upstream by `genCaseBody()`
43664366
* inside `genTranslatedMatch()`.
43674367
*/
4368-
private def genOptimizedCaseLabeled(label: js.LabelIdent,
4368+
private def genOptimizedCaseLabeled(label: LabelName,
43694369
translatedBody: js.Tree, returnCount: Int)(
43704370
implicit pos: Position): js.Tree = {
43714371

@@ -4422,7 +4422,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
44224422
* !!! There is quite of bit of code duplication with
44234423
* OptimizerCore.tryOptimizePatternMatch.
44244424
*/
4425-
def genOptimizedMatchEndLabeled(label: js.LabelIdent, tpe: jstpe.Type,
4425+
def genOptimizedMatchEndLabeled(label: LabelName, tpe: jstpe.Type,
44264426
translatedCases: List[js.Tree], returnCount: Int)(
44274427
implicit pos: Position): js.Tree = {
44284428
def default: js.Tree =

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ trait JSEncoding[G <: Global with Singleton] extends SubComponent {
9191
case None =>
9292
inner
9393
case Some(labelName) =>
94-
js.Labeled(js.LabelIdent(labelName), tpe, inner)
94+
js.Labeled(labelName, tpe, inner)
9595
}
9696
}
9797
}
@@ -151,29 +151,26 @@ trait JSEncoding[G <: Global with Singleton] extends SubComponent {
151151
private def freshLabelName(base: LabelName): LabelName =
152152
freshNameGeneric(base, usedLabelNames)(_.withSuffix(_))
153153

154-
private def freshLabelName(base: String): LabelName =
154+
def freshLabelName(base: String): LabelName =
155155
freshLabelName(LabelName(base))
156156

157-
def freshLabelIdent(base: String)(implicit pos: ir.Position): js.LabelIdent =
158-
js.LabelIdent(freshLabelName(base))
159-
160157
private def labelSymbolName(sym: Symbol): LabelName =
161158
labelSymbolNames.getOrElseUpdate(sym, freshLabelName(sym.name.toString))
162159

163-
def getEnclosingReturnLabel()(implicit pos: ir.Position): js.LabelIdent = {
160+
def getEnclosingReturnLabel()(implicit pos: Position): LabelName = {
164161
val box = returnLabelName.get
165162
if (box == null)
166163
throw new IllegalStateException(s"No enclosing returnable scope at $pos")
167164
if (box.value.isEmpty)
168165
box.value = Some(freshLabelName("_return"))
169-
js.LabelIdent(box.value.get)
166+
box.value.get
170167
}
171168

172169
// Encoding methods ----------------------------------------------------------
173170

174-
def encodeLabelSym(sym: Symbol)(implicit pos: Position): js.LabelIdent = {
171+
def encodeLabelSym(sym: Symbol): LabelName = {
175172
require(sym.isLabel, "encodeLabelSym called with non-label symbol: " + sym)
176-
js.LabelIdent(labelSymbolName(sym))
173+
labelSymbolName(sym)
177174
}
178175

179176
def encodeFieldSym(sym: Symbol)(implicit pos: Position): js.FieldIdent = {

compiler/src/test/scala/org/scalajs/nscplugin/test/OptimizationTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ class OptimizationTest extends JSASTTest {
250250
}
251251
}
252252
""".hasNot("non-return labeled block") {
253-
case js.Labeled(name, _, _) if !name.name.nameString.startsWith("_return") =>
253+
case js.Labeled(name, _, _) if !name.nameString.startsWith("_return") =>
254254
}
255255
}
256256

@@ -323,7 +323,7 @@ class OptimizationTest extends JSASTTest {
323323
}
324324
}
325325
""".hasNot("non-return labeled block") {
326-
case js.Labeled(name, _, _) if !name.name.nameString.startsWith("_return") =>
326+
case js.Labeled(name, _, _) if !name.nameString.startsWith("_return") =>
327327
}
328328
}
329329

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ object Hashers {
185185

186186
case Labeled(label, tpe, body) =>
187187
mixTag(TagLabeled)
188-
mixLabelIdent(label)
188+
mixName(label)
189189
mixType(tpe)
190190
mixTree(body)
191191

@@ -197,7 +197,7 @@ object Hashers {
197197
case Return(expr, label) =>
198198
mixTag(TagReturn)
199199
mixTree(expr)
200-
mixLabelIdent(label)
200+
mixName(label)
201201

202202
case If(cond, thenp, elsep) =>
203203
mixTag(TagIf)
@@ -646,11 +646,6 @@ object Hashers {
646646
mixName(ident.name)
647647
}
648648

649-
def mixLabelIdent(ident: LabelIdent): Unit = {
650-
mixPos(ident.pos)
651-
mixName(ident.name)
652-
}
653-
654649
def mixSimpleFieldIdent(ident: SimpleFieldIdent): Unit = {
655650
mixPos(ident.pos)
656651
mixName(ident.name)

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ object Printers {
122122
def printAnyNode(node: IRNode): Unit = {
123123
node match {
124124
case node: LocalIdent => print(node)
125-
case node: LabelIdent => print(node)
126125
case node: SimpleFieldIdent => print(node)
127126
case node: FieldIdent => print(node)
128127
case node: MethodIdent => print(node)
@@ -1138,9 +1137,6 @@ object Printers {
11381137
def print(ident: LocalIdent): Unit =
11391138
print(ident.name)
11401139

1141-
def print(ident: LabelIdent): Unit =
1142-
print(ident.name)
1143-
11441140
def print(ident: SimpleFieldIdent): Unit =
11451141
print(ident.name)
11461142

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,15 @@ object Serializers {
265265

266266
case Labeled(label, tpe, body) =>
267267
writeTagAndPos(TagLabeled)
268-
writeLabelIdent(label); writeType(tpe); writeTree(body)
268+
writeName(label); writeType(tpe); writeTree(body)
269269

270270
case Assign(lhs, rhs) =>
271271
writeTagAndPos(TagAssign)
272272
writeTree(lhs); writeTree(rhs)
273273

274274
case Return(expr, label) =>
275275
writeTagAndPos(TagReturn)
276-
writeTree(expr); writeLabelIdent(label)
276+
writeTree(expr); writeName(label)
277277

278278
case If(cond, thenp, elsep) =>
279279
writeTagAndPos(TagIf)
@@ -786,11 +786,6 @@ object Serializers {
786786
writeName(ident.name)
787787
}
788788

789-
def writeLabelIdent(ident: LabelIdent): Unit = {
790-
writePosition(ident.pos)
791-
writeName(ident.name)
792-
}
793-
794789
def writeSimpleFieldIdent(ident: SimpleFieldIdent): Unit = {
795790
writePosition(ident.pos)
796791
writeName(ident.name)
@@ -1135,7 +1130,7 @@ object Serializers {
11351130
case TagVarDef => VarDef(readLocalIdent(), readOriginalName(), readType(), readBoolean(), readTree())
11361131
case TagSkip => Skip()
11371132
case TagBlock => Block(readTrees())
1138-
case TagLabeled => Labeled(readLabelIdent(), readType(), readTree())
1133+
case TagLabeled => Labeled(readLabelName(), readType(), readTree())
11391134

11401135
case TagAssign =>
11411136
val lhs0 = readTree()
@@ -1155,7 +1150,7 @@ object Serializers {
11551150

11561151
Assign(lhs.asInstanceOf[AssignLhs], rhs)
11571152

1158-
case TagReturn => Return(readTree(), readLabelIdent())
1153+
case TagReturn => Return(readTree(), readLabelName())
11591154
case TagIf => If(readTree(), readTree(), readTree())(readType())
11601155
case TagWhile => While(readTree(), readTree())
11611156

@@ -2166,11 +2161,6 @@ object Serializers {
21662161
LocalIdent(readLocalName())
21672162
}
21682163

2169-
def readLabelIdent(): LabelIdent = {
2170-
implicit val pos = readPosition()
2171-
LabelIdent(readLabelName())
2172-
}
2173-
21742164
def readFieldIdent(): FieldIdent = {
21752165
// For historical reasons, the className comes *before* the position
21762166
val className = readClassName()
@@ -2399,6 +2389,12 @@ object Serializers {
23992389
}
24002390

24012391
private def readLabelName(): LabelName = {
2392+
/* Before 1.18, `LabelName`s were always wrapped in `LabelIdent`s, whose
2393+
* encoding was a `Position` followed by the actual `LabelName`.
2394+
*/
2395+
if (hacks.use17)
2396+
readPosition() // intentional discard
2397+
24022398
val i = readInt()
24032399
val existing = labelNames(i)
24042400
if (existing ne null) {

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,6 @@ object Trees {
5656
sealed case class LocalIdent(name: LocalName)(implicit val pos: Position)
5757
extends IRNode
5858

59-
sealed case class LabelIdent(name: LabelName)(implicit val pos: Position)
60-
extends IRNode
61-
6259
sealed case class SimpleFieldIdent(name: SimpleFieldName)(implicit val pos: Position)
6360
extends IRNode
6461

@@ -150,7 +147,7 @@ object Trees {
150147
def unapply(block: Block): Some[List[Tree]] = Some(block.stats)
151148
}
152149

153-
sealed case class Labeled(label: LabelIdent, tpe: Type, body: Tree)(
150+
sealed case class Labeled(label: LabelName, tpe: Type, body: Tree)(
154151
implicit val pos: Position) extends Tree
155152

156153
sealed trait AssignLhs extends Tree
@@ -160,7 +157,7 @@ object Trees {
160157
val tpe = VoidType
161158
}
162159

163-
sealed case class Return(expr: Tree, label: LabelIdent)(
160+
sealed case class Return(expr: Tree, label: LabelName)(
164161
implicit val pos: Position) extends Tree {
165162
val tpe = NothingType
166163
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ object TestIRBuilder {
3939
// String -> Name conversions
4040
implicit def string2localName(name: String): LocalName =
4141
LocalName(name)
42+
implicit def string2labelName(name: String): LabelName =
43+
LabelName(name)
4244
implicit def string2simpleFieldName(name: String): SimpleFieldName =
4345
SimpleFieldName(name)
4446
implicit def string2className(name: String): ClassName =
@@ -47,8 +49,6 @@ object TestIRBuilder {
4749
// String -> Ident conversions
4850
implicit def string2localIdent(name: String): LocalIdent =
4951
LocalIdent(LocalName(name))
50-
implicit def string2labelIdent(name: String): LabelIdent =
51-
LabelIdent(LabelName(name))
5252
implicit def string2simpleFieldIdent(name: String): SimpleFieldIdent =
5353
SimpleFieldIdent(SimpleFieldName(name))
5454
implicit def string2classIdent(name: String): ClassIdent =

0 commit comments

Comments
 (0)