diff options
Diffstat (limited to 'compiler/ast.nim')
-rwxr-xr-x | compiler/ast.nim | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index fc21235bc..0e4700065 100755 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -520,7 +520,7 @@ type TNodeSeq* = seq[PNode] PType* = ref TType PSym* = ref TSym - TNode*{.acyclic, final.} = object # on a 32bit machine, this takes 32 bytes + TNode*{.final.} = object # on a 32bit machine, this takes 32 bytes typ*: PType comment*: string info*: TLineInfo @@ -579,6 +579,9 @@ type flags*: TLocFlags # location's flags t*: PType # type of location r*: PRope # rope value of location (code generators) + heapRoot*: PRope # keeps track of the enclosing heap object that + # owns this location (required by GC algorithms + # employing heap snapshots or sliding views) a*: int # location's "address", i.e. slot for temporaries # ---------------- end of backend information ------------------------------ @@ -590,11 +593,33 @@ type generated*: bool # needed for the backends: name*: PRope path*: PNode # can be a string literal! - - + + TInstantiation* = object + sym*: PSym + concreteTypes*: seq[PType] + usedBy*: seq[int32] # list of modules using the generic + # needed in caas mode for purging the cache + # XXX: it's possible to switch to a + # simple ref count here + + PInstantiation* = ref TInstantiation + PLib* = ref TLib TSym* = object of TIdObj - kind*: TSymKind + # proc and type instantiations are cached in the generic symbol + case kind*: TSymKind + of skType: + typeInstCache*: seq[PType] + of routineKinds: + procInstCache*: seq[PInstantiation] + of skModule: + # modules keep track of the generic symbols they use from other modules. + # this is because in incremental compilation, when a module is about to + # be replaced with a newer version, we must decrement the usage count + # of all previously used generics. + usedGenerics*: seq[PInstantiation] + else: nil + magic*: TMagic typ*: PType name*: PIdent @@ -618,8 +643,9 @@ type # for a conditional: # 1 iff the symbol is defined, else 0 # (or not in symbol table) - # for modules, a unique index corresponding - # to the order of compilation + # for modules, an unique index corresponding + # to the module's fileIdx + offset*: int # offset of record field loc*: TLoc annex*: PLib # additional fields (seldom used, so we use a @@ -827,6 +853,14 @@ proc linkTo*(s: PSym, t: PType): PSym {.discardable.} = s.typ = t result = s +template fileIdx*(c: PSym): int32 = + # XXX: this should be used only on module symbols + c.position.int32 + +template filename*(c: PSym): string = + # XXX: this should be used only on module symbols + c.position.int32.toFileName + proc appendToModule*(m: PSym, n: PNode) = ## The compiler will use this internally to add nodes that will be ## appended to the module after the sem pass |