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
|