summary refs log blame commit diff stats
path: root/test/tc_history.py
blob: 18f71e3523707a54d9b20835360eff5441a29dc9 (plain) (tree)
pan>) and (s.ast.sons[genericParamsPos] == nil): result = false else: result = true const maxPasses = 10 type TPassContextArray = array[0..maxPasses - 1, PPassContext] var gPasses: array[0..maxPasses - 1, TPass] gPassesLen: int proc registerPass(p: TPass) = gPasses[gPassesLen] = p inc(gPassesLen) proc openPasses(a: var TPassContextArray, module: PSym, filename: string) = for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].open): a[i] = gPasses[i].open(module, filename) else: a[i] = nil proc openPassesCached(a: var TPassContextArray, module: PSym, filename: string, rd: PRodReader) = for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].openCached): a[i] = gPasses[i].openCached(module, filename, rd) else: a[i] = nil proc closePasses(a: var TPassContextArray) = var m: PNode m = nil for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].close): m = gPasses[i].close(a[i], m) a[i] = nil # free the memory here proc processTopLevelStmt(n: PNode, a: var TPassContextArray) = var m: PNode # this implements the code transformation pipeline m = n for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].process): m = gPasses[i].process(a[i], m) proc processTopLevelStmtCached(n: PNode, a: var TPassContextArray) = var m: PNode # this implements the code transformation pipeline m = n for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].openCached): m = gPasses[i].process(a[i], m) proc closePassesCached(a: var TPassContextArray) = var m: PNode m = nil for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].openCached) and not isNil(gPasses[i].close): m = gPasses[i].close(a[i], m) a[i] = nil # free the memory here proc processModule(module: PSym, filename: string, stream: PLLStream, rd: PRodReader) = var p: TParsers n: PNode a: TPassContextArray s: PLLStream if rd == nil: openPasses(a, module, filename) if stream == nil: s = LLStreamOpen(filename, fmRead) if s == nil: rawMessage(errCannotOpenFile, filename) return else: s = stream while true: openParsers(p, filename, s) while true: n = parseTopLevelStmt(p) if n == nil: break processTopLevelStmt(n, a) closeParsers(p) if s.kind != llsStdIn: break closePasses(a) # id synchronization point for more consistent code generation: IDsynchronizationPoint(1000) else: openPassesCached(a, module, filename, rd) n = loadInitSection(rd) #MessageOut('init section' + renderTree(n)); for i in countup(0, sonsLen(n) - 1): processTopLevelStmtCached(n.sons[i], a) closePassesCached(a) proc initPass(p: var TPass) = p.open = nil p.openCached = nil p.close = nil p.process = nil