From 9fa477de755daf76c6a2302f58553d10caa061e9 Mon Sep 17 00:00:00 2001 From: skilchen Date: Sat, 15 Sep 2018 01:04:23 +0200 Subject: more efficient fix for #8961 --- lib/system/sysio.nim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index df13ab628..672d0e0f1 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -149,6 +149,12 @@ proc readLine(f: File, line: var TaintedString): bool = if sp == 0: sp = 80 line.string.setLen(sp) + else: + when not defined(nimscript): + sp = cint(cast[PGenericSeq](line.string).space) + else: + line.string.setLen(sp + 1) + while true: # memset to \L so that we can tell how far fgets wrote, even on EOF, where # fgets doesn't append an \L -- cgit 1.4.1-2-gfad0 From e4902a4a3518c7c27818a4004218ed341394df6e Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 15 Sep 2018 10:06:02 +0200 Subject: make tfailedassert_stacktrace.nim more robust --- tests/assert/tfailedassert_stacktrace.nim | 35 ++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 8 deletions(-) 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) -- cgit 1.4.1-2-gfad0 From 6af6ca6351f29d180f86a8521cf2f46f0e6934a7 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 15 Sep 2018 00:09:50 +0200 Subject: Fix codegen for set[T] parameters Sometimes sets are materialized as arrays and we must treat them as such: the CPP backend is pickier than the C one and would sometimes produce invalid code. Fixes #8967 --- compiler/ccgexprs.nim | 3 ++- compiler/ccgtypes.nim | 15 ++++++++------- tests/ccgbugs/t8967.nim | 10 ++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 tests/ccgbugs/t8967.nim 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/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 == {} -- cgit 1.4.1-2-gfad0 From 4c347871071541d4e01f8d2c3a0593e84454219c Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 15 Sep 2018 12:21:01 +0200 Subject: make async test more reliable --- tests/async/tasyncfilewrite.nim | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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) -- cgit 1.4.1-2-gfad0 From e4af0fcb6dc2e6d90a89708a1cae0edbeb0b30e4 Mon Sep 17 00:00:00 2001 From: Jörg Wollenschläger Date: Sat, 15 Sep 2018 20:22:04 +0900 Subject: Allow subpaths of names of length 1 --- compiler/pathutils.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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]) -- cgit 1.4.1-2-gfad0 From 0841eaa273be54740fe84afbcb371f85e8854a5e Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 15 Sep 2018 13:46:00 +0200 Subject: typetraits.arity: improve the documentation; fixes #8965 --- lib/pure/typetraits.nim | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/pure/typetraits.nim b/lib/pure/typetraits.nim index e9579e824..f0838415b 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 -- cgit 1.4.1-2-gfad0 From e317745098b95418bc1bc3d76b930ab197d67110 Mon Sep 17 00:00:00 2001 From: skilchen Date: Sat, 15 Sep 2018 14:05:42 +0200 Subject: don't reuse code from 0.18.0 --- lib/system/sysio.nim | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 672d0e0f1..61835e0f7 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -145,15 +145,8 @@ 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) - else: - when not defined(nimscript): - sp = cint(cast[PGenericSeq](line.string).space) - else: - line.string.setLen(sp + 1) + 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 -- cgit 1.4.1-2-gfad0 From 7df722844b8f7a6f56c098677abda98e852a1761 Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 15 Sep 2018 20:32:11 +0200 Subject: typetraits: Dots for sentence endings. --- lib/pure/typetraits.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/typetraits.nim b/lib/pure/typetraits.nim index f0838415b..c53b68864 100644 --- a/lib/pure/typetraits.nim +++ b/lib/pure/typetraits.nim @@ -52,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 -- cgit 1.4.1-2-gfad0