diff options
author | metagn <metagngn@gmail.com> | 2024-09-27 12:11:21 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-27 11:11:21 +0200 |
commit | dc3ffb6a71f36e3cfd1fc001d128a86b46c88e7a (patch) | |
tree | 29dd695e873bb786de7bdc2e4d3ea55a5722ec3d /compiler | |
parent | 56a3dd57fb038cab2d00f6415435e701d2273573 (diff) | |
download | Nim-dc3ffb6a71f36e3cfd1fc001d128a86b46c88e7a.tar.gz |
consider calling convention and iterator in getType for procs (#24181)
fixes #19010 `getType` for proc types generated an `nkProcTy` for iterator types instead of `nkIteratorTy`, and didn't generate a calling convention pragma unless it was in the proc AST. Iterator types now generate `nkIteratorTy`, and a calling convention pragma is added if the calling convention isn't `closure` or was explicitly provided.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/vmdeps.nim | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/vmdeps.nim b/compiler/vmdeps.nim index 5f9a2b5bc..294aaaa79 100644 --- a/compiler/vmdeps.nim +++ b/compiler/vmdeps.nim @@ -237,7 +237,7 @@ proc mapTypeToAstX(cache: IdentCache; t: PType; info: TLineInfo; of tySequence: result = mapTypeToBracket("seq", mSeq, t, info) of tyProc: if inst: - result = newNodeX(nkProcTy) + result = newNodeX(if tfIterator in t.flags: nkIteratorTy else: nkProcTy) var fp = newNodeX(nkFormalParams) if t.returnType == nil: fp.add newNodeI(nkEmpty, info) @@ -246,8 +246,15 @@ proc mapTypeToAstX(cache: IdentCache; t: PType; info: TLineInfo; for i in FirstParamAt..<t.kidsLen: fp.add newIdentDefs(t.n[i], t[i]) result.add fp - result.add if t.n[0].len > 0: t.n[0][pragmasEffects].copyTree - else: newNodeI(nkEmpty, info) + var prag = + if t.n[0].len > 0: + t.n[0][pragmasEffects].copyTree + else: + newNodeI(nkEmpty, info) + if t.callConv != ccClosure or tfExplicitCallConv in t.flags: + if prag.kind == nkEmpty: prag = newNodeI(nkPragma, info) + prag.add newIdentNode(getIdent(cache, $t.callConv), info) + result.add prag else: result = mapTypeToBracket("proc", mNone, t, info) of tyOpenArray: result = mapTypeToBracket("openArray", mOpenArray, t, info) |