Skip to content

Commit 7aad64e

Browse files
committed
Learned to handled labeled statements
Previously we treated labels as placeholders. But they actually hold the next statement inside them!
1 parent ed7cfa5 commit 7aad64e

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

src/control-flow/cfg.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,13 @@ export class CFGBuilder {
267267
return { entry: gotoNode, exit: null, gotos: [{ node: gotoNode, label: name }] }
268268
}
269269
private processLabeledStatement(labelSyntax: Parser.SyntaxNode): BasicBlock {
270+
let blockHandler = new BlockHandler();
270271
let name = this.getChildFieldText(labelSyntax, "label");
271272
let labelNode = this.addNode("LABEL", name);
272-
return { entry: labelNode, exit: labelNode, labels: new Map([[name, labelNode]]) }
273+
console.log("label", labelSyntax.namedChildCount);
274+
const { entry: labeledEntry, exit: labeledExit } = blockHandler.update(this.processBlock(labelSyntax.namedChildren[1]))
275+
if (labeledEntry) this.addEdge(labelNode, labeledEntry)
276+
return blockHandler.update({ entry: labelNode, exit: labeledExit, labels: new Map([[name, labelNode]]) });
273277
}
274278
private processContinueStatement(continueSyntax: Parser.SyntaxNode): BasicBlock {
275279
const continueNode = this.addNode("CONTINUE", "CONTINUE");
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func anotherLabelTest() {
2+
switch x {
3+
case 1:
4+
case 2:
5+
goto label
6+
case 3:
7+
case 4:
8+
}
9+
return
10+
11+
label:
12+
if x {
13+
f()
14+
} else {
15+
g()
16+
}
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
func labeledStatement() {
2+
label:
3+
if x {
4+
}
5+
}

0 commit comments

Comments
 (0)