Skip to content

Commit e69eb99

Browse files
authored
use cbuilder for typedefs, add array typedef (#24330)
The only remaining explicit use of `typedef` in the codegen (from my search) is in `addForwardStructFormat` which from what I understand won't do anything in NIFC.
1 parent 041098e commit e69eb99

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

compiler/cbuilderdecls.nim

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ template addTypedef(builder: var Builder, name: string, typeBody: typed) =
8989
builder.add(name)
9090
builder.add(";\n")
9191

92+
template addArrayTypedef(builder: var Builder, name: string, len: int, typeBody: typed) =
93+
## adds an array typedef declaration to the builder with name `name`,
94+
## length `len`, and element type as built in `typeBody`
95+
builder.add("typedef ")
96+
typeBody
97+
builder.add(" ")
98+
builder.add(name)
99+
builder.add("[")
100+
builder.addInt(len)
101+
builder.add("];\n")
102+
92103
type
93104
StructInitializerKind = enum
94105
siOrderedStruct ## struct constructor, but without named fields on C

compiler/cbuilderexprs.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# XXX make complex ones like bitOr use builder instead
2+
# XXX add stuff like NI, NIM_NIL as constants
23

34
proc ptrType(t: Snippet): Snippet =
45
t & "*"

compiler/ccgtypes.nim

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ proc getTypePre(m: BModule; typ: PType; sig: SigHash): Rope =
373373
if result == "": result = cacheGetType(m.typeCache, sig)
374374

375375
proc addForwardStructFormat(m: BModule; structOrUnion: Rope, typename: Rope) =
376+
# XXX should be no-op in NIFC
376377
if m.compileToCpp:
377378
m.s[cfsForwardTypes].addf "$1 $2;$n", [structOrUnion, typename]
378379
else:
@@ -923,17 +924,28 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
923924
(sfImportc in t.sym.flags and t.sym.magic == mNone)):
924925
m.typeCache[sig] = result
925926
var size: int
927+
var typedef = newBuilder("")
926928
if firstOrd(m.config, t) < 0:
927-
m.s[cfsTypes].addf("typedef NI32 $1;$n", [result])
929+
typedef.addTypedef(name = result):
930+
typedef.add("NI32")
928931
size = 4
929932
else:
930933
size = int(getSize(m.config, t))
931934
case size
932-
of 1: m.s[cfsTypes].addf("typedef NU8 $1;$n", [result])
933-
of 2: m.s[cfsTypes].addf("typedef NU16 $1;$n", [result])
934-
of 4: m.s[cfsTypes].addf("typedef NI32 $1;$n", [result])
935-
of 8: m.s[cfsTypes].addf("typedef NI64 $1;$n", [result])
935+
of 1:
936+
typedef.addTypedef(name = result):
937+
typedef.add("NU8")
938+
of 2:
939+
typedef.addTypedef(name = result):
940+
typedef.add("NU16")
941+
of 4:
942+
typedef.addTypedef(name = result):
943+
typedef.add("NI32")
944+
of 8:
945+
typedef.addTypedef(name = result):
946+
typedef.add("NI64")
936947
else: internalError(m.config, t.sym.info, "getTypeDescAux: enum")
948+
m.s[cfsTypes].add(typedef)
937949
when false:
938950
let owner = hashOwner(t.sym)
939951
if not gDebugInfo.hasEnum(t.sym.name.s, t.sym.info.line, owner):
@@ -993,16 +1005,21 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
9931005
m.typeCache[sig] = result
9941006
if not isImportedType(t):
9951007
let foo = getTypeDescAux(m, t.elementType, check, kind)
996-
m.s[cfsTypes].addf("typedef $1 $2[1];$n", [foo, result])
1008+
var typedef = newBuilder("")
1009+
typedef.addArrayTypedef(name = result, len = 1):
1010+
typedef.add(foo)
1011+
m.s[cfsTypes].add(typedef)
9971012
of tyArray:
9981013
var n: BiggestInt = toInt64(lengthOrd(m.config, t))
9991014
if n <= 0: n = 1 # make an array of at least one element
10001015
result = getTypeName(m, origTyp, sig)
10011016
m.typeCache[sig] = result
10021017
if not isImportedType(t):
10031018
let e = getTypeDescAux(m, t.elementType, check, kind)
1004-
m.s[cfsTypes].addf("typedef $1 $2[$3];$n",
1005-
[e, result, rope(n)])
1019+
var typedef = newBuilder("")
1020+
typedef.addArrayTypedef(name = result, len = n):
1021+
typedef.add(e)
1022+
m.s[cfsTypes].add(typedef)
10061023
of tyObject, tyTuple:
10071024
let tt = origTyp.skipTypes({tyDistinct})
10081025
if isImportedCppType(t) and tt.kind == tyGenericInst:
@@ -1048,7 +1065,8 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
10481065
# with the C macros for defining procs such as N_NIMCALL. We must
10491066
# create a typedef for the type and use it in the proc signature:
10501067
let typedefName = "TY" & $sig
1051-
m.s[cfsTypes].addf("typedef $1 $2;$n", [result, typedefName])
1068+
m.s[cfsTypes].addTypedef(name = typedefName):
1069+
m.s[cfsTypes].add(result)
10521070
m.typeCache[sig] = typedefName
10531071
result = typedefName
10541072
else:
@@ -1076,9 +1094,12 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
10761094
if not isImportedType(t):
10771095
let s = int(getSize(m.config, t))
10781096
case s
1079-
of 1, 2, 4, 8: m.s[cfsTypes].addf("typedef NU$2 $1;$n", [result, rope(s*8)])
1080-
else: m.s[cfsTypes].addf("typedef NU8 $1[$2];$n",
1081-
[result, rope(getSize(m.config, t))])
1097+
of 1, 2, 4, 8:
1098+
m.s[cfsTypes].addTypedef(name = result):
1099+
m.s[cfsTypes].add("NU" & rope(s*8))
1100+
else:
1101+
m.s[cfsTypes].addArrayTypedef(name = result, len = s):
1102+
m.s[cfsTypes].add("NU8")
10821103
of tyGenericInst, tyDistinct, tyOrdinal, tyTypeDesc, tyAlias, tySink, tyOwned,
10831104
tyUserTypeClass, tyUserTypeClassInst, tyInferred:
10841105
result = getTypeDescAux(m, skipModifier(t), check, kind)

0 commit comments

Comments
 (0)