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 | |
parent | 1ba31f8df73573e61154b37b51e11d357a8ff7fa (diff) | |
parent | 36287310644b31ed3b65922075d49e58940cdd7e (diff) | |
download | Nim-b2cc17cde487ffed4eb3f25e7b9eec55bf3e587d.tar.gz |
Merge branch 'master' of github.com:Araq/Nimrod into upstream
-rwxr-xr-x | compiler/ropes.nim | 34 | ||||
-rw-r--r-- | lib/pure/unicode.nim | 10 | ||||
-rwxr-xr-x | todo.txt | 2 | ||||
-rwxr-xr-x | tools/niminst/buildsh.tmpl | 23 |
4 files changed, 49 insertions, 20 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) diff --git a/lib/pure/unicode.nim b/lib/pure/unicode.nim index 261af498d..e11cd5fe3 100644 --- a/lib/pure/unicode.nim +++ b/lib/pure/unicode.nim @@ -34,7 +34,7 @@ proc runeLen*(s: string): int {.rtl, extern: "nuc$1".} = elif ord(s[i]) shr 3 == 0b11110: inc(i, 4) elif ord(s[i]) shr 2 == 0b111110: inc(i, 5) elif ord(s[i]) shr 1 == 0b1111110: inc(i, 6) - else: assert(false) + else: inc i inc(result) proc runeLenAt*(s: string, i: int): int = @@ -45,7 +45,7 @@ proc runeLenAt*(s: string, i: int): int = elif ord(s[i]) shr 3 == 0b11110: result = 4 elif ord(s[i]) shr 2 == 0b111110: result = 5 elif ord(s[i]) shr 1 == 0b1111110: result = 6 - else: assert(false) + else: result = 1 template fastRuneAt*(s: string, i: int, result: expr, doInc = true) = ## Returns the unicode character ``s[i]`` in `result`. If ``doInc == true`` @@ -100,7 +100,8 @@ template fastRuneAt*(s: string, i: int, result: expr, doInc = true) = (ord(s[i+5]) and ones(6))) when doInc: inc(i, 6) else: - assert(false) + result = TRune(ord(s[i])) + when doInc: inc(i) proc runeAt*(s: string, i: int): TRune = ## returns the unicode character in `s` at byte index `i` @@ -128,7 +129,8 @@ proc toUTF8*(c: TRune): string {.rtl, extern: "nuc$1".} = result[2] = chr(i shr 6 and ones(6) or 0b10_0000_00) result[3] = chr(i and ones(6) or 0b10_0000_00) else: - assert false + result = newString(1) + result[0] = chr(i) const alphaRanges = [ diff --git a/todo.txt b/todo.txt index a3dfe3eb4..6037676a5 100755 --- a/todo.txt +++ b/todo.txt @@ -49,7 +49,7 @@ Bugs without ``-d:release`` leaks memory? - bug: object {.pure, final.} does not work again! - bug: {.error: "msg".} produces invalid pragma message -- bug: tsortdev does not run with native GC? +- bug: tsortdev does not run with native GC!! - bug: pragma statements in combination with symbol files are evaluated twice but this can lead to compilation errors diff --git a/tools/niminst/buildsh.tmpl b/tools/niminst/buildsh.tmpl index 1f15901cc..936378de2 100755 --- a/tools/niminst/buildsh.tmpl +++ b/tools/niminst/buildsh.tmpl @@ -3,9 +3,30 @@ # result = "#! /bin/sh\n# Generated from niminst\n" & # "# Template is in tools/buildsh.tmpl\n" & # "# To regenerate run ``niminst csource`` or ``koch csource``\n" +while : +do + case "$1" in + --extraBuildArgs) + extraBuildArgs=" $2" + shift 2 + ;; + --) # End of all options + shift + break; + ;; + -*) + echo "Error: Unknown option: $1" >&2 + exit 1 + ;; + *) # No more options + break + ;; + esac +done + CC="gcc" LINKER="gcc" -COMP_FLAGS="?{c.ccompiler.flags}" +COMP_FLAGS="?{c.ccompiler.flags}$extraBuildArgs" LINK_FLAGS="?{c.linker.flags}" # add(result, "# platform detection\n") ucpu=`uname -m` |