From 371f50f66d7cfcacb52c341357547ca48c05dcf7 Mon Sep 17 00:00:00 2001 From: metagn Date: Fri, 15 Nov 2024 19:53:14 +0300 Subject: [PATCH] use template instead of raw C prefixes in genTypeInfo (#24439) --- compiler/cbuilderexprs.nim | 2 +- compiler/ccgtypes.nim | 30 +++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/compiler/cbuilderexprs.nim b/compiler/cbuilderexprs.nim index 8a85310cb9..da0fba132e 100644 --- a/compiler/cbuilderexprs.nim +++ b/compiler/cbuilderexprs.nim @@ -70,7 +70,7 @@ template addCast(builder: var Builder, typ: Snippet, valueBody: typed) = builder.add ")" proc cAddr(value: Snippet): Snippet = - "&" & value + "(&" & value & ")" proc cLabelAddr(value: TLabel): Snippet = "&&" & value diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 1828057654..3842e60bbb 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -1853,12 +1853,16 @@ proc genTypeInfoV2(m: BModule; t: PType; info: TLineInfo): Rope = # distinct types can have their own destructors var t = skipTypes(origType, irrelevantForBackend + tyUserTypeClasses - {tyDistinct}) - let prefixTI = if m.hcrOn: "(" else: "(&" + template prefixTI(x: Snippet): Snippet = + if m.hcrOn: + wrapPar(x) + else: + cAddr(x) let sig = hashType(origType, m.config) result = m.typeInfoMarkerV2.getOrDefault(sig) if result != "": - return prefixTI.rope & result & ")".rope + return prefixTI(result) let marker = m.g.typeInfoMarkerV2.getOrDefault(sig) if marker.str != "": @@ -1866,7 +1870,7 @@ proc genTypeInfoV2(m: BModule; t: PType; info: TLineInfo): Rope = declareNimType(m, "TNimTypeV2", marker.str, marker.owner) # also store in local type section: m.typeInfoMarkerV2[sig] = marker.str - return prefixTI.rope & marker.str & ")".rope + return prefixTI(marker.str) result = "NTIv2$1_" % [rope($sig)] m.typeInfoMarkerV2[sig] = result @@ -1878,14 +1882,14 @@ proc genTypeInfoV2(m: BModule; t: PType; info: TLineInfo): Rope = # reference the type info as extern here cgsym(m, "TNimTypeV2") declareNimType(m, "TNimTypeV2", result, owner) - return prefixTI.rope & result & ")".rope + return prefixTI(result) m.g.typeInfoMarkerV2[sig] = (str: result, owner: owner) if m.compileToCpp or m.hcrOn: genTypeInfoV2OldImpl(m, t, origType, result, info) else: genTypeInfoV2Impl(m, t, origType, result, info) - result = prefixTI.rope & result & ")".rope + result = prefixTI(result) proc openArrayToTuple(m: BModule; t: PType): PType = result = newType(tyTuple, m.idgen, t.owner) @@ -1926,12 +1930,16 @@ proc genTypeInfoV1(m: BModule; t: PType; info: TLineInfo): Rope = let origType = t var t = skipTypes(origType, irrelevantForBackend + tyUserTypeClasses) - let prefixTI = if m.hcrOn: "(" else: "(&" + template prefixTI(x: Snippet): Snippet = + if m.hcrOn: + wrapPar(x) + else: + cAddr(x) let sig = hashType(origType, m.config) result = m.typeInfoMarker.getOrDefault(sig) if result != "": - return prefixTI.rope & result & ")".rope + return prefixTI(result) let marker = m.g.typeInfoMarker.getOrDefault(sig) if marker.str != "": @@ -1940,7 +1948,7 @@ proc genTypeInfoV1(m: BModule; t: PType; info: TLineInfo): Rope = declareNimType(m, "TNimType", marker.str, marker.owner) # also store in local type section: m.typeInfoMarker[sig] = marker.str - return prefixTI.rope & marker.str & ")".rope + return prefixTI(marker.str) result = "NTI$1$2_" % [rope(typeToC(t)), rope($sig)] m.typeInfoMarker[sig] = result @@ -1950,7 +1958,7 @@ proc genTypeInfoV1(m: BModule; t: PType; info: TLineInfo): Rope = cgsym(m, "TNimType") cgsym(m, "TNimNode") declareNimType(m, "TNimType", result, old.int) - return prefixTI.rope & result & ")".rope + return prefixTI(result) var owner = t.skipTypes(typedescPtrs).itemId.module if owner != m.module.position and moduleOpenForCodegen(m.g.graph, FileIndex owner): @@ -1960,7 +1968,7 @@ proc genTypeInfoV1(m: BModule; t: PType; info: TLineInfo): Rope = cgsym(m, "TNimType") cgsym(m, "TNimNode") declareNimType(m, "TNimType", result, owner) - return prefixTI.rope & result & ")".rope + return prefixTI(result) else: owner = m.module.position.int32 @@ -2021,7 +2029,7 @@ proc genTypeInfoV1(m: BModule; t: PType; info: TLineInfo): Rope = m.s[cfsTypeInit3].addDerefFieldAssignment(v2info, "typeInfoV1", cCast("void*", cAddr(result))) m.s[cfsTypeInit3].addFieldAssignment(result, "typeInfoV2", cCast("void*", v2info)) - result = prefixTI.rope & result & ")".rope + result = prefixTI(result) proc genTypeInfo*(config: ConfigRef, m: BModule; t: PType; info: TLineInfo): Rope = if optTinyRtti in config.globalOptions: