big steps torwards an efficient, simple IC implementation (#16543)
* reworked ID handling * the packed AST now has its own ID mechanism * basic serialization code works * extract rodfiles to its own module * rodfiles: store and compare configs * rodfiles: store dependencies * store config at the end * precise dependency tracking * dependency tracking for rodfiles * completed loading of PSym, PType, etc * removed dead code * bugfix: do not realloc seqs when taking addr into an element * make IC opt-in for now * makes tcompilerapi green again * final cleanups Co-authored-by: Andy Davidoff <github@andy.disruptek.com>
This commit is contained in:
parent
0d0e43469f
commit
73a8b950cb
57 changed files with 1429 additions and 1717 deletions
|
|
@ -11,7 +11,9 @@
|
|||
|
||||
import
|
||||
intsets, options, ast, astalgo, msgs, idents, renderer,
|
||||
magicsys, vmdef, modulegraphs, lineinfos, sets
|
||||
magicsys, vmdef, modulegraphs, lineinfos, sets, pathutils
|
||||
|
||||
import ic / to_packed_ast
|
||||
|
||||
type
|
||||
TOptionEntry* = object # entries to put on a stack for pragma parsing
|
||||
|
|
@ -77,9 +79,9 @@ type
|
|||
case mode*: ImportMode
|
||||
of importAll: discard
|
||||
of importSet:
|
||||
imported*: IntSet
|
||||
imported*: IntSet # of PIdent.id
|
||||
of importExcept:
|
||||
exceptSet*: IntSet
|
||||
exceptSet*: IntSet # of PIdent.id
|
||||
|
||||
PContext* = ref TContext
|
||||
TContext* = object of TPassContext # a context represents the module
|
||||
|
|
@ -140,6 +142,7 @@ type
|
|||
selfName*: PIdent
|
||||
cache*: IdentCache
|
||||
graph*: ModuleGraph
|
||||
encoder*: PackedEncoder
|
||||
signatures*: TStrTable
|
||||
recursiveDep*: string
|
||||
suggestionsMade*: bool
|
||||
|
|
@ -264,6 +267,16 @@ proc newContext*(graph: ModuleGraph; module: PSym): PContext =
|
|||
initStrTable(result.signatures)
|
||||
result.typesWithOps = @[]
|
||||
result.features = graph.config.features
|
||||
if graph.config.symbolFiles != disabledSf:
|
||||
initEncoder result.encoder, module, graph.config
|
||||
|
||||
proc addIncludeFileDep*(c: PContext; f: FileIndex) =
|
||||
if c.config.symbolFiles != disabledSf:
|
||||
addIncludeFileDep(c.encoder, f)
|
||||
|
||||
proc addImportFileDep*(c: PContext; f: FileIndex) =
|
||||
if c.config.symbolFiles != disabledSf:
|
||||
addImportFileDep(c.encoder, f)
|
||||
|
||||
proc inclSym(sq: var seq[PSym], s: PSym) =
|
||||
for i in 0..<sq.len:
|
||||
|
|
@ -273,6 +286,7 @@ proc inclSym(sq: var seq[PSym], s: PSym) =
|
|||
proc addConverter*(c: PContext, conv: PSym) =
|
||||
inclSym(c.converters, conv)
|
||||
inclSym(c.graph.ifaces[c.module.position].converters, conv)
|
||||
#addConverter(c.graph, c.module, conv) # upcoming
|
||||
|
||||
proc addPureEnum*(c: PContext, e: PSym) =
|
||||
inclSym(c.graph.ifaces[c.module.position].pureEnums, e)
|
||||
|
|
@ -280,6 +294,7 @@ proc addPureEnum*(c: PContext, e: PSym) =
|
|||
proc addPattern*(c: PContext, p: PSym) =
|
||||
inclSym(c.patterns, p)
|
||||
inclSym(c.graph.ifaces[c.module.position].patterns, p)
|
||||
#addPattern(c.graph, c.module, p) # upcoming
|
||||
|
||||
proc newLib*(kind: TLibKind): PLib =
|
||||
new(result)
|
||||
|
|
@ -291,10 +306,10 @@ proc addToLib*(lib: PLib, sym: PSym) =
|
|||
sym.annex = lib
|
||||
|
||||
proc newTypeS*(kind: TTypeKind, c: PContext): PType =
|
||||
result = newType(kind, nextId(c.idgen), getCurrOwner(c))
|
||||
result = newType(kind, nextTypeId(c.idgen), getCurrOwner(c))
|
||||
|
||||
proc makePtrType*(owner: PSym, baseType: PType; idgen: IdGenerator): PType =
|
||||
result = newType(tyPtr, nextId(idgen), owner)
|
||||
result = newType(tyPtr, nextTypeId(idgen), owner)
|
||||
addSonSkipIntLit(result, baseType, idgen)
|
||||
|
||||
proc makePtrType*(c: PContext, baseType: PType): PType =
|
||||
|
|
@ -322,7 +337,7 @@ proc makeVarType*(owner: PSym, baseType: PType; idgen: IdGenerator; kind = tyVar
|
|||
if baseType.kind == kind:
|
||||
result = baseType
|
||||
else:
|
||||
result = newType(kind, nextId(idgen), owner)
|
||||
result = newType(kind, nextTypeId(idgen), owner)
|
||||
addSonSkipIntLit(result, baseType, idgen)
|
||||
|
||||
proc makeTypeDesc*(c: PContext, typ: PType): PType =
|
||||
|
|
@ -338,7 +353,7 @@ proc makeTypeSymNode*(c: PContext, typ: PType, info: TLineInfo): PNode =
|
|||
incl typedesc.flags, tfCheckedForDestructor
|
||||
internalAssert(c.config, typ != nil)
|
||||
typedesc.addSonSkipIntLit(typ, c.idgen)
|
||||
let sym = newSym(skType, c.cache.idAnon, nextId(c.idgen), getCurrOwner(c), info,
|
||||
let sym = newSym(skType, c.cache.idAnon, nextSymId(c.idgen), getCurrOwner(c), info,
|
||||
c.config.options).linkTo(typedesc)
|
||||
return newSymNode(sym, info)
|
||||
|
||||
|
|
@ -349,12 +364,12 @@ proc makeTypeFromExpr*(c: PContext, n: PNode): PType =
|
|||
|
||||
proc newTypeWithSons*(owner: PSym, kind: TTypeKind, sons: seq[PType];
|
||||
idgen: IdGenerator): PType =
|
||||
result = newType(kind, nextId(idgen), owner)
|
||||
result = newType(kind, nextTypeId(idgen), owner)
|
||||
result.sons = sons
|
||||
|
||||
proc newTypeWithSons*(c: PContext, kind: TTypeKind,
|
||||
sons: seq[PType]): PType =
|
||||
result = newType(kind, nextId(c.idgen), getCurrOwner(c))
|
||||
result = newType(kind, nextTypeId(c.idgen), getCurrOwner(c))
|
||||
result.sons = sons
|
||||
|
||||
proc makeStaticExpr*(c: PContext, n: PNode): PNode =
|
||||
|
|
@ -463,3 +478,15 @@ proc popCaseContext*(c: PContext) =
|
|||
|
||||
proc setCaseContextIdx*(c: PContext, idx: int) =
|
||||
c.p.caseContext[^1].idx = idx
|
||||
|
||||
template addExport*(c: PContext; s: PSym) =
|
||||
## convenience to export a symbol from the current module
|
||||
addExport(c.graph, c.module, s)
|
||||
|
||||
proc storeRodNode*(c: PContext, n: PNode) =
|
||||
if c.config.symbolFiles != disabledSf:
|
||||
toPackedNodeTopLevel(n, c.encoder)
|
||||
|
||||
proc saveRodFile*(c: PContext) =
|
||||
if c.config.symbolFiles != disabledSf:
|
||||
saveRodFile(toRodFile(c.config, c.filename.AbsoluteFile), c.encoder)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue