Skip to content

Commit e9ef795

Browse files
committed
encodes/decodes symbol's owner
1 parent 0b0c7b4 commit e9ef795

File tree

3 files changed

+74
-40
lines changed

3 files changed

+74
-40
lines changed

compiler/icnif/nifdecoder.nim

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import std / [assertions, tables, parseutils]
2-
import "../../dist/nimony/src/lib" / [bitabs, nifreader, nifstreams, nifcursors, symparser]
3-
import ".." / [ast, astalgo, idents, lineinfos, options, modulegraphs, msgs, pathutils]
2+
import "../../dist/nimony/src/lib" / [bitabs, nifreader, nifstreams, nifcursors]
3+
import ".." / [ast, astalgo, idents, lineinfos, options, modules, modulegraphs, msgs, pathutils]
4+
import "../../dist/nimony/src/gear2" / modnames
45
import enum2nif
56

67
type
@@ -47,6 +48,10 @@ proc splitNifSym(s: string): SplittedNifSym =
4748

4849
proc fromNif(c: var DecodeContext; n: var Cursor): PNode
4950

51+
proc fromNifSymbol(c: var DecodeContext; n: var Cursor): PSym =
52+
result = c.nifSymToPSym[pool.syms[n.symId]]
53+
inc n
54+
5055
proc fromNifSymDef(c: var DecodeContext; n: var Cursor; kind: TNodeKind): PNode =
5156
assert n.nodeKind == nkSym
5257
let symKind = case kind:
@@ -61,20 +66,34 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor; kind: TNodeKind): PNode
6166
assert symdef.name.len != 0
6267
let ident = c.graph.cache.getIdent(symdef.name)
6368
inc n
69+
assert n.kind == IntLit
70+
let itemId = pool.integers[n.intId].int32
71+
inc n
72+
assert n.kind in {Symbol, DotToken}, $n.kind
73+
let owner = if n.kind == Symbol:
74+
fromNifSymbol(c, n)
75+
else:
76+
inc n
77+
nil
6478
assert n.kind in {Ident, DotToken}, $n.kind
6579
let flags = if n.kind == Ident: pool.strings[n.litId].parseSymFlags else: {}
6680
inc n
67-
var position = 0
68-
if symKind == skModule:
69-
assert n.kind == StringLit
70-
let path = pool.strings[n.litId].AbsoluteFile
71-
position = fileInfoIdx(c.graph.config, path).int
72-
else:
73-
assert n.kind == IntLit
74-
position = pool.integers[n.intId]
81+
var position = if symKind == skModule:
82+
assert n.kind == StringLit
83+
let path = pool.strings[n.litId].AbsoluteFile
84+
fileInfoIdx(c.graph.config, path).int
85+
else:
86+
assert n.kind == IntLit
87+
pool.integers[n.intId]
7588
inc n
7689

77-
let psym = PSym(itemId: ItemId(module: 0, item: symdef.id.int32), kind: symKind, name: ident, flags: flags, position: position)
90+
var psym = PSym(itemId: ItemId(module: 0, item: itemId),
91+
kind: symKind,
92+
name: ident,
93+
flags: flags,
94+
position: position,
95+
disamb: symdef.id.int32)
96+
psym.setOwner(owner)
7897
result = newSymNode(psym)
7998
let hasSym = c.nifSymToPSym.hasKeyOrPut(nifSym, psym)
8099
assert not hasSym
@@ -113,9 +132,7 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode =
113132
result = newIntTypeNode(pool.integers[n.intId], getSysType(tyInt))
114133
inc n
115134
of Symbol:
116-
let sym = c.nifSymToPSym[pool.syms[n.symId]]
117-
result = newSymNode(sym)
118-
inc n
135+
result = newSymNode(fromNifSymbol(c, n))
119136
of ParLe:
120137
let kind = n.nodeKind
121138
case kind:
@@ -134,30 +151,36 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode =
134151
else:
135152
assert false, "Not yet implemented " & $n.kind
136153

137-
proc loadNif(stream: var Stream; graph: ModuleGraph): PNode =
154+
proc loadNif(stream: var Stream; modulePath: AbsoluteFile; graph: ModuleGraph): PNode =
138155
discard processDirectives(stream.r)
139156

140157
var buf = fromStream(stream)
141158
var n = beginRead(buf)
142159

143160
var c = DecodeContext(graph: graph)
161+
162+
let modSym = newModule(graph, fileInfoIdx(graph.config, modulePath))
163+
let modSuffix = moduleSuffix(modulePath.string, cast[seq[string]](graph.config.searchPaths))
164+
let nifModSym = modSym.name.s & '.' & $modSym.disamb & '.' & modSuffix
165+
c.nifSymToPSym[nifModSym] = modSym
166+
144167
result = fromNif(c, n)
145168

146169
endRead(buf)
147170

148171
proc loadNifFile*(infile: AbsoluteFile; graph: ModuleGraph): PNode =
149172
var stream = nifstreams.open(infile.string)
150-
result = loadNif(stream, graph)
173+
result = loadNif(stream, infile.changeFileExt("nim"), graph)
151174
stream.close
152175

153-
proc loadNifFromBuffer*(strbuf: sink string; graph: ModuleGraph): PNode =
176+
proc loadNifFromBuffer*(strbuf: sink string; modulePath: AbsoluteFile; graph: ModuleGraph): PNode =
154177
var stream = nifstreams.openFromBuffer(strbuf)
155-
result = loadNif(stream, graph)
178+
result = loadNif(stream, modulePath, graph)
156179

157180
when isMainModule:
158181
import std/cmdline
159182

160183
if paramCount() > 0:
161184
var graph = newModuleGraph(newIdentCache(), newConfigRef())
162-
var node = loadNifFile(paramStr(1).AbsoluteFile, graph)
185+
var node = loadNifFile(paramStr(1).toAbsolute(toAbsoluteDir(".")), graph)
163186
debug(node)

compiler/icnif/nifencoder.nim

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type
99
b: Builder
1010
conf: ConfigRef
1111
toSuffix: Table[FileIndex, string]
12-
moduleToNifSuffix: Table[ItemId, string] # module PSym -> module suffix
12+
moduleToNifSuffix: Table[FileIndex, string] # FileIndex (PSym.position) -> module suffix
1313

1414
proc modname(c: var EncodeContext; idx: FileIndex): string =
1515
# copied from ../nifgen.nim
@@ -20,21 +20,31 @@ proc modname(c: var EncodeContext; idx: FileIndex): string =
2020
c.toSuffix[idx] = result
2121

2222
proc toNifSym(c: var EncodeContext; sym: PSym): string =
23-
result = sym.name.s & '.' & $sym.itemId.item
24-
if sym.owner.kind == skModule:
23+
result = sym.name.s & '.' & $sym.disamb
24+
let owner = sym.skipGenericOwner()
25+
if owner.kind == skModule:
2526
result.add '.'
26-
var modsuf = c.moduleToNifSuffix.getOrDefault(sym.owner.itemId)
27+
let fileIndex = FileIndex owner.position
28+
var modsuf = c.moduleToNifSuffix.getOrDefault(fileIndex)
2729
if modsuf.len == 0:
28-
modsuf = modname(c, sym.owner.position.FileIndex)
29-
c.moduleToNifSuffix[sym.owner.itemId] = modsuf
30+
modsuf = modname(c, fileIndex)
31+
c.moduleToNifSuffix[fileIndex] = modsuf
3032
result.add modsuf
3133

34+
proc symToNif(c: var EncodeContext; sym: PSym) =
35+
c.b.addSymbol toNifSym(c, sym)
36+
3237
proc symdefToNif(c: var EncodeContext; n: PNode) =
3338
assert n.kind == nkSym
3439
let sym = n.sym
3540
c.b.addTree toNifTag(n.kind)
3641
var name = toNifSym(c, sym)
3742
c.b.addSymbolDef name
43+
c.b.addIntLit sym.itemId.item
44+
if sym.owner == nil or sym.owner.kind == skPackage:
45+
c.b.addEmpty
46+
else:
47+
symToNif(c, sym.owner)
3848
if sym.flags == {}:
3949
c.b.addEmpty()
4050
else:
@@ -88,7 +98,7 @@ proc toNif(c: var EncodeContext; n: PNode) =
8898
echo "position = ", o.position
8999
debug(o)
90100
o = o.owner
91-
c.b.addSymbol toNifSym(c, n.sym)
101+
symToNif(c, n.sym)
92102
of nkImportStmt:
93103
toNifImport(c, n)
94104
else:

tests/icnif/tencode.nim

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
import std/assertions
22
import "../../compiler/icnif" / [nifencoder, nifdecoder]
3-
import "../../compiler" / [idents, options, modulegraphs]
3+
import "../../compiler" / [idents, options, pathutils, modulegraphs]
44

55
var graph = newModuleGraph(newIdentCache(), newConfigRef())
6+
graph.config.searchPaths.add AbsoluteDir "/tmp/testnim"
67

78
block:
89
const TestNif = """
9-
(.nif24)
10-
(.vendor "nim2")
11-
(.dialect "nim2-ic-nif")
12-
(stmts
13-
(import
14-
(sym :testmod2.1 . "/home/nimdev/testnim/testmod2.nim"))
15-
(var
16-
(identdefs
17-
(sym :x.2.tesvp2f3v ueg +0) . +123))
18-
(var
19-
(identdefs
20-
(sym :y.3.tesvp2f3v g +0) . x.2.tesvp2f3v)))"""
10+
(.nif24)
11+
(.vendor "nim2")
12+
(.dialect "nim2-ic-nif")
13+
(stmts
14+
(import
15+
(sym :testmod2.0.tesfd9rxn1 +1 . . "/tmp/testnim/testmod2.nim"))
16+
(var
17+
(identdefs
18+
(sym :x.0.tesvp2f3v +2 testmod.0.tesvp2f3v ueg +0) . +123))
19+
(var
20+
(identdefs
21+
(sym :y.0.tesvp2f3v +3 testmod.0.tesvp2f3v g +0) . x.0.tesvp2f3v)))"""
2122

22-
assert loadNifFromBuffer(TestNif, graph).saveNifToBuffer(graph.config) == TestNif
23+
assert loadNifFromBuffer(TestNif, AbsoluteFile"/tmp/testnim/testmod.nim", graph).saveNifToBuffer(graph.config) == TestNif

0 commit comments

Comments
 (0)