diff options
Diffstat (limited to 'compiler/semdata.nim')
-rwxr-xr-x | compiler/semdata.nim | 50 |
1 files changed, 16 insertions, 34 deletions
diff --git a/compiler/semdata.nim b/compiler/semdata.nim index 4ead9cf13..f5d5a9604 100755 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -36,25 +36,14 @@ type # in standalone ``except`` and ``finally`` next*: PProcCon # used for stacking procedure contexts - TInstantiatedSymbol* {.final.} = object - genericSym*, instSym*: PSym - concreteTypes*: seq[PType] - - # If we generate an instance of a generic, we'd like to re-use that - # instance if possible across module boundaries. However, this is not - # possible if the compilation cache is enabled. So we give up then and use - # the caching of generics only per module, not per project. - TGenericsCache* {.final.} = object - InstTypes*: TIdTable # map PType to PType - generics*: seq[TInstantiatedSymbol] # a list of the things to compile - lastGenericIdx*: int # used for the generics stack - - PGenericsCache* = ref TGenericsCache + TInstantiationPair* = object + genericSym*: PSym + inst*: PInstantiation + PContext* = ref TContext TContext* = object of TPassContext # a context represents a module module*: PSym # the module sym belonging to the context p*: PProcCon # procedure context - generics*: PGenericsCache # may point to a global or module-local structure friendModule*: PSym # current friend module; may access private data; # this is used so that generic instantiations # can access private object fields @@ -81,21 +70,23 @@ type filter: TSymKinds): PNode {.nimcall.} semTypeNode*: proc(c: PContext, n: PNode, prev: PType): PType {.nimcall.} includedFiles*: TIntSet # used to detect recursive include files - filename*: string # the module's filename userPragmas*: TStrTable evalContext*: PEvalContext UnknownIdents*: TIntSet # ids of all unknown identifiers to prevent # naming it multiple times + generics*: seq[TInstantiationPair] # pending list of instantiated generics to compile + lastGenericIdx*: int # used for the generics stack + -var - gGenericsCache: PGenericsCache # save for modularity +proc makeInstPair*(s: PSym, inst: PInstantiation): TInstantiationPair = + result.genericSym = s + result.inst = inst -proc newGenericsCache*(): PGenericsCache = - new(result) - initIdTable(result.InstTypes) - result.generics = @[] +proc filename*(c: PContext): string = + # the module's filename + return c.module.filename -proc newContext*(module: PSym, nimfile: string): PContext +proc newContext*(module: PSym): PContext proc lastOptionEntry*(c: PContext): POptionEntry proc newOptionEntry*(): POptionEntry @@ -152,7 +143,7 @@ proc newOptionEntry(): POptionEntry = result.dynlib = nil result.notes = gNotes -proc newContext(module: PSym, nimfile: string): PContext = +proc newContext(module: PSym): PContext = new(result) InitSymTab(result.tab) result.AmbiguousSymbols = initIntset() @@ -164,18 +155,9 @@ proc newContext(module: PSym, nimfile: string): PContext = result.threadEntries = @[] result.converters = @[] result.patterns = @[] - result.filename = nimfile result.includedFiles = initIntSet() initStrTable(result.userPragmas) - if optSymbolFiles notin gGlobalOptions: - # re-usage of generic instantiations across module boundaries is - # very nice for code size: - if gGenericsCache == nil: gGenericsCache = newGenericsCache() - result.generics = gGenericsCache - else: - # we have to give up and use a per-module cache for generic instantiations: - result.generics = newGenericsCache() - assert gGenericsCache == nil + result.generics = @[] result.UnknownIdents = initIntSet() proc inclSym(sq: var TSymSeq, s: PSym) = |