@@ -373,6 +373,7 @@ proc getTypePre(m: BModule; typ: PType; sig: SigHash): Rope =
373373 if result == " " : result = cacheGetType (m.typeCache, sig)
374374
375375proc 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