Skip to content

Commit

Permalink
test using temp for cIfExpr for payloads, some forgotten cbuilder cha…
Browse files Browse the repository at this point in the history
…nges
  • Loading branch information
metagn committed Nov 25, 2024
1 parent 683755b commit bfdf33d
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 31 deletions.
42 changes: 34 additions & 8 deletions compiler/ccgcalls.nim
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,13 @@ proc genOpenArraySlice(p: BProc; q: PNode; formalType, destType: PType; prepareF
val = cDeref(ra)
else:
val = ra
var data = getTempName(p.module)
p.s(cpsLocals).addVar(Local, name = data, typ = ptrType(dest), initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, val), NimNil)):
p.s(cpsStmts).addAssignment(data, cCast(ptrType(dest),
cOp(Add, NimInt, dataField(p, val), rb)))
result = (
cIfExpr(dataFieldAccessor(p, val),
cCast(ptrType(dest), cOp(Add, NimInt, dataField(p, val), rb)),
NimNil),
data,
lengthExpr)
else:
result = ("", "")
Expand All @@ -268,7 +271,8 @@ proc openArrayLoc(p: BProc, formalType: PType, n: PNode; result: var Builder) =
result.add(y)
else:
var a = initLocExpr(p, if n.kind == nkHiddenStdConv: n[1] else: n)
case skipTypes(a.t, abstractVar+{tyStatic}).kind
let et = skipTypes(a.t, abstractVar+{tyStatic})
case et.kind
of tyOpenArray, tyVarargs:
let ra = rdLoc(a)
if reifiedOpenArray(n):
Expand All @@ -295,13 +299,27 @@ proc openArrayLoc(p: BProc, formalType: PType, n: PNode; result: var Builder) =
let ra = a.rdLoc
var t = TLoc(snippet: cDeref(ra))
let lt = lenExpr(p, t)
result.add(cIfExpr(dataFieldAccessor(p, t.snippet), dataField(p, t.snippet), NimNil))
var data = getTempName(p.module)
let payloadTyp =
if et.kind == tyString: ptrType(NimChar)
else: getSeqDataPtrType(p.module, et)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, t.snippet), NimNil)):
p.s(cpsStmts).addAssignment(data, dataField(p, t.snippet))
result.add(data)
result.addArgumentSeparator()
result.add(lt)
else:
let ra = a.rdLoc
let la = lenExpr(p, a)
result.add(cIfExpr(dataFieldAccessor(p, ra), dataField(p, ra), NimNil))
var data = getTempName(p.module)
let payloadTyp =
if et.kind == tyString: ptrType(NimChar)
else: getSeqDataPtrType(p.module, et)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, ra), NimNil)):
p.s(cpsStmts).addAssignment(data, dataField(p, ra))
result.add(data)
result.addArgumentSeparator()
result.add(la)
of tyArray:
Expand All @@ -310,12 +328,20 @@ proc openArrayLoc(p: BProc, formalType: PType, n: PNode; result: var Builder) =
result.addArgumentSeparator()
result.addIntValue(lengthOrd(p.config, a.t))
of tyPtr, tyRef:
case elementType(a.t).kind
let et = elementType(a.t)
case et.kind
of tyString, tySequence:
let ra = a.rdLoc
var t = TLoc(snippet: cDeref(ra))
let lt = lenExpr(p, t)
result.add(cIfExpr(dataFieldAccessor(p, t.snippet), dataField(p, t.snippet), NimNil))
var data = getTempName(p.module)
let payloadTyp =
if et.kind == tyString: ptrType(NimChar)
else: getSeqDataPtrType(p.module, et)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, t.snippet), NimNil)):
p.s(cpsStmts).addAssignment(data, dataField(p, t.snippet))
result.add(data)
result.addArgumentSeparator()
result.add(lt)
of tyArray:
Expand Down
37 changes: 29 additions & 8 deletions compiler/ccgexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ proc genOpenArrayConv(p: BProc; d: TLoc; a: TLoc; flags: TAssignmentFlags) =
assert d.k != locNone
# getTemp(p, d.t, d)

case a.t.skipTypes(abstractVar).kind
let et = a.t.skipTypes(abstractVar)
case et.kind
of tyOpenArray, tyVarargs:
if reifiedOpenArray(a.lode):
if needTempForOpenArray in flags:
Expand All @@ -303,8 +304,12 @@ proc genOpenArrayConv(p: BProc; d: TLoc; a: TLoc; flags: TAssignmentFlags) =
let rd = d.rdLoc
let ra = a.rdLoc
let la = lenExpr(p, a)
p.s(cpsStmts).addFieldAssignment(rd, "Field0",
cIfExpr(dataFieldAccessor(p, ra), dataField(p, ra), NimNil))
var data = getTempName(p.module)
let payloadTyp = getSeqDataPtrType(p.module, et)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, ra), NimNil)):
p.s(cpsStmts).addAssignment(data, dataField(p, ra))
p.s(cpsStmts).addFieldAssignment(rd, "Field0", data)
p.s(cpsStmts).addFieldAssignment(rd, "Field1", la)
of tyArray:
let rd = d.rdLoc
Expand All @@ -321,8 +326,11 @@ proc genOpenArrayConv(p: BProc; d: TLoc; a: TLoc; flags: TAssignmentFlags) =

let rd = d.rdLoc
let ra = a.rdLoc
p.s(cpsStmts).addFieldAssignment(rd, "Field0",
cIfExpr(dataFieldAccessor(p, ra), dataField(p, ra), NimNil))
var data = getTempName(p.module)
p.s(cpsLocals).addVar(Local, name = data, typ = ptrType(NimChar), initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, ra), NimNil)):
p.s(cpsStmts).addAssignment(data, dataFieldAccessor(p, ra))
p.s(cpsStmts).addFieldAssignment(rd, "Field0", data)
let la = lenExpr(p, a)
p.s(cpsStmts).addFieldAssignment(rd, "Field1", la)
else:
Expand Down Expand Up @@ -2056,15 +2064,23 @@ proc genRepr(p: BProc, e: PNode, d: var TLoc) =
putIntoDest(p, d, e, cgCall("reprSet", raa, rti), a.storage)
of tyOpenArray, tyVarargs:
var b: TLoc = default(TLoc)
case skipTypes(a.t, abstractVarRange).kind
let et = skipTypes(a.t, abstractVarRange)
case et.kind
of tyOpenArray, tyVarargs:
let ra = rdLoc(a)
putIntoDest(p, b, e, ra & cArgumentSeparator & ra & "Len_0", a.storage)
of tyString, tySequence:
let ra = rdLoc(a)
let la = lenExpr(p, a)
var data = getTempName(p.module)
let payloadTyp =
if et.kind == tyString: ptrType(NimChar)
else: getSeqDataPtrType(p.module, et)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, dataFieldAccessor(p, ra), NimNil)):
p.s(cpsStmts).addAssignment(data, dataField(p, ra))
putIntoDest(p, b, e,
cIfExpr(dataFieldAccessor(p, ra), dataField(p, ra), NimNil) &
data &
cArgumentSeparator & la,
a.storage)
of tyArray:
Expand Down Expand Up @@ -2218,7 +2234,12 @@ proc genSetLengthSeq(p: BProc, e: PNode, d: var TLoc) =
let rti = genTypeInfoV1(p.module, t.skipTypes(abstractInst), e.info)
var pExpr: Snippet
if not p.module.compileToCpp:
pExpr = cIfExpr(ra, cAddr(derefField(ra, "Sup")), NimNil)
var data = getTempName(p.module)
let payloadTyp = getSeqDataPtrType(p.module, t)
p.s(cpsLocals).addVar(Local, name = data, typ = payloadTyp, initializer = NimNil)
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, ra, NimNil)):
p.s(cpsStmts).addAssignment(data, cAddr(derefField(ra, "Sup")))
pExpr = data
else:
pExpr = ra
call.snippet = cCast(rt, cgCall(p, "setLengthSeqV2", pExpr, rti, rb))
Expand Down
42 changes: 28 additions & 14 deletions compiler/ccgtypes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -376,9 +376,13 @@ proc addForwardStructFormat(m: BModule; structOrUnion: Rope, typename: Rope) =
else:
m.s[cfsForwardTypes].addf "typedef $1 $2 $2;$n", [structOrUnion, typename]

proc seqStar(m: BModule): string =
if optSeqDestructors in m.config.globalOptions: result = ""
else: result = "*"
proc seqStar(m: BModule): bool {.inline.} =
if optSeqDestructors in m.config.globalOptions: result = false
else: result = true

proc wrapSeqStar(m: BModule, t: Snippet): Snippet {.inline.} =
if seqStar(m): result = ptrType(t)
else: result = t

proc getTypeForward(m: BModule; typ: PType; sig: SigHash): Rope =
result = cacheGetType(m.forwTypeCache, sig)
Expand Down Expand Up @@ -432,7 +436,7 @@ proc getTypeDescWeak(m: BModule; t: PType; check: var IntSet; kind: TypeDescKind
m.s[cfsTypes].addField(name = "p", typ = ptrType(result & "_Content"))
pushType(m, t)
else:
result = getTypeForward(m, t, sig) & seqStar(m)
result = wrapSeqStar(m, getTypeForward(m, t, sig))
pushType(m, t)
else:
result = getTypeDescAux(m, t, check, kind)
Expand All @@ -442,6 +446,10 @@ proc getSeqPayloadType(m: BModule; t: PType): Rope =
result = getTypeDescWeak(m, t, check, dkParam) & "_Content"
#result = getTypeForward(m, t, hashType(t)) & "_Content"

proc getSeqDataPtrType(m: BModule; t: PType): Rope =
var check = initIntSet()
result = ptrType(getTypeDescWeak(m, t.elementType, check, dkParam))

proc seqV2ContentType(m: BModule; t: PType; check: var IntSet) =
let sig = hashType(t, m.config)
let result = cacheGetType(m.typeCache, sig)
Expand Down Expand Up @@ -840,7 +848,7 @@ proc resolveStarsInCppType(typ: PType, idx, stars: int): PType =
proc getOpenArrayDesc(m: BModule; t: PType, check: var IntSet; kind: TypeDescKind): Rope =
let sig = hashType(t, m.config)
if kind == dkParam:
result = getTypeDescWeak(m, t.elementType, check, kind) & "*"
result = ptrType(getTypeDescWeak(m, t.elementType, check, kind))
else:
result = cacheGetType(m.typeCache, sig)
if result == "":
Expand Down Expand Up @@ -878,8 +886,14 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
return
case t.kind
of tyRef, tyPtr, tyVar, tyLent:
type StarKind = enum Ptr, CppRef
var star = if t.kind in {tyVar} and tfVarIsPtr notin origTyp.flags and
compileToCpp(m): "&" else: "*"
compileToCpp(m): CppRef else: Ptr
template wrapStar(t: Snippet): Snippet =
let tt = t
case star
of Ptr: ptrType(tt)
of CppRef: cppRefType(tt)
var et = origTyp.skipTypes(abstractInst).elementType
var etB = et.skipTypes(abstractInst)
if mapType(m.config, t, kind == dkParam) == ctPtrToArray and (etB.kind != tyOpenArray or kind == dkParam):
Expand All @@ -888,29 +902,29 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
else:
et = elemType(etB)
etB = et.skipTypes(abstractInst)
star[0] = '*'
star = Ptr
case etB.kind
of tyObject, tyTuple:
if isImportedCppType(etB) and et.kind == tyGenericInst:
result = getTypeDescAux(m, et, check, kind) & star
result = wrapStar(getTypeDescAux(m, et, check, kind))
else:
# no restriction! We have a forward declaration for structs
let name = getTypeForward(m, et, hashType(et, m.config))
result = name & star
result = wrapStar(name)
m.typeCache[sig] = result
of tySequence:
if optSeqDestructors in m.config.globalOptions:
result = getTypeDescWeak(m, et, check, kind) & star
result = wrapStar(getTypeDescWeak(m, et, check, kind))
m.typeCache[sig] = result
else:
# no restriction! We have a forward declaration for structs
let name = getTypeForward(m, et, hashType(et, m.config))
result = name & seqStar(m) & star
result = wrapStar(wrapSeqStar(m, name))
m.typeCache[sig] = result
pushType(m, et)
else:
# else we have a strong dependency :-(
result = getTypeDescAux(m, et, check, kind) & star
result = wrapStar(getTypeDescAux(m, et, check, kind))
m.typeCache[sig] = result
of tyOpenArray, tyVarargs:
result = getOpenArrayDesc(m, t, check, kind)
Expand Down Expand Up @@ -975,7 +989,7 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
addForwardStructFormat(m, structOrUnion(t), result)
m.forwTypeCache[sig] = result
assert(cacheGetType(m.typeCache, sig) == "")
m.typeCache[sig] = result & seqStar(m)
m.typeCache[sig] = wrapSeqStar(m, result)
if not isImportedType(t):
if skipTypes(t.elementType, typedescInst).kind != tyEmpty:
let et = getTypeDescAux(m, t.elementType, check, kind)
Expand All @@ -987,7 +1001,7 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes
isFlexArray = true)
else:
result = rope("TGenericSeq")
result.add(seqStar(m))
result = wrapSeqStar(m, result)
of tyUncheckedArray:
result = getTypeName(m, origTyp, sig)
m.typeCache[sig] = result
Expand Down
6 changes: 5 additions & 1 deletion compiler/cgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,11 @@ proc lenExpr(p: BProc; a: TLoc): Rope =
result = dotField(rdLoc(a), "len")
else:
let ra = rdLoc(a)
result = cIfExpr(ra, lenField(p, ra), cIntValue(0))
let len = getTempName(p.module)
p.s(cpsLocals).addVar(name = len, typ = NimInt, initializer = cIntValue(0))
p.s(cpsStmts).addSingleIfStmt(cOp(NotEqual, ra, NimNil)):
p.s(cpsStmts).addAssignment(len, lenField(p, ra))
result = len

proc dataFieldAccessor(p: BProc, sym: Rope): Rope =
if optSeqDestructors in p.config.globalOptions:
Expand Down

0 comments on commit bfdf33d

Please sign in to comment.