summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2018-09-15 14:33:15 -0500
committerGanesh Viswanathan <dev@genotrance.com>2018-09-15 14:33:15 -0500
commite4fa1c81cb555a726fa79133bb20e938e8c68b02 (patch)
tree1185eab4bd2c2e66567c2dba0fe988355595ceb3
parentb966945ab219e58023cdf85c77804519c96c231e (diff)
parent0e33a8676e325fa4174893291ed41d59b689c577 (diff)
downloadNim-e4fa1c81cb555a726fa79133bb20e938e8c68b02.tar.gz
Merge remote-tracking branch 'upstream/devel' into test-6434
-rw-r--r--compiler/ccgexprs.nim3
-rw-r--r--compiler/ccgtypes.nim15
-rw-r--r--compiler/pathutils.nim2
-rw-r--r--lib/pure/typetraits.nim13
-rw-r--r--lib/system/sysio.nim7
-rw-r--r--tests/assert/tfailedassert_stacktrace.nim35
-rw-r--r--tests/async/tasyncfilewrite.nim8
-rw-r--r--tests/ccgbugs/t8967.nim10
8 files changed, 65 insertions, 28 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 56ecf5ba3..a7a28a51c 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -1596,10 +1596,11 @@ proc genSwap(p: BProc, e: PNode, d: var TLoc) =
   genAssignment(p, a, b, {})
   genAssignment(p, b, tmp, {})
 
-proc rdSetElemLoc(conf: ConfigRef; a: TLoc, setType: PType): Rope =
+proc rdSetElemLoc(conf: ConfigRef; a: TLoc, typ: PType): Rope =
   # read a location of an set element; it may need a subtraction operation
   # before the set operation
   result = rdCharLoc(a)
+  let setType = typ.skipTypes(abstractPtrs)
   assert(setType.kind == tySet)
   if firstOrd(conf, setType) != 0:
     result = "($1- $2)" % [result, rope(firstOrd(conf, setType))]
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index dd79f4846..52a4a72f2 100644
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -162,9 +162,9 @@ proc mapType(conf: ConfigRef; typ: PType): TCTypeKind =
     var base = skipTypes(typ.lastSon, typedescInst)
     case base.kind
     of tyOpenArray, tyArray, tyVarargs: result = ctPtrToArray
-    #of tySet:
-    #  if mapSetType(base) == ctArray: result = ctPtrToArray
-    #  else: result = ctPtr
+    of tySet:
+      if mapSetType(conf, base) == ctArray: result = ctPtrToArray
+      else: result = ctPtr
     # XXX for some reason this breaks the pegs module
     else: result = ctPtr
   of tyPointer: result = ctPtr
@@ -641,10 +641,11 @@ proc getTypeDescAux(m: BModule, origTyp: PType, check: var IntSet): Rope =
                     compileToCpp(m): "&" else: "*"
     var et = origTyp.skipTypes(abstractInst).lastSon
     var etB = et.skipTypes(abstractInst)
-    if etB.kind in {tyArray, tyOpenArray, tyVarargs}:
-      # this is correct! sets have no proper base type, so we treat
-      # ``var set[char]`` in `getParamTypeDesc`
-      et = elemType(etB)
+    if mapType(m.config, t) == ctPtrToArray:
+      if etB.kind == tySet:
+        et = getSysType(m.g.graph, unknownLineInfo(), tyUInt8)
+      else:
+        et = elemType(etB)
       etB = et.skipTypes(abstractInst)
       star[0] = '*'
     case etB.kind
diff --git a/compiler/pathutils.nim b/compiler/pathutils.nim
index ef0fa4abd..03fcfe07e 100644
--- a/compiler/pathutils.nim
+++ b/compiler/pathutils.nim
@@ -114,7 +114,7 @@ proc canon(x: string; result: var string; state: var int) =
       if d > 0: setLen(result, d-1)
     elif isDot(x, b):
       discard "discard the dot"
-    elif b[1] > b[0]:
+    elif b[1] >= b[0]:
       if result.len > 0 and result[^1] != DirSep:
         result.add DirSep
       result.add substr(x, b[0], b[1])
diff --git a/lib/pure/typetraits.nim b/lib/pure/typetraits.nim
index e9579e824..c53b68864 100644
--- a/lib/pure/typetraits.nim
+++ b/lib/pure/typetraits.nim
@@ -35,8 +35,13 @@ proc `$`*(t: typedesc): string =
   ## An alias for `name`.
   name(t)
 
-proc arity*(t: typedesc): int {.magic: "TypeTrait".}
-  ## Returns the arity of the given type
+proc arity*(t: typedesc): int {.magic: "TypeTrait".} =
+  ## Returns the arity of the given type. This is the number of "type" components or
+  ## the number of generic parameters a given type ``t`` has.
+  runnableExamples:
+    assert arity(seq[string]) == 1
+    assert arity(array[3, int]) == 2
+    assert arity((int, int, float, string)) == 4
 
 proc genericHead*(t: typedesc): typedesc {.magic: "TypeTrait".}
   ## Accepts an instantiated generic type and returns its
@@ -47,11 +52,11 @@ proc genericHead*(t: typedesc): typedesc {.magic: "TypeTrait".}
   ##   seq[int].genericHead[float] will be seq[float]
   ##
   ## A compile-time error will be produced if the supplied type
-  ## is not generic
+  ## is not generic.
 
 proc stripGenericParams*(t: typedesc): typedesc {.magic: "TypeTrait".}
   ## This trait is similar to `genericHead`, but instead of producing
-  ## error for non-generic types, it will just return them unmodified
+  ## error for non-generic types, it will just return them unmodified.
 
 proc supportsCopyMem*(t: typedesc): bool {.magic: "TypeTrait".}
   ## This trait returns true iff the type ``t`` is safe to use for
diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim
index df13ab628..61835e0f7 100644
--- a/lib/system/sysio.nim
+++ b/lib/system/sysio.nim
@@ -145,10 +145,9 @@ proc readLine(f: File, line: var TaintedString): bool =
   var pos = 0
 
   # Use the currently reserved space for a first try
-  var sp = line.string.len
-  if sp == 0:
-    sp = 80
-    line.string.setLen(sp)
+  var sp = max(line.string.len, 80)
+  line.string.setLen(sp)
+
   while true:
     # memset to \L so that we can tell how far fgets wrote, even on EOF, where
     # fgets doesn't append an \L
diff --git a/tests/assert/tfailedassert_stacktrace.nim b/tests/assert/tfailedassert_stacktrace.nim
index 43171ef6c..6505f189c 100644
--- a/tests/assert/tfailedassert_stacktrace.nim
+++ b/tests/assert/tfailedassert_stacktrace.nim
@@ -1,13 +1,31 @@
 discard """
-  output: '''
-tfailedassert_stacktrace.nim(16) tfailedassert_stacktrace
-tfailedassert_stacktrace.nim(15) foo
-system.nim(3778)         failedAssertImpl
-system.nim(3771)         raiseAssert
-system.nim(2818)         sysFatal
-'''
+  output: '''true'''
 """
 
+const expected = """
+tfailedassert_stacktrace.nim(34) tfailedassert_stacktrace
+tfailedassert_stacktrace.nim(33) foo
+system.nim(*)         failedAssertImpl
+system.nim(*)         raiseAssert
+system.nim(*)         sysFatal"""
+
+proc tmatch(x, p: string): bool =
+  var i = 0
+  var k = 0
+  while i < p.len:
+    if p[i] == '*':
+      let oldk = k
+      while k < x.len and x[k] in {'0'..'9'}: inc k
+      # no digit skipped?
+      if oldk == k: return false
+      inc i
+    elif k < x.len and p[i] == x[k]:
+      inc i
+      inc k
+    else:
+      return false
+  while k < x.len and x[k] in {' ', '\L', '\C'}: inc k
+  result = i >= p.len and k >= x.len
 
 
 try:
@@ -16,4 +34,5 @@ try:
   foo()
 except AssertionError:
   let e = getCurrentException()
-  echo e.getStackTrace
+  let trace = e.getStackTrace
+  echo tmatch(trace, expected)
diff --git a/tests/async/tasyncfilewrite.nim b/tests/async/tasyncfilewrite.nim
index cda612bae..8439778ca 100644
--- a/tests/async/tasyncfilewrite.nim
+++ b/tests/async/tasyncfilewrite.nim
@@ -6,12 +6,14 @@ string 3'''
 # bug #5532
 import os, asyncfile, asyncdispatch
 
-removeFile("test.txt")
-let f = openAsync("test.txt", fmWrite)
+const F = "test_async.txt"
+
+removeFile(F)
+let f = openAsync(F, fmWrite)
 var futs = newSeq[Future[void]]()
 for i in 1..3:
   futs.add(f.write("string " & $i & "\n"))
 waitFor(all(futs))
 f.close()
-echo readFile("test.txt")
+echo readFile(F)
 
diff --git a/tests/ccgbugs/t8967.nim b/tests/ccgbugs/t8967.nim
new file mode 100644
index 000000000..e342b7eae
--- /dev/null
+++ b/tests/ccgbugs/t8967.nim
@@ -0,0 +1,10 @@
+discard """
+  targets: "c cpp"
+"""
+
+import marshal
+
+let orig: set[char] = {'A'..'Z'}
+let m = $$orig
+let old = to[set[char]](m)
+doAssert orig - old == {}