Skip to content

Commit 42c4e90

Browse files
committed
Feature(compiler): PrefixUnaryExpressionCodeGenerator - initial
1 parent c00912d commit 42c4e90

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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 {Value} from "../value";
7+
import UnsupportedError from "../../error";
8+
import {buildFromExpression, loadIfNeeded} from "../index";
9+
10+
export class PrefixUnaryExpressionCodeGenerator implements NodeGenerateInterface<ts.PrefixUnaryExpression, Value> {
11+
generate(node: ts.PrefixUnaryExpression, ctx: Context, builder: llvm.IRBuilder): Value {
12+
switch (node.operator) {
13+
case ts.SyntaxKind.PlusPlusToken: {
14+
const left = buildFromExpression(node.operand, ctx, builder);
15+
16+
const next = builder.createFAdd(
17+
loadIfNeeded(left, builder),
18+
llvm.ConstantFP.get(ctx.llvmContext, 1)
19+
);
20+
21+
builder.createStore(
22+
next,
23+
left.getValue(),
24+
false
25+
);
26+
27+
return left;
28+
}
29+
case ts.SyntaxKind.MinusMinusToken: {
30+
const left = buildFromExpression(node.operand, ctx, builder);
31+
32+
const next = builder.createFSub(
33+
loadIfNeeded(left, builder),
34+
llvm.ConstantFP.get(ctx.llvmContext, 1)
35+
);
36+
37+
builder.createStore(
38+
next,
39+
left.getValue(),
40+
false
41+
);
42+
43+
return left;
44+
}
45+
default:
46+
throw new UnsupportedError(
47+
node,
48+
`Unsupported PostfixUnaryExpression.operator: "${node.operator}"`
49+
);
50+
}
51+
}
52+
}

src/backend/llvm/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {TryStatementGenerator} from "./code-generation/try-statement";
3636
import {PostfixUnaryExpressionCodeGenerator} from "./code-generation/postfix-unary-expression";
3737
import {FunctionDeclarationCodeGenerator} from "./code-generation/function-declaration";
3838
import {TypeOfExpressionCodeGenerator} from "./code-generation/typeof-expression";
39+
import {PrefixUnaryExpressionCodeGenerator} from "./code-generation/prefix-unary-expression";
3940

4041
export function emitCondition(
4142
condition: ts.Expression,
@@ -304,6 +305,8 @@ export function buildFromExpression(block: ts.Expression, ctx: Context, builder:
304305
return buildFromFalseKeyword(<any>block, ctx, builder);
305306
case ts.SyntaxKind.BinaryExpression:
306307
return new BinaryExpressionCodeGenerator().generate(<any>block, ctx, builder);
308+
case ts.SyntaxKind.PrefixUnaryExpression:
309+
return new PrefixUnaryExpressionCodeGenerator().generate(block as ts.PrefixUnaryExpression, ctx, builder);
307310
case ts.SyntaxKind.PostfixUnaryExpression:
308311
return new PostfixUnaryExpressionCodeGenerator().generate(block as ts.PostfixUnaryExpression, ctx, builder);
309312
case ts.SyntaxKind.CallExpression:

0 commit comments

Comments
 (0)