Skip to content

Commit 219061f

Browse files
committed
Feature(compiler): BreakStatement - initial support
1 parent b2a7d51 commit 219061f

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
import * as ts from "typescript";
3+
import * as llvm from 'llvm-node';
4+
import {NodeGenerateInterface} from "../node-generate.interface";
5+
import {Context} from "../context";
6+
import UnsupportedError from "../../error/unsupported.error";
7+
8+
export class BreakStatementGenerator implements NodeGenerateInterface<ts.BreakStatement, void> {
9+
generate(node: ts.BreakStatement, ctx: Context, builder: llvm.IRBuilder): void {
10+
if (node.label) {
11+
throw new UnsupportedError(
12+
node,
13+
'Break with label is unsupported'
14+
);
15+
}
16+
17+
if (!ctx.scope.breakBlock) {
18+
throw new UnsupportedError(
19+
node,
20+
'There is no pointer to jump outside this block to break'
21+
);
22+
}
23+
24+
builder.createBr(ctx.scope.breakBlock);
25+
}
26+
}

src/backend/llvm/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {ReturnStatementCodeGenerator} from "./code-generation/return-statement";
1515
import {ForStatementGenerator} from "./code-generation/for-statement";
1616
import {DoStatementGenerator} from "./code-generation/do-statement";
1717
import {WhileStatementGenerator} from "./code-generation/while-statement";
18+
import {BreakStatementGenerator} from "./code-generation/break-statement";
1819

1920
export function passIfStatement(parent: ts.IfStatement, ctx: Context, builder: llvm.IRBuilder) {
2021
const positiveBlock = llvm.BasicBlock.create(ctx.llvmContext, "if.true");
@@ -493,6 +494,9 @@ export function passStatement(stmt: ts.Statement, ctx: Context, builder: llvm.IR
493494
case ts.SyntaxKind.ReturnStatement:
494495
new ReturnStatementCodeGenerator().generate(<any>stmt, ctx, builder);
495496
break;
497+
case ts.SyntaxKind.BreakStatement:
498+
new BreakStatementGenerator().generate(<any>stmt, ctx, builder);
499+
break;
496500
case ts.SyntaxKind.IfStatement:
497501
passIfStatement(<any>stmt, ctx, builder);
498502
break;

0 commit comments

Comments
 (0)