From d5d975ceef2bbed02629123c110076f5617f5671 Mon Sep 17 00:00:00 2001 From: Rayner De Los Santos F Date: Fri, 3 Mar 2017 08:47:13 -0400 Subject: [PATCH 01/12] Only remove scheme when there's a TLS request ("https") If condition, for not removing the scheme when proxied connection isn't a TLS request ("http://..."). --- lib/pure/httpclient.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 662e754714..7f666fb357 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -719,9 +719,9 @@ proc generateHeaders(requestUrl: Uri, httpMethod: string, if requestUrl.query.len > 0: result.add("?" & requestUrl.query) else: - # Remove the 'http://' from the URL for CONNECT requests. + # Remove the 'http://' from the URL for CONNECT requests for TLS connections. var modifiedUrl = requestUrl - modifiedUrl.scheme = "" + if requestUrl.scheme == "https": modifiedUrl.scheme = "" result.add($modifiedUrl) # HTTP/1.1\c\l From 93305443aa0efc94906f4977f5eb68748addd426 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 4 Mar 2017 11:13:08 +0100 Subject: [PATCH 02/12] close #5472 nre tests should be run (#5474) nre tests were just being compiled - changed so that a failure causes exit code to defer causing `tester` to report it as a failure --- tests/stdlib/tnre.nim | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/stdlib/tnre.nim b/tests/stdlib/tnre.nim index 85792b81e0..030319ebff 100644 --- a/tests/stdlib/tnre.nim +++ b/tests/stdlib/tnre.nim @@ -1,3 +1,25 @@ +discard """ +# Since the tests for nre are all bundled together we treat failure in one test as an nre failure +# When running 'tests/testament/tester' a failed check() in the test suite will cause the exit +# codes to differ and be reported as a failure + + output: + '''[Suite] Test NRE initialization + +[Suite] captures + +[Suite] find + +[Suite] string splitting + +[Suite] match + +[Suite] replace + +[Suite] escape strings + +[Suite] Misc tests''' +""" import nre import nre.init import nre.captures From d1d32f657adb957898f73520eadddc5e1df8ca5d Mon Sep 17 00:00:00 2001 From: Fabian Keller Date: Sun, 5 Mar 2017 10:44:25 +0100 Subject: [PATCH 03/12] tiny docstring fix; fixes #5483 (#5484) --- lib/pure/terminal.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/terminal.nim b/lib/pure/terminal.nim index 31278eabf4..87c663c3df 100644 --- a/lib/pure/terminal.nim +++ b/lib/pure/terminal.nim @@ -589,7 +589,7 @@ macro styledWriteLine*(f: File, m: varargs[expr]): stmt = ## .. code-block:: nim ## ## proc error(msg: string) = - ## styleWriteLine(stderr, fgRed, "Error: ", resetStyle, msg) + ## styledWriteLine(stderr, fgRed, "Error: ", resetStyle, msg) ## let m = callsite() var reset = false From 643b7f8650aca702d9fd4bbe9ccd8fe915077a39 Mon Sep 17 00:00:00 2001 From: David Krause Date: Sun, 5 Mar 2017 20:17:43 +0100 Subject: [PATCH 04/12] Fix for #5482, let OrderedTable accept multiple keys (#5485) --- lib/pure/collections/tables.nim | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 00a81b8d5e..408394efd8 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -754,7 +754,7 @@ proc newOrderedTable*[A, B](initialSize=64): OrderedTableRef[A, B] = proc newOrderedTable*[A, B](pairs: openArray[(A, B)]): OrderedTableRef[A, B] = ## creates a new ordered hash table that contains the given `pairs`. result = newOrderedTable[A, B](rightSize(pairs.len)) - for key, val in items(pairs): result[key] = val + for key, val in items(pairs): result.add(key, val) proc `$`*[A, B](t: OrderedTableRef[A, B]): string = ## The `$` operator for ordered hash tables. @@ -1241,3 +1241,17 @@ when isMainModule: clearTable.clear() doAssert(not clearTable.hasKey(123123)) doAssert clearTable.getOrDefault(42) == nil + + block: #5482 + var a = [("wrong?","foo"), ("wrong?", "foo2")].newOrderedTable() + var b = newOrderedTable[string, string](initialSize=2) + b.add("wrong?", "foo") + b.add("wrong?", "foo2") + assert a == b + + block: #5482 + var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable() + var b = newOrderedTable[string, string](initialSize=2) + b.add("wrong?", "foo") + b.add("wrong?", "foo2") + assert a == b \ No newline at end of file From 8c0e27e8d907931c8cb3483edbdd90d114563135 Mon Sep 17 00:00:00 2001 From: Araq Date: Mon, 6 Mar 2017 18:25:27 +0100 Subject: [PATCH 05/12] fixes #5481 --- compiler/ccgtrav.nim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim index 457093c617..982f88cbdc 100644 --- a/compiler/ccgtrav.nim +++ b/compiler/ccgtrav.nim @@ -32,6 +32,9 @@ proc genTraverseProc(c: var TTraversalClosure, accessor: Rope, n: PNode; if (n.sons[0].kind != nkSym): internalError(n.info, "genTraverseProc") var p = c.p let disc = n.sons[0].sym + if disc.loc.r == nil: fillObjectFields(c.p.module, typ) + if disc.loc.t == nil: + internalError(n.info, "genTraverseProc()") lineF(p, cpsStmts, "switch ($1.$2) {$n", [accessor, disc.loc.r]) for i in countup(1, sonsLen(n) - 1): let branch = n.sons[i] From 4a77b66b19e42b89308817ddc3749e316937e631 Mon Sep 17 00:00:00 2001 From: Araq Date: Mon, 6 Mar 2017 18:38:15 +0100 Subject: [PATCH 06/12] fixes #5478 --- compiler/semtempl.nim | 8 ++++---- tests/template/tmixin_in_proc.nim | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 tests/template/tmixin_in_proc.nim diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index f809b6a501..5ac2e678ae 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -144,10 +144,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode proc openScope(c: var TemplCtx) = openScope(c.c) - inc c.scopeN proc closeScope(c: var TemplCtx) = - dec c.scopeN closeScope(c.c) proc semTemplBodyScope(c: var TemplCtx, n: PNode): PNode = @@ -172,7 +170,6 @@ proc newGenSym(kind: TSymKind, n: PNode, c: var TemplCtx): PSym = result = newSym(kind, considerQuotedIdent(n), c.owner, n.info) incl(result.flags, sfGenSym) incl(result.flags, sfShadowed) - #if c.scopeN == 0: incl(result.flags, sfFromGeneric) proc addLocalDecl(c: var TemplCtx, n: var PNode, k: TSymKind) = # locals default to 'gensym': @@ -275,10 +272,12 @@ proc semRoutineInTemplBody(c: var TemplCtx, n: PNode, k: TSymKind): PNode = for i in patternPos..miscPos: n.sons[i] = semTemplBody(c, n.sons[i]) # open scope for locals + inc c.scopeN openScope(c) n.sons[bodyPos] = semTemplBody(c, n.sons[bodyPos]) # close scope for locals closeScope(c) + dec c.scopeN # close scope for parameters closeScope(c) @@ -346,7 +345,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = of nkBindStmt: result = semBindStmt(c.c, n, c.toBind) of nkMixinStmt: - result = semMixinStmt(c.c, n, c.toMixin) + if c.scopeN > 0: result = semTemplBodySons(c, n) + else: result = semMixinStmt(c.c, n, c.toMixin) of nkEmpty, nkSym..nkNilLit: discard of nkIfStmt: diff --git a/tests/template/tmixin_in_proc.nim b/tests/template/tmixin_in_proc.nim new file mode 100644 index 0000000000..fede9290b2 --- /dev/null +++ b/tests/template/tmixin_in_proc.nim @@ -0,0 +1,22 @@ +discard """ + output: '''monkey''' +""" +# bug #5478 +template creature*(name: untyped) = + type + name*[T] = object + color: T + + proc `init name`*[T](c: T): name[T] = + mixin transform + transform() + +creature(Lion) + +type Monkey* = object +proc transform*() = + echo "monkey" + +var + m: Monkey + y = initLion(m) #this one failed to compile From 3fa428c88beb376784e9683edd83b1cebc857f08 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 7 Mar 2017 00:27:47 +0100 Subject: [PATCH 07/12] fixes #5467 --- compiler/renderer.nim | 6 +++++- compiler/semexprs.nim | 4 ++++ tests/template/tgensymregression.nim | 26 +++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 5ce8414d60..badcaea661 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -851,7 +851,11 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"') else: gsub(g, n.sons[1]) - of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: gsub(g, n.sons[1]) + of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: + if n.len >= 2: + gsub(g, n.sons[1]) + else: + put(g, tkSymbol, "(wrong conv)") of nkCast: put(g, tkCast, "cast") put(g, tkBracketLe, "[") diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ba60442d6f..a419cd0008 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2324,12 +2324,16 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = of nkIfExpr, nkIfStmt: result = semIf(c, n) of nkHiddenStdConv, nkHiddenSubConv, nkConv, nkHiddenCallConv: checkSonsLen(n, 2) + considerGenSyms(c, n) of nkStringToCString, nkCStringToString, nkObjDownConv, nkObjUpConv: checkSonsLen(n, 1) + considerGenSyms(c, n) of nkChckRangeF, nkChckRange64, nkChckRange: checkSonsLen(n, 3) + considerGenSyms(c, n) of nkCheckedFieldExpr: checkMinSonsLen(n, 2) + considerGenSyms(c, n) of nkTableConstr: result = semTableConstr(c, n) of nkClosedSymChoice, nkOpenSymChoice: diff --git a/tests/template/tgensymregression.nim b/tests/template/tgensymregression.nim index e758e0d9ac..0fadbde417 100644 --- a/tests/template/tgensymregression.nim +++ b/tests/template/tgensymregression.nim @@ -3,7 +3,8 @@ discard """ [0.0, 0.0, 0.0, 0.0] -5050''' +5050 +123''' """ template mathPerComponent(op: untyped): untyped = @@ -47,3 +48,26 @@ proc main2() = echo s main2() + +# bug #5467 +import macros + +converter int2string(x: int): string = $x + +template wrap(body: typed): untyped = + body + +macro makeProc(): typed = + # Make a template tree + result = (quote do: + proc someProc* = + wrap do: + let x = 123 + # Implicit conversion here + let s: string = x + echo s + ) + +makeProc() + +someProc() From 24ec36f097588b4551c87c58de4fec5f1c7135e9 Mon Sep 17 00:00:00 2001 From: Anatoly Galiulin Date: Tue, 7 Mar 2017 15:56:16 +0700 Subject: [PATCH 08/12] Fix iconv import on freebsd and netbsd (#5490) --- lib/pure/encodings.nim | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/pure/encodings.nim b/lib/pure/encodings.nim index f89786c1c8..5840d443db 100644 --- a/lib/pure/encodings.nim +++ b/lib/pure/encodings.nim @@ -277,16 +277,21 @@ else: var errno {.importc, header: "".}: cint + when defined(freebsd) or defined(netbsd): + {.pragma: importIconv, cdecl, header: "".} + else: + {.pragma: importIconv, cdecl, dynlib: iconvDll.} + proc iconvOpen(tocode, fromcode: cstring): EncodingConverter {. - importc: "iconv_open", cdecl, dynlib: iconvDll.} + importc: "iconv_open", importIconv.} proc iconvClose(c: EncodingConverter) {. - importc: "iconv_close", cdecl, dynlib: iconvDll.} + importc: "iconv_close", importIconv.} proc iconv(c: EncodingConverter, inbuf: var cstring, inbytesLeft: var int, outbuf: var cstring, outbytesLeft: var int): int {. - importc: "iconv", cdecl, dynlib: iconvDll.} + importc: "iconv", importIconv.} proc iconv(c: EncodingConverter, inbuf: pointer, inbytesLeft: pointer, outbuf: var cstring, outbytesLeft: var int): int {. - importc: "iconv", cdecl, dynlib: iconvDll.} + importc: "iconv", importIconv.} proc getCurrentEncoding*(): string = ## retrieves the current encoding. On Unix, always "UTF-8" is returned. From 9608acf2009f09d3a7176aa8e1c5f7790f22b070 Mon Sep 17 00:00:00 2001 From: Ruslan Mustakov Date: Tue, 7 Mar 2017 15:56:46 +0700 Subject: [PATCH 09/12] Check if __STDC_VERSION__ is defined (#5488) --- lib/nimbase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/nimbase.h b/lib/nimbase.h index d6763f8ff5..df715188f1 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -96,7 +96,7 @@ __clang__ NIM_THREADVAR declaration based on http://stackoverflow.com/questions/18298280/how-to-declare-a-variable-as-thread-local-portably */ -#if __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__ # define NIM_THREADVAR _Thread_local #elif defined _WIN32 && ( \ defined _MSC_VER || \ From c2630b338d6ce8e75c45bf116e8f2b687850ce4f Mon Sep 17 00:00:00 2001 From: Andrea Griffini Date: Tue, 7 Mar 2017 10:01:07 +0100 Subject: [PATCH 10/12] Typo (#5495) --- doc/manual/types.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/types.txt b/doc/manual/types.txt index c81bc042ba..aed09c9512 100644 --- a/doc/manual/types.txt +++ b/doc/manual/types.txt @@ -143,7 +143,7 @@ affected by this rule: ``-``, ``+``, ``*``, ``min``, ``max``, ``succ``, ``pred``, ``mod``, ``div``, ``%%``, ``and`` (bitwise ``and``). Bitwise ``and`` only produces a ``range`` if one of its operands is a -constant *x* so that (x+1) is a number of two. +constant *x* so that (x+1) is a power of two. (Bitwise ``and`` is then a ``%%`` operation.) This means that the following code is accepted: From 9e170f1159f739edb243348fb8a214a3f8bf95d0 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Tue, 7 Mar 2017 12:19:31 +0100 Subject: [PATCH 11/12] Fix typo in readme.md (there is no "build-essentials" package in Debian) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 865724b716..34208eb5e9 100644 --- a/readme.md +++ b/readme.md @@ -43,7 +43,7 @@ Next, to build from source you will need: ``Visual C++`` or ``Intel C++``. It is recommended to use ``gcc`` 3.x or later. * Either ``git`` or ``wget`` to download the needed source repositories. - * The ``build-essentials`` package when using ``gcc`` on Ubuntu (and likely + * The ``build-essential`` package when using ``gcc`` on Ubuntu (and likely other distros as well). Then, if you are on a \*nix system or Windows, the following steps should compile From 7dc8dcb581a2de06472c35868504c7aafe69ca81 Mon Sep 17 00:00:00 2001 From: David Krause Date: Tue, 7 Mar 2017 16:58:38 +0100 Subject: [PATCH 12/12] fixes #5487 (#5494) --- lib/pure/collections/tables.nim | 64 +++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 408394efd8..b6c00966f7 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -618,11 +618,19 @@ proc `$`*[A, B](t: OrderedTable[A, B]): string = proc `==`*[A, B](s, t: OrderedTable[A, B]): bool = ## The `==` operator for ordered hash tables. Returns true iff both the ## content and the order are equal. - if s.counter == t.counter: - forAllOrderedPairs: - if s.data[h] != t.data[h]: return false - result = true - else: result = false + if s.counter != t.counter: + return false + var ht = t.first + var hs = s.first + while ht >= 0 and hs >= 0: + var nxtt = t.data[ht].next + var nxts = s.data[hs].next + if isFilled(t.data[ht].hcode) and isFilled(s.data[hs].hcode): + if (s.data[hs].key != t.data[ht].key) and (s.data[hs].val != t.data[ht].val): + return false + ht = nxtt + hs = nxts + return true proc sort*[A, B](t: var OrderedTable[A, B], cmp: proc (x,y: (A, B)): int) = @@ -1233,17 +1241,18 @@ when isMainModule: t.inc(testKey,3) doAssert 3 == t.getOrDefault(testKey) - # Clear tests - var clearTable = newTable[int, string]() - clearTable[42] = "asd" - clearTable[123123] = "piuyqwb " - doAssert clearTable[42] == "asd" - clearTable.clear() - doAssert(not clearTable.hasKey(123123)) - doAssert clearTable.getOrDefault(42) == nil + block: + # Clear tests + var clearTable = newTable[int, string]() + clearTable[42] = "asd" + clearTable[123123] = "piuyqwb " + doAssert clearTable[42] == "asd" + clearTable.clear() + doAssert(not clearTable.hasKey(123123)) + doAssert clearTable.getOrDefault(42) == nil block: #5482 - var a = [("wrong?","foo"), ("wrong?", "foo2")].newOrderedTable() + var a = [("wrong?","foo"), ("wrong?", "foo2")].newOrderedTable() var b = newOrderedTable[string, string](initialSize=2) b.add("wrong?", "foo") b.add("wrong?", "foo2") @@ -1254,4 +1263,29 @@ when isMainModule: var b = newOrderedTable[string, string](initialSize=2) b.add("wrong?", "foo") b.add("wrong?", "foo2") - assert a == b \ No newline at end of file + assert a == b + + block: #5487 + var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable() + var b = newOrderedTable[string, string]() # notice, default size! + b.add("wrong?", "foo") + b.add("wrong?", "foo2") + assert a == b + + block: #5487 + var a = [("wrong?","foo"), ("wrong?", "foo2")].newOrderedTable() + var b = newOrderedTable[string, string]() # notice, default size! + b.add("wrong?", "foo") + b.add("wrong?", "foo2") + assert a == b + + block: + var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable() + var b = [("wrong?","foo"), ("wrong?", "foo2")].newOrderedTable() + var c = newOrderedTable[string, string]() # notice, default size! + c.add("wrong?", "foo") + c.add("wrong?", "foo2") + assert a == b + assert a == c + +