-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathGenCCppD.fu
78 lines (72 loc) · 2.38 KB
/
GenCCppD.fu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// GenCCppD.fu - base for C/C++/D code generators
//
// Copyright (C) 2011-2023 Piotr Fusik
//
// This file is part of Fusion Transpiler,
// see https://github.com/fusionlanguage/fut
//
// Fusion Transpiler is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Fusion Transpiler is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Fusion Transpiler. If not, see http://www.gnu.org/licenses/
public abstract class GenCCppD : GenTyped
{
internal override void VisitLiteralLong!(long i)
{
if (i == long.MinValue)
Write("(-9223372036854775807 - 1)");
else
base.VisitLiteralLong(i);
}
static bool IsPtrTo(FuExpr ptr, FuExpr other) => ptr.Type is FuClassType klass && klass.Class.Id != FuId.StringClass && klass.IsAssignableFrom(other.Type);
protected override void WriteEqual!(FuExpr left, FuExpr right, FuPriority parent, bool not)
{
FuType coercedType;
if (IsPtrTo(left, right))
coercedType = left.Type;
else if (IsPtrTo(right, left))
coercedType = right.Type;
else {
base.WriteEqual(left, right, parent, not);
return;
}
if (parent > FuPriority.Equality)
WriteChar('(');
WriteCoerced(coercedType, left, FuPriority.Equality);
Write(GetEqOp(not));
WriteCoerced(coercedType, right, FuPriority.Equality);
if (parent > FuPriority.Equality)
WriteChar(')');
}
internal override void VisitConst!(FuConst statement)
{
if (statement.Type is FuArrayStorageType)
WriteConst(statement);
}
protected void WriteSwitchAsIfsWithGoto!(FuSwitch statement)
{
if (statement.Cases.Any(kase => FuSwitch.HasEarlyBreakAndContinue(kase.Body))
|| FuSwitch.HasEarlyBreakAndContinue(statement.DefaultBody)) {
int gotoId = this.SwitchesWithGoto.Count;
this.SwitchesWithGoto.Add(statement);
WriteSwitchAsIfs(statement, false);
Write("fuafterswitch");
VisitLiteralLong(gotoId);
WriteLine(": ;");
}
else
WriteSwitchAsIfs(statement, true);
}
protected override void WriteThrowNoMessage!()
{
Write("\"\"");
}
}