8000 Merge pull request #3322 from sjrd/no-continue · scala-js/scala-js@edfea82 · GitHub
[go: up one dir, main page]

Skip to content

Commit edfea82

Browse files
authored
Merge pull request #3322 from sjrd/no-continue
Get rid of the `Continue` IR node, as well as labels on loops.
2 parents 134c8e4 + ec0e32b commit edfea82

File tree

12 files changed

+167
-158
lines changed

12 files changed

+167
-158
lines changed

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,7 +1958,7 @@ abstract class GenJSCode extends plugins.PluginComponent
19581958
js.Return(toIRType(expr.tpe) match {
19591959
case jstpe.NoType => js.Block(genStat(expr), js.Undefined())
19601960
case _ => genExpr(expr)
1961-
})
1961+
}, None)
19621962

19631963
case t: Try =>
19641964
genTry(t, isStat)
@@ -2265,11 +2265,13 @@ abstract class GenJSCode extends plugins.PluginComponent
22652265

22662266
js.Labeled(blockLabelIdent, bodyType, {
22672267
js.While(js.BooleanLiteral(true), {
2268-
if (bodyType == jstpe.NoType)
2269-
js.Block(genStat(rhs), js.Return(js.Undefined(), Some(blockLabelIdent)))
2270-
else
2271-
js.Return(genExpr(rhs), Some(blockLabelIdent))
2272-
}, Some(labelIdent))
2268+
js.Labeled(labelIdent, jstpe.NoType, {
2269+
if (bodyType == jstpe.NoType)
2270+
js.Block(genStat(rhs), js.Return(js.Undefined(), Some(blockLabelIdent)))
2271+
else
2272+
js.Return(genExpr(rhs), Some(blockLabelIdent))
2273+
})
2274+
})
22732275
})
22742276
}
22752277
}
@@ -2712,8 +2714,8 @@ abstract class GenJSCode extends plugins.PluginComponent
27122714
quadruplets.result()
27132715
}
27142716

2715-
// The actual jump (continue labelDefIdent;)
2716-
val jump = js.Continue(Some(encodeLabelSym(sym)))
2717+
// The actual jump (return(labelDefIdent) undefined;)
2718+
val jump = js.Return(js.Undefined(), Some(encodeLabelSym(sym)))
27172719

27182720
quadruplets match {
27192721
case Nil => jump
@@ -3220,9 +3222,9 @@ abstract class GenJSCode extends plugins.PluginComponent
32203222
val result = translateMatch(retExpr)
32213223
if (result.tpe == jstpe.NoType) {
32223224
// Could not actually reproduce this, but better be safe than sorry
3223-
js.Block(result, js.Return(js.Undefined()))
3225+
js.Block(result, js.Return(js.Undefined(), None))
32243226
} else {
3225-
js.Return(result)
3227+
js.Return(result, None)
32263228
}
32273229

32283230
case _ =>

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,15 @@ object Hashers {
129129
mixTree(elsep)
130130
mixType(tree.tpe)
131131

132-
case While(cond, body, label) =>
132+
case While(cond, body) =>
133133
mixTag(TagWhile)
134134
mixTree(cond)
135135
mixTree(body)
136-
mixOptIdent(label)
137136

138-
case DoWhile(body, cond, label) =>
137+
case DoWhile(body, cond) =>
139138
mixTag(TagDoWhile)
140139
mixTree(body)
141140
mixTree(cond)
142-
mixOptIdent(label)
143141

144142
case ForIn(obj, keyVar, body) =>
145143
mixTag(TagForIn)
@@ -164,10 +162,6 @@ object Hashers {
164162
mixTag(TagThrow)
165163
mixTree(expr)
166164

167-
case Continue(label) =>
168-
mixTag(TagContinue)
169-
mixOptIdent(label)
170-
171165
case Match(selector, cases, default) =>
172166
mixTag(TagMatch)
173167
mixTree(selector)

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

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -200,21 +200,13 @@ object Printers {
200200
printBlock(elsep)
201201
}
202202

203-
case While(cond, body, label) =>
204-
if (label.isDefined) {
205-
print(label.get)
206-
print(": ")
207-
}
203+
case While(cond, body) =>
208204
print("while (")
209205
print(cond)
210206
print(") ")
211207
printBlock(body)
212208

213-
case DoWhile(body, cond, label) =>
214-
if (label.isDefined) {
215-
print(label.get)
216-
print(": ")
217-
}
209+
case DoWhile(body, cond) =>
218210
print("do ")
219211
printBlock(body)
220212
print(" while (")
@@ -257,13 +249,6 @@ object Printers {
257249
print("throw ")
258250
print(expr)
259251

260-
case Continue(label) =>
261-
print("continue")
262-
if (label.isDefined) {
263-
print(' ')
264-
print(label.get)
265-
}
266-
267252
case Match(selector, cases, default) =>
268253
print("match (")
269254
print(selector)

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,13 @@ object Serializers {
162162
writeTree(cond); writeTree(thenp); writeTree(elsep)
163163
writeType(tree.tpe)
164164

165-
case While(cond, body, label) =>
165+
case While(cond, body) =>
166166
writeByte(TagWhile)
167-
writeTree(cond); writeTree(body); writeOptIdent(label)
167+
writeTree(cond); writeTree(body)
168168

169-
case DoWhile(body, cond, label) =>
169+
case DoWhile(body, cond) =>
170170
writeByte(TagDoWhile)
171-
writeTree(body); writeTree(cond); writeOptIdent(label)
171+
writeTree(body); writeTree(cond)
172172

173173
case ForIn(obj, keyVar, body) =>
174174
writeByte(TagForIn)
@@ -187,10 +187,6 @@ object Serializers {
187187
writeByte(TagThrow)
188188
writeTree(expr)
189189

190-
case Continue(label) =>
191-
writeByte(TagContinue)
192-
writeOptIdent(label)
193-
194190
case Match(selector, cases, default) =>
195191
writeByte(TagMatch)
196192
writeTree(selector)
@@ -845,8 +841,8 @@ object Serializers {
845841
case TagAssign => Assign(readTree(), readTree())
846842
case TagReturn => Return(readTree(), readOptIdent())
847843
case TagIf => If(readTree(), readTree(), readTree())(readType())
848-
case TagWhile => While(readTree(), readTree(), readOptIdent())
849-
case TagDoWhile => DoWhile(readTree(), readTree(), readOptIdent())
844+
case TagWhile => While(readTree(), readTree())
845+
case TagDoWhile => DoWhile(readTree(), readTree())
850846
case TagForIn => ForIn(readTree(), readIdent(), readTree())
851847

852848
case TagTryCatch =>
@@ -856,7 +852,6 @@ object Serializers {
856852
TryFinally(readTree(), readTree())
857853

858854
case TagThrow => Throw(readTree())
859-
case TagContinue => Continue(readOptIdent())
860855
case TagMatch =>
861856
Match(readTree(), List.fill(readInt()) {
862857
(readTrees().map(_.asInstanceOf[Literal]), readTree())

ir/src/main/scala/org/scalajs/ir/Tags.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ private[ir] object Tags {
3333
final val TagTryCatch = TagForIn + 1
3434
final val TagTryFinally = TagTryCatch + 1
3535
final val TagThrow = TagTryFinally + 1
36-
final val TagContinue = TagThrow + 1
37-
final val TagMatch = TagContinue + 1
36+
final val TagMatch = TagThrow + 1
3837
final val TagDebugger = TagMatch + 1
3938

4039
final val TagNew = TagDebugger + 1

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ object Transformers {
5656
If(transformExpr(cond), transform(thenp, isStat),
5757
transform(elsep, isStat))(tree.tpe)
5858

59-
case While(cond, body, label) =>
60-
While(transformExpr(cond), transformStat(body), label)
59+
case While(cond, body) =>
60+
While(transformExpr(cond), transformStat(body))
6161

62-
case DoWhile(body, cond, label) =>
63-
DoWhile(transformStat(body), transformExpr(cond), label)
62+
case DoWhile(body, cond) =>
63+
DoWhile(transformStat(body), transformExpr(cond))
6464

6565
case ForIn(obj, keyVar, body) =>
6666
ForIn(transformExpr(obj), keyVar, transformStat(body))
@@ -203,7 +203,7 @@ object Transformers {
203203

204204
// Trees that need not be transformed
205205

206-
case _:Skip | _:Continue | _:Debugger | _:LoadModule | _:SelectStatic |
206+
case _:Skip | _:Debugger | _:LoadModule | _:SelectStatic |
207207
_:LoadJSConstructor | _:LoadJSModule | _:JSLinkingInfo |
208208
_:Literal | _:VarRef | _:This | _:JSGlobalRef | _:Transient =>
209209
tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ object Traversers {
4545
traverse(thenp)
4646
traverse(elsep)
4747

48-
case While(cond, body, label) =>
48+
case While(cond, body) =>
4949
traverse(cond)
5050
traverse(body)
5151

52-
case DoWhile(body, cond, label) =>
52+
case DoWhile(body, cond) =>
5353
traverse(body)
5454
traverse(cond)
5555

@@ -204,7 +204,7 @@ object Traversers {
204204

205205
// Trees that need not be traversed
206206

207-
case _:Skip | _:Continue | _:Debugger | _:LoadModule | _:SelectStatic |
207+
case _:Skip | _:Debugger | _:LoadModule | _:SelectStatic |
208208
_:LoadJSConstructor | _:LoadJSModule | _:JSLinkingInfo | _:Literal |
209209
_:VarRef | _:This | _:JSGlobalRef | _:Transient =>
210210
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ object Trees {
177177
val tpe = NoType // cannot be in expression position
178178
}
179179

180-
case class Return(expr: Tree, label: Option[Ident] = None)(
180+
case class Return(expr: Tree, label: Option[Ident])(
181181
implicit val pos: Position) extends Tree {
182182
val tpe = NothingType
183183
}
184184

185185
case class If(cond: Tree, thenp: Tree, elsep: Tree)(val tpe: Type)(
186186
implicit val pos: Position) extends Tree
187187

188-
case class While(cond: Tree, body: Tree, label: Option[Ident] = None)(
188+
case class While(cond: Tree, body: Tree)(
189189
implicit val pos: Position) extends Tree {
190190
// cannot be in expression position, unless it is infinite
191191
val tpe = cond match {
@@ -194,7 +194,7 @@ object Trees {
194194
}
195195
}
196196

197-
case class DoWhile(body: Tree, cond: Tree, label: Option[Ident] = None)(
197+
case class DoWhile(body: Tree, cond: Tree)(
198198
implicit val pos: Position) extends Tree {
199199
val tpe = NoType // cannot be in expression position
200200
}
@@ -216,11 +216,6 @@ object Trees {
216216
val tpe = NothingType
217217
}
218218

219-
case class Continue(label: Option[Ident] = None)(
220-
implicit val pos: Position) extends Tree {
221-
val tpe = NothingType
222-
}
223-
224219
/** A break-free switch (without fallthrough behavior).
225220
* Unlike a JavaScript switch, it can be used in expression position.
226221
* It supports alternatives explicitly (hence the List[Tree] in cases),

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class PrintersTest {
147147
}
148148

149149
@Test def printReturn(): Unit = {
150-
assertPrintEquals("return 5", Return(i(5)))
150+
assertPrintEquals("return 5", Return(i(5), None))
151151
assertPrintEquals("return(lab) 5", Return(i(5), Some("lab")))
152152
}
153153

@@ -197,14 +197,6 @@ class PrintersTest {
197197
|}
198198
""",
199199
While(b(true), i(5)))
200-
201-
assertPrintEquals(
202-
"""
203-
|lab: while (true) {
204-
| 5
205-
|}
206-
""",
207-
While(b(true), i(5), Some("lab")))
208200
}
209201

210202
@Test def printDoWhile(): Unit = {
@@ -215,14 +207,6 @@ class PrintersTest {
215207
|} while (true)
216208
""",
217209
DoWhile(i(5), b(true)))
218-
219-
assertPrintEquals(
220-
"""
221-
|lab: do {
222-
| 5
223-
|} while (true)
224-
""",
225-
DoWhile(i(5), b(true), Some("lab")))
226210
}
227211

228212
@Test def printForIn(): Unit = {
@@ -273,11 +257,6 @@ class PrintersTest {
273257
assertPrintEquals("throw null", Throw(Null()))
274258
}
275259

276-
@Test def printContinue(): Unit = {
277-
assertPrintEquals("continue", Continue())
278-
assertPrintEquals("continue lab", Continue(Some("lab")))
279-
}
280-
281260
@Test def printMatch(): Unit = {
282261
assertPrintEquals(
283262
"""

0 commit comments

Comments
 (0)
0