Skip to content

Commit 5a702b7

Browse files
committed
encodes and decodes Node flags
1 parent 55649a2 commit 5a702b7

File tree

4 files changed

+40
-22
lines changed

4 files changed

+40
-22
lines changed

compiler/icnif/nifdecoder.nim

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,19 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor; kind: TNodeKind): PNode
100100

101101
include nifdecodertypes
102102

103+
proc fromNifNodeFlags(n: var Cursor): set[TNodeFlag] =
104+
result = {}
105+
if n.kind == ParLe and pool.tags[n.tag] == "nf":
106+
inc n
107+
assert n.kind == Ident
108+
result = parseNodeFlags(pool.strings[n.litId])
109+
inc n
110+
expect n, ParRi
111+
103112
proc fromNifLocal(c: var DecodeContext; n: var Cursor; kind: TNodeKind): PNode =
104113
result = newNodeI(kind, unknownLineInfo, 1)
105114
inc n
115+
result.flags = fromNifNodeFlags(n)
106116
assert n.nodeKind == nkIdentDefs
107117
result[0] = newNodeI(nkIdentDefs, unknownLineInfo, 3)
108118
inc n
@@ -259,6 +269,7 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode =
259269
of nkPostfix, nkTypeSection, nkStmtList:
260270
result = newNode(kind)
261271
inc n
272+
result.flags = fromNifNodeFlags(n)
262273
while n.kind != ParRi:
263274
result.add fromNif(c, n)
264275
inc n

compiler/icnif/nifencoder.nim

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ proc addFloatLit(b: var Builder; f: float; suffix: string) =
2929
addFloatLit(b, f)
3030
addStrLit(b, suffix)
3131

32+
proc writeFlags[E](b: var Builder; flags: set[E]; tag: string) =
33+
var flagsAsIdent = ""
34+
genFlags(flags, flagsAsIdent)
35+
if flagsAsIdent.len > 0:
36+
b.withTree tag:
37+
b.addIdent flagsAsIdent
38+
3239
proc toNif(c: var EncodeContext; n: PNode)
3340
proc toNif(c: var EncodeContext; t: PType; isTypeSection = false)
3441

@@ -79,6 +86,15 @@ proc symdefToNif(c: var EncodeContext; n: PNode) =
7986

8087
include nifencodertypes
8188

89+
proc writeNodeFlags(b: var Builder; flags: set[TNodeFlag]) {.inline.} =
90+
writeFlags b, flags, "nf"
91+
92+
template withNode(b: var Builder; n: PNode; body: untyped) =
93+
addTree b, toNifTag(n.kind)
94+
writeNodeFlags(b, n.flags)
95+
body
96+
endTree b
97+
8298
proc toNifTypeSection(c: var EncodeContext; n: PNode) =
8399
assert n.len == 3
84100

@@ -187,26 +203,24 @@ proc toNif(c: var EncodeContext; n: PNode) =
187203
of nkTripleStrLit:
188204
c.b.addStrLit n.strVal, "T"
189205
of nkIdentDefs:
190-
c.b.addTree toNifTag(n.kind)
191-
assert n.len == 3
192-
symdefToNif(c, n[0])
193-
if n[1].kind == nkSym:
194-
symToNif c, n[1].sym
195-
else:
196-
assert n[0].kind == nkSym
197-
toNif c, n[0].sym.typ
198-
toNif c, n[2]
199-
c.b.endTree()
206+
c.b.withNode n:
207+
assert n.len == 3
208+
symdefToNif(c, n[0])
209+
if n[1].kind == nkSym:
210+
symToNif c, n[1].sym
211+
else:
212+
assert n[0].kind == nkSym
213+
toNif c, n[0].sym.typ
214+
toNif c, n[2]
200215
of nkTypeDef:
201216
toNifTypeSection(c, n)
202217
of nkImportStmt:
203218
toNifImport(c, n)
204219
else:
205220
assert n.len > 0, $n.kind
206-
c.b.addTree toNifTag(n.kind)
207-
for i in 0 ..< n.len:
208-
toNif c, n[i]
209-
c.b.endTree()
221+
c.b.withNode(n):
222+
for i in 0 ..< n.len:
223+
toNif c, n[i]
210224

211225
proc saveNif(c: var EncodeContext; n: PNode) =
212226
c.b.addHeader "nim2", "nim2-ic-nif"

compiler/icnif/nifencodertypes.nim

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
# included from nifencoder
22

3-
proc writeFlags[E](b: var Builder; flags: set[E]; tag: string) =
4-
var flagsAsIdent = ""
5-
genFlags(flags, flagsAsIdent)
6-
if flagsAsIdent.len > 0:
7-
b.withTree tag:
8-
b.addIdent flagsAsIdent
9-
103
proc writeTypeFlags(c: var EncodeContext; t: PType) =
114
writeFlags c.b, t.flags, "tf"
125

tests/icnif/tencode_node2node.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ proc eql(x, y: PNode): bool =
105105
result = true
106106
elif x == nil or y == nil:
107107
result = false
108-
elif x.kind == y.kind and x.safeLen == y.safeLen:
108+
elif x.kind == y.kind and x.safeLen == y.safeLen and x.flags == y.flags:
109109
case x.kind:
110110
of nkSym:
111111
result = eql(x.sym, y.sym)

0 commit comments

Comments
 (0)