diff options
author | Zahary Karadjov <zahary@gmail.com> | 2012-04-15 02:58:01 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2012-04-15 02:58:01 +0300 |
commit | b2cc17cde487ffed4eb3f25e7b9eec55bf3e587d (patch) | |
tree | 65e54c10ad9851e684f3108d856e67a4d73d4fe4 /compiler | |
parent | 1ba31f8df73573e61154b37b51e11d357a8ff7fa (diff) | |
parent | 36287310644b31ed3b65922075d49e58940cdd7e (diff) | |
download | Nim-b2cc17cde487ffed4eb3f25e7b9eec55bf3e587d.tar.gz |
Merge branch 'master' of github.com:Araq/Nimrod into upstream
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/ropes.nim | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/compiler/ropes.nim b/compiler/ropes.nim index 014030145..c37745a63 100755 --- a/compiler/ropes.nim +++ b/compiler/ropes.nim @@ -63,7 +63,7 @@ import const CacheLeafs* = true - countCacheMisses* = False # see what our little optimization gives + countCacheMisses* = false # see what our little optimization gives type TFormatStr* = string # later we may change it to CString for better @@ -118,7 +118,7 @@ proc newMutableRope*(capacity = 30): PRope = result.data = newStringOfCap(capacity) var - cache: PRope # the root of the cache tree + cache: array[0..2048 -1, PRope] misses, hits: int N: PRope # dummy rope needed for splay algorithm @@ -207,14 +207,20 @@ proc RopeInvariant(r: PRope): bool = # if result then result := ropeInvariant(r.left); # if result then result := ropeInvariant(r.right); # end + +proc insertInCache(s: string): PRope = + var h = hash(s) and high(cache) + result = cache[h] + if isNil(result) or result.data != s: + result = newRope(s) + cache[h] = result proc toRope(s: string): PRope = - if s == "": + if s.len == 0: result = nil elif cacheLeafs: - result = insertInCache(s, cache) - cache = result - else: + result = insertInCache(s) + else: result = newRope(s) assert(RopeInvariant(result)) @@ -292,7 +298,7 @@ proc writeRope*(f: TFile, c: PRope) = write(f, it.data) proc WriteRope(head: PRope, filename: string) = - var f: tfile # we use a textfile for automatic buffer handling + var f: tfile if open(f, filename, fmWrite): if head != nil: WriteRope(f, head) close(f) @@ -326,16 +332,16 @@ proc ropef(frmt: TFormatStr, args: openarray[PRope]): PRope = internalError("ropes: invalid format string $" & $(j)) app(result, args[j - 1]) of 'n': - if not (optLineDir in gOptions): app(result, tnl) + if optLineDir notin gOptions: app(result, tnl) inc i - of 'N': + of 'N': app(result, tnl) inc(i) else: InternalError("ropes: invalid format string $" & frmt[i]) var start = i - while (i <= length - 1): - if (frmt[i] != '$'): inc(i) - else: break + while i < length: + if frmt[i] != '$': inc(i) + else: break if i - 1 >= start: app(result, substr(frmt, start, i - 1)) assert(RopeInvariant(result)) @@ -347,11 +353,11 @@ const bufSize = 1024 # 1 KB is reasonable proc auxRopeEqualsFile(r: PRope, bin: var tfile, buf: Pointer): bool = - if (r.data != nil): + if r.data != nil: if r.length > bufSize: internalError("ropes: token too long") var readBytes = readBuffer(bin, buf, r.length) - result = (readBytes == r.length) and + result = readBytes == r.length and equalMem(buf, addr(r.data[0]), r.length) # BUGFIX else: result = auxRopeEqualsFile(r.left, bin, buf) |