summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-04-15 02:58:01 +0300
committerZahary Karadjov <zahary@gmail.com>2012-04-15 02:58:01 +0300
commitb2cc17cde487ffed4eb3f25e7b9eec55bf3e587d (patch)
tree65e54c10ad9851e684f3108d856e67a4d73d4fe4
parent1ba31f8df73573e61154b37b51e11d357a8ff7fa (diff)
parent36287310644b31ed3b65922075d49e58940cdd7e (diff)
downloadNim-b2cc17cde487ffed4eb3f25e7b9eec55bf3e587d.tar.gz
Merge branch 'master' of github.com:Araq/Nimrod into upstream
-rwxr-xr-xcompiler/ropes.nim34
-rw-r--r--lib/pure/unicode.nim10
-rwxr-xr-xtodo.txt2
-rwxr-xr-xtools/niminst/buildsh.tmpl23
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`