diff options
Diffstat (limited to 'rod/rodread.nim')
-rwxr-xr-x | rod/rodread.nim | 185 |
1 files changed, 68 insertions, 117 deletions
diff --git a/rod/rodread.nim b/rod/rodread.nim index 367378f3c..ee295d122 100755 --- a/rod/rodread.nim +++ b/rod/rodread.nim @@ -146,9 +146,9 @@ proc rrGetType(r: PRodReader, id: int, info: TLineInfo): PType proc decode(r: PRodReader): string proc decodeInt(r: PRodReader): int proc decodeBInt(r: PRodReader): biggestInt + proc encode(s: string): PRope = - var res: string - res = "" + var res = "" for i in countup(0, len(s) + 0 - 1): case s[i] of 'a'..'z', 'A'..'Z', '0'..'9', '_': add(res, s[i]) @@ -156,29 +156,24 @@ proc encode(s: string): PRope = result = toRope(res) proc encodeIntAux(str: var string, x: BiggestInt) = - const - chars: string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - var - v, rem: biggestInt - d: char - idx: int - v = x - rem = v mod 190 + const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + var d: char + var v = x + var rem: biggestInt = v mod 190 if (rem < 0): - str = str & '-' + add(str, '-') v = - (v div 190) rem = - rem else: v = v div 190 - idx = int(rem) + var idx = int(rem) if idx < 62: d = chars[idx + 0] else: d = chr(idx - 62 + 128) if (v != 0): encodeIntAux(str, v) add(str, d) proc encodeInt(x: BiggestInt): PRope = - var res: string - res = "" + var res = "" encodeIntAux(res, x) result = toRope(res) @@ -303,8 +298,8 @@ proc decodeType(r: PRodReader, info: TLineInfo): PType = if debugIds: registerID(result) else: InternalError(info, "decodeType: no id") - IdTablePut(gTypeTable, result, result) # here this also - # avoids endless recursion for recursive type + # here this also avoids endless recursion for recursive type + IdTablePut(gTypeTable, result, result) if r.s[r.pos] == '(': result.n = decodeNode(r, UnknownLineInfo()) if r.s[r.pos] == '$': inc(r.pos) @@ -343,7 +338,7 @@ proc decodeType(r: PRodReader, info: TLineInfo): PType = d = decodeInt(r) addSon(result, rrGetType(r, d, info)) -proc decodeLib(r: PRodReader): PLib = +proc decodeLib(r: PRodReader, info: TLineInfo): PLib = result = nil if r.s[r.pos] == '|': new(result) @@ -354,11 +349,10 @@ proc decodeLib(r: PRodReader): PLib = result.name = toRope(decode(r)) if r.s[r.pos] != '|': InternalError("decodeLib: 2") inc(r.pos) - result.path = decode(r) + result.path = decodeNode(r, info) proc decodeSym(r: PRodReader, info: TLineInfo): PSym = var - k: TSymKind id: int ident: PIdent result = nil @@ -367,7 +361,7 @@ proc decodeSym(r: PRodReader, info: TLineInfo): PSym = if r.s[r.pos] == '}': inc(r.pos) return # nil sym - k = TSymKind(decodeInt(r)) + var k = TSymKind(decodeInt(r)) if r.s[r.pos] == '+': inc(r.pos) id = decodeInt(r) @@ -412,22 +406,20 @@ proc decodeSym(r: PRodReader, info: TLineInfo): PSym = inc(r.pos) result.position = decodeInt(r) else: - result.position = 0 # BUGFIX: this may have been misused as reader index! + result.position = 0 + # BUGFIX: this may have been misused as reader index! if r.s[r.pos] == '`': inc(r.pos) result.offset = decodeInt(r) else: result.offset = - 1 decodeLoc(r, result.loc, result.info) - result.annex = decodeLib(r) + result.annex = decodeLib(r, info) proc decodeInt(r: PRodReader): int = # base 190 numbers - var - i: int - sign: int - i = r.pos - sign = - 1 + var i = r.pos + var sign = - 1 assert(r.s[i] in {'a'..'z', 'A'..'Z', '0'..'9', '-', '\x80'..'\xFF'}) if r.s[i] == '-': inc(i) @@ -445,11 +437,8 @@ proc decodeInt(r: PRodReader): int = r.pos = i proc decodeBInt(r: PRodReader): biggestInt = - var - i: int - sign: biggestInt - i = r.pos - sign = - 1 + var i = r.pos + var sign: biggestInt = - 1 assert(r.s[i] in {'a'..'z', 'A'..'Z', '0'..'9', '-', '\x80'..'\xFF'}) if r.s[i] == '-': inc(i) @@ -471,18 +460,16 @@ proc hexChar(c: char, xi: var int) = of '0'..'9': xi = (xi shl 4) or (ord(c) - ord('0')) of 'a'..'f': xi = (xi shl 4) or (ord(c) - ord('a') + 10) of 'A'..'F': xi = (xi shl 4) or (ord(c) - ord('A') + 10) - else: - nil + else: nil proc decode(r: PRodReader): string = - var i, xi: int - i = r.pos + var i = r.pos result = "" while true: case r.s[i] of '\\': inc(i, 3) - xi = 0 + var xi = 0 hexChar(r.s[i - 2], xi) hexChar(r.s[i - 1], xi) add(result, chr(xi)) @@ -493,28 +480,23 @@ proc decode(r: PRodReader): string = r.pos = i proc skipSection(r: PRodReader) = - var c: int if r.s[r.pos] == ':': while r.s[r.pos] > '\x0A': inc(r.pos) elif r.s[r.pos] == '(': - c = 0 # count () pairs + var c = 0 # count () pairs inc(r.pos) while true: case r.s[r.pos] - of '\x0A': - inc(r.line) - of '(': - inc(c) + of '\x0A': inc(r.line) + of '(': inc(c) of ')': if c == 0: inc(r.pos) break elif c > 0: dec(c) - of '\0': - break # end of file - else: - nil + of '\0': break # end of file + else: nil inc(r.pos) else: InternalError("skipSection " & $(r.line)) @@ -535,18 +517,14 @@ proc newStub(r: PRodReader, name: string, id: int): PSym = if debugIds: registerID(result) proc processInterf(r: PRodReader, module: PSym) = - var - s: PSym - w: string - key: int if r.interfIdx == 0: InternalError("processInterf") r.pos = r.interfIdx while (r.s[r.pos] > '\x0A') and (r.s[r.pos] != ')'): - w = decode(r) + var w = decode(r) inc(r.pos) - key = decodeInt(r) + var key = decodeInt(r) inc(r.pos) # #10 - s = newStub(r, w, key) + var s = newStub(r, w, key) s.owner = module StrTableAdd(module.tab, s) IdTablePut(r.syms, s, s) @@ -669,8 +647,8 @@ proc processRodFile(r: PRodReader, crc: TCrc32) = skipSection(r) elif section == "DATA": r.dataIdx = r.pos + 2 # "(\10" - # We do not read the DATA section here! We read the needed objects on - # demand. + # We do not read the DATA section here! We read the needed objects on + # demand. skipSection(r) elif section == "INIT": r.initIdx = r.pos + 2 # "(\10" @@ -685,14 +663,12 @@ proc processRodFile(r: PRodReader, crc: TCrc32) = inc(r.pos) inc(r.line) -proc newRodReader(modfilename: string, crc: TCrc32, readerIndex: int): PRodReader = - var - version: string - r: PRodReader +proc newRodReader(modfilename: string, crc: TCrc32, + readerIndex: int): PRodReader = new(result) - result.files = @ [] - result.modDeps = @ [] - r = result + result.files = @[] + result.modDeps = @[] + var r = result r.reason = rrNone r.pos = 0 r.line = 1 @@ -704,7 +680,7 @@ proc newRodReader(modfilename: string, crc: TCrc32, readerIndex: int): PRodReade initIITable(r.index.tab) initIITable(r.imports.tab) # looks like a ROD file inc(r.pos, 4) - version = "" + var version = "" while not (r.s[r.pos] in {'\0', '\x0A'}): add(version, r.s[r.pos]) inc(r.pos) @@ -719,12 +695,11 @@ proc newRodReader(modfilename: string, crc: TCrc32, readerIndex: int): PRodReade result = nil proc rrGetType(r: PRodReader, id: int, info: TLineInfo): PType = - var oldPos, d: int result = PType(IdTableGet(gTypeTable, id)) if result == nil: # load the type: - oldPos = r.pos - d = IITableGet(r.index.tab, id) + var oldPos = r.pos + var d = IITableGet(r.index.tab, id) if d == invalidKey: InternalError(info, "rrGetType") r.pos = d + r.dataIdx result = decodeType(r, info) @@ -739,39 +714,29 @@ type TFileModuleMap = seq[TFileModuleRec] -var gMods: TFileModuleMap = @ [] +var gMods: TFileModuleMap = @[] proc decodeSymSafePos(rd: PRodReader, offset: int, info: TLineInfo): PSym = # all compiled modules - var oldPos: int if rd.dataIdx == 0: InternalError(info, "dataIdx == 0") - oldPos = rd.pos + var oldPos = rd.pos rd.pos = offset + rd.dataIdx result = decodeSym(rd, info) rd.pos = oldPos proc rrGetSym(r: PRodReader, id: int, info: TLineInfo): PSym = - var - d, moduleID: int - rd: PRodReader result = PSym(IdTableGet(r.syms, id)) if result == nil: # load the symbol: - d = IITableGet(r.index.tab, id) + var d = IITableGet(r.index.tab, id) if d == invalidKey: - moduleID = IiTableGet(r.imports.tab, id) + var moduleID = IiTableGet(r.imports.tab, id) if moduleID < 0: InternalError(info, - "missing from both indexes: +" & ropeToStr(encodeInt(id))) # - # find - # the - # reader - # with - # the - # correct - # moduleID: + "missing from both indexes: +" & ropeToStr(encodeInt(id))) + # find the reader with the correct moduleID: for i in countup(0, high(gMods)): - rd = gMods[i].rd + var rd = gMods[i].rd if (rd != nil): if (rd.moduleID == moduleID): d = IITableGet(rd.index.tab, id) @@ -792,56 +757,47 @@ proc rrGetSym(r: PRodReader, id: int, info: TLineInfo): PSym = if (result != nil) and (result.kind == skStub): loadStub(result) proc loadInitSection(r: PRodReader): PNode = - var d, oldPos, p: int if (r.initIdx == 0) or (r.dataIdx == 0): InternalError("loadInitSection") - oldPos = r.pos + var oldPos = r.pos r.pos = r.initIdx result = newNode(nkStmtList) while (r.s[r.pos] > '\x0A') and (r.s[r.pos] != ')'): - d = decodeInt(r) + var d = decodeInt(r) inc(r.pos) # #10 - p = r.pos + var p = r.pos r.pos = d + r.dataIdx addSon(result, decodeNode(r, UnknownLineInfo())) r.pos = p r.pos = oldPos proc loadConverters(r: PRodReader) = - var d: int # We have to ensure that no exported converter is a stub anymore. if (r.convertersIdx == 0) or (r.dataIdx == 0): InternalError("importConverters") r.pos = r.convertersIdx while (r.s[r.pos] > '\x0A'): - d = decodeInt(r) + var d = decodeInt(r) discard rrGetSym(r, d, UnknownLineInfo()) if r.s[r.pos] == ' ': inc(r.pos) proc getModuleIdx(filename: string): int = for i in countup(0, high(gMods)): - if sameFile(gMods[i].filename, filename): - return i + if sameFile(gMods[i].filename, filename): return i result = len(gMods) setlen(gMods, result + 1) proc checkDep(filename: string): TReasonForRecompile = - var - crc: TCrc32 - r: PRodReader - rodfile: string - idx: int - res: TReasonForRecompile - idx = getModuleIdx(filename) + var idx = getModuleIdx(filename) if gMods[idx].reason != rrEmpty: # reason has already been computed for this module: return gMods[idx].reason - crc = crcFromFile(filename) + var crc: TCrc32 = crcFromFile(filename) gMods[idx].reason = rrNone # we need to set it here to avoid cycles gMods[idx].filename = filename gMods[idx].crc = crc result = rrNone - r = nil - rodfile = toGeneratedFile(filename, RodExt) + var r: PRodReader = nil + var rodfile = toGeneratedFile(filename, RodExt) if ExistsFile(rodfile): r = newRodReader(rodfile, crc, idx) if r == nil: @@ -853,7 +809,7 @@ proc checkDep(filename: string): TReasonForRecompile = # NOTE: we need to process the entire module graph so that no ID will # be used twice! However, compilation speed does not suffer much from # this, since results are cached. - res = checkDep(JoinPath(options.libpath, addFileExt("system", nimExt))) + var res = checkDep(options.libpath / addFileExt("system", nimExt)) if res != rrNone: result = rrModDeps for i in countup(0, high(r.modDeps)): res = checkDep(r.modDeps[i]) @@ -870,12 +826,11 @@ proc checkDep(filename: string): TReasonForRecompile = gMods[idx].reason = result # now we know better proc handleSymbolFile(module: PSym, filename: string): PRodReader = - var idx: int if not (optSymbolFiles in gGlobalOptions): module.id = getID() return nil discard checkDep(filename) - idx = getModuleIdx(filename) + var idx = getModuleIdx(filename) if gMods[idx].reason == rrEmpty: InternalError("handleSymbolFile") result = gMods[idx].rd if result != nil: @@ -888,26 +843,22 @@ proc handleSymbolFile(module: PSym, filename: string): PRodReader = module.id = getID() proc GetCRC(filename: string): TCrc32 = - var idx: int - idx = getModuleIdx(filename) + var idx = getModuleIdx(filename) result = gMods[idx].crc proc loadStub(s: PSym) = - var - rd: PRodReader - d, theId: int - rs: PSym if s.kind != skStub: InternalError("loadStub") #MessageOut('loading stub: ' + s.name.s); - rd = gMods[s.position].rd - theId = s.id # used for later check - d = IITableGet(rd.index.tab, s.id) + var rd = gMods[s.position].rd + var theId = s.id # used for later check + var d = IITableGet(rd.index.tab, s.id) if d == invalidKey: InternalError("loadStub: invalid key") - rs = decodeSymSafePos(rd, d, UnknownLineInfo()) + var rs = decodeSymSafePos(rd, d, UnknownLineInfo()) if rs != s: InternalError(rs.info, "loadStub: wrong symbol") elif rs.id != theId: - InternalError(rs.info, "loadStub: wrong ID") #MessageOut('loaded stub: ' + s.name.s); + InternalError(rs.info, "loadStub: wrong ID") + #MessageOut('loaded stub: ' + s.name.s); InitIdTable(gTypeTable) -InitStrTable(rodCompilerProcs) \ No newline at end of file +InitStrTable(rodCompilerProcs) |