Skip to content

Commit b5e541b

Browse files
committed
saves/loads PSym guard, bitsize and alignment
1 parent c5a1f60 commit b5e541b

File tree

4 files changed

+48
-23
lines changed

4 files changed

+48
-23
lines changed

compiler/icnif/nifdecoder.nim

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -89,30 +89,18 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor): PSym =
8989
let itemId = pool.integers[n.intId].int32
9090
incExpect n, Ident
9191
let ident = c.graph.cache.getIdent(pool.strings[n.litId])
92-
incExpect n, ParLe
93-
let kind = parseSymKind(pool.tags[n.tagId])
94-
# TODO: add kind specific data
95-
inc n
96-
skipParRi n
97-
expect n, {Ident, DotToken}
92+
incExpect n, {Ident, DotToken}
9893
let flags = if n.kind == Ident: pool.strings[n.litId].parseSymFlags else: {}
99-
inc n
100-
var position = if kind == skModule:
101-
c.fromNifModuleId(n)[0].int
102-
else:
103-
expect n, IntLit
104-
let p = pool.integers[n.intId]
105-
inc n
106-
p
107-
expect n, IntLit
94+
incExpect n, IntLit
10895
let disamb = pool.integers[n.intId].int32
96+
incExpect n, ParLe
97+
let kind = parseSymKind(pool.tags[n.tagId])
10998
inc n
11099

111100
result = PSym(itemId: ItemId(module: itemIdModule.int32, item: itemId),
112101
kind: kind,
113102
name: ident,
114103
flags: flags,
115-
position: position,
116104
disamb: disamb)
117105

118106
# PNode, PSym or PType type fields in PSym can have cycles.
@@ -122,6 +110,25 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor): PSym =
122110
assert nifItemId notin c.symbols
123111
c.symbols[nifItemId] = result
124112

113+
case kind
114+
of skLet, skVar, skField, skForVar:
115+
result.guard = c.fromNifSymbol n
116+
expect n, IntLit
117+
result.bitsize = pool.integers[n.intId]
118+
incExpect n, IntLit
119+
result.alignment = pool.integers[n.intId]
120+
inc n
121+
else:
122+
discard
123+
skipParRi n
124+
result.position = if kind == skModule:
125+
c.fromNifModuleId(n)[0].int
126+
else:
127+
expect n, IntLit
128+
let p = pool.integers[n.intId]
129+
inc n
130+
p
131+
125132
result.typ = c.fromNifType n
126133
result.setOwner(c.fromNifSymbol n)
127134

compiler/icnif/nifencoder.nim

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,20 @@ proc toNifDef(c: var EncodeContext; sym: PSym) =
5252
c.toNifModuleId sym.itemId.module
5353
c.dest.addIntLit sym.itemId.item
5454
c.dest.addIdent sym.name.s
55-
c.dest.buildTree sym.kind.toNifTag:
56-
# TODO: add kind specific data
57-
discard
5855
c.dest.writeFlags sym.flags
56+
c.dest.addIntLit sym.disamb
57+
c.dest.buildTree sym.kind.toNifTag:
58+
case sym.kind
59+
of skLet, skVar, skField, skForVar:
60+
c.toNif sym.guard
61+
c.dest.addIntLit sym.bitsize
62+
c.dest.addIntLit sym.alignment
63+
else:
64+
discard
5965
if sym.kind == skModule:
6066
c.toNifModuleId sym.position
6167
else:
6268
c.dest.addIntLit sym.position
63-
c.dest.addIntLit sym.disamb
6469
c.toNif sym.typ
6570
c.toNif sym.owner
6671
c.dest.addIdent toNifTag(sym.loc.k)

tests/icnif/tencode_node2node.nim

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,20 @@ proc eql(x, y: PSym; c: var EqlContext): bool =
149149
debug(y.owner)
150150
result = false
151151
else:
152-
result = true
152+
if x.kind in {skLet, skVar, skField, skForVar}:
153+
if not eql(x.guard, y.guard, c):
154+
echo "symbol guard mismatch"
155+
result = false
156+
elif x.bitsize != y.bitsize:
157+
echo "symbol bitsize mismatch: ", x.bitsize, "/", y.bitsize
158+
result = false
159+
elif x.alignment != y.alignment:
160+
echo "symbol alignment mismatch: ", x.alignment, "/", y.alignment
161+
result = false
162+
else:
163+
result = true
164+
else:
165+
result = true
153166
discard c.symStack.pop
154167

155168
proc eql(x, y: PType; c: var EqlContext): bool =
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
#var exportcTest {.exportc.}: int
1+
var exportcTest {.exportc.}: int
22
var importcTest {.importc.}: int
3-
#var y* {.importc, header: "test.h".}: int
3+
var y* {.importc, header: "test.h".}: int

0 commit comments

Comments
 (0)