From bac790ae3b40fd66920c9b63b67f02bbc13f5e68 Mon Sep 17 00:00:00 2001 From: dom96 Date: Wed, 11 Apr 2012 20:45:27 +0100 Subject: [PATCH 1/3] The build.sh file generated by niminst now supports a --extraBuildArgs param. --- tools/niminst/buildsh.tmpl | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tools/niminst/buildsh.tmpl b/tools/niminst/buildsh.tmpl index 1f15901cc6..936378de23 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` From fe750a5cf94dca73547e6170928ed53d5f55c15d Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 13 Apr 2012 18:36:55 +0200 Subject: [PATCH 2/3] performance improvements for ropes --- compiler/ropes.nim | 34 ++++++++++++++++++++-------------- todo.txt | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/compiler/ropes.nim b/compiler/ropes.nim index 0140301453..c37745a637 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/todo.txt b/todo.txt index a3dfe3eb47..6037676a52 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 From 36287310644b31ed3b65922075d49e58940cdd7e Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 13 Apr 2012 18:52:54 +0200 Subject: [PATCH 3/3] unicode: invalid utf-8 bytes are preserved --- lib/pure/unicode.nim | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/pure/unicode.nim b/lib/pure/unicode.nim index 261af498d4..e11cd5fe34 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 = [