From 99d20f61126d849ceba8148a5429f5a023f949a3 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Mon, 17 Apr 2017 04:50:10 +0800 Subject: [PATCH 01/11] fix redundant time import with different signature (#5715) --- lib/pure/oids.nim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/pure/oids.nim b/lib/pure/oids.nim index e4c97b2609..60b53dbe02 100644 --- a/lib/pure/oids.nim +++ b/lib/pure/oids.nim @@ -69,10 +69,9 @@ var proc genOid*(): Oid = ## generates a new OID. proc rand(): cint {.importc: "rand", header: "", nodecl.} - proc gettime(dummy: ptr cint): cint {.importc: "time", header: "".} proc srand(seed: cint) {.importc: "srand", header: "", nodecl.} - var t = gettime(nil) + var t = getTime().int32 var i = int32(atomicInc(incr)) From 407beef7fd1d39058cec9f3626a75348290b7536 Mon Sep 17 00:00:00 2001 From: Federico Ceratto Date: Mon, 17 Apr 2017 12:54:23 +0100 Subject: [PATCH 02/11] Fix "secure" capitalization See https://tools.ietf.org/html/rfc6265 --- lib/pure/cookies.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/cookies.nim b/lib/pure/cookies.nim index 8090cd49df..ac38c0d8a7 100644 --- a/lib/pure/cookies.nim +++ b/lib/pure/cookies.nim @@ -39,7 +39,7 @@ proc setCookie*(key, value: string, domain = "", path = "", if domain != "": result.add("; Domain=" & domain) if path != "": result.add("; Path=" & path) if expires != "": result.add("; Expires=" & expires) - if secure: result.add("; secure") + if secure: result.add("; Secure") if httpOnly: result.add("; HttpOnly") proc setCookie*(key, value: string, expires: TimeInfo, From 856d04c14616ad6debee6ff0d79d1b31d7e35116 Mon Sep 17 00:00:00 2001 From: Federico Ceratto Date: Mon, 17 Apr 2017 12:58:10 +0100 Subject: [PATCH 03/11] Fix cookie timestamp format #5718 See https://tools.ietf.org/html/rfc6265 --- lib/pure/cookies.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/cookies.nim b/lib/pure/cookies.nim index 8090cd49df..743879e500 100644 --- a/lib/pure/cookies.nim +++ b/lib/pure/cookies.nim @@ -50,7 +50,7 @@ proc setCookie*(key, value: string, expires: TimeInfo, ## ## **Note:** UTC is assumed as the timezone for ``expires``. return setCookie(key, value, domain, path, - format(expires, "ddd',' dd MMM yyyy HH:mm:ss 'UTC'"), + format(expires, "ddd',' dd MMM yyyy HH:mm:ss 'GMT'"), noname, secure, httpOnly) when isMainModule: From 2108dcf0d5bb76b452abe6d1d13f91b6e944cb94 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Mon, 17 Apr 2017 17:59:49 +0200 Subject: [PATCH 04/11] Fix JSON macro bug with ref objects. --- lib/pure/json.nim | 6 +++++- tests/stdlib/tjsonmacro.nim | 32 +++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index b3fc477498..1e408a2232 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1608,7 +1608,11 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = result = processType(typeSym, obj, jsonNode) of nnkSym: let obj = getType(typeSym) - result = processType(typeSym, obj, jsonNode) + if obj.kind == nnkBracketExpr: + # When `Sym "Foo"` turns out to be a `ref object`. + result = createConstructor(obj, jsonNode) + else: + result = processType(typeSym, obj, jsonNode) else: doAssert false, "Unable to create constructor for: " & $typeSym.kind diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 74b0d4dc31..f8ecd4637f 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -159,11 +159,11 @@ when isMainModule: name: string age: int - Data = object + Data1 = object # TODO: Codegen bug when changed to ``Data``. person: Person list: seq[int] - var data = to(jsonNode, Data) + var data = to(jsonNode, Data1) doAssert data.person.name == "Nimmer" doAssert data.person.age == 21 doAssert data.list == @[1, 2, 3, 4] @@ -182,4 +182,30 @@ when isMainModule: } var result = to(node, TestEnum) - doAssert result.field == Bar \ No newline at end of file + doAssert result.field == Bar + + # Test ref type in field. + block: + let jsonNode = parseJson(""" + { + "person": { + "name": "Nimmer", + "age": 21 + }, + "list": [1, 2, 3, 4] + } + """) + + type + Person = ref object + name: string + age: int + + Data = object + person: Person + list: seq[int] + + var data = to(jsonNode, Data) + doAssert data.person.name == "Nimmer" + doAssert data.person.age == 21 + doAssert data.list == @[1, 2, 3, 4] \ No newline at end of file From b829092c9ea2a64360c61754ac57af6f05a3af6c Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Mon, 17 Apr 2017 18:01:25 +0200 Subject: [PATCH 05/11] Add support for BiggestInt in JSON unmarshal macro. --- lib/pure/json.nim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 1e408a2232..b86f9d2b65 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1551,6 +1551,12 @@ proc processType(typeName: NimNode, obj: NimNode, verifyJsonKind(`jsonNode`, {JInt}, astToStr(`jsonNode`)); `jsonNode`.num.int ) + of "biggestint": + result = quote do: + ( + verifyJsonKind(`jsonNode`, {JInt}, astToStr(`jsonNode`)); + `jsonNode`.num + ) of "bool": result = quote do: ( From 793d6efffbee54f2ba00836545f0800b3ab77fd2 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Mon, 17 Apr 2017 18:43:31 +0200 Subject: [PATCH 06/11] Fixes `null` handling for object refs in JSON unmarshal macro. --- lib/pure/json.nim | 29 ++++++++++++++++++++++------- tests/stdlib/tjsonmacro.nim | 13 +++++++++++-- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index b86f9d2b65..d59b6c735f 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1502,7 +1502,7 @@ proc processObjField(field, jsonNode: NimNode): seq[NimNode] = doAssert result.len > 0 proc processType(typeName: NimNode, obj: NimNode, - jsonNode: NimNode): NimNode {.compileTime.} = + jsonNode: NimNode, isRef: bool): NimNode {.compileTime.} = ## Process a type such as ``Sym "float"`` or ``ObjectTy ...``. ## ## Sample ``ObjectTy``: @@ -1524,6 +1524,20 @@ proc processType(typeName: NimNode, obj: NimNode, for field in obj[2]: let nodes = processObjField(field, jsonNode) result.add(nodes) + + # Object might be null. So we need to check for that. + if isRef: + result = quote do: + verifyJsonKind(`jsonNode`, {JObject, JNull}, astToStr(`jsonNode`)) + if `jsonNode`.kind == JNull: + nil + else: + `result` + else: + result = quote do: + verifyJsonKind(`jsonNode`, {JObject}, astToStr(`jsonNode`)); + `result` + of nnkEnumTy: let instType = toIdentNode(getTypeInst(typeName)) let getEnumCall = createGetEnumCall(jsonNode, instType) @@ -1591,7 +1605,7 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = typeName = typeName[0 .. ^12] let obj = getType(typeSym[1]) - result = processType(newIdentNode(typeName), obj, jsonNode) + result = processType(newIdentNode(typeName), obj, jsonNode, true) of "seq": let seqT = typeSym[1] let forLoopI = newIdentNode("i") @@ -1611,21 +1625,21 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = else: # Generic type. let obj = getType(typeSym) - result = processType(typeSym, obj, jsonNode) + result = processType(typeSym, obj, jsonNode, false) of nnkSym: let obj = getType(typeSym) if obj.kind == nnkBracketExpr: # When `Sym "Foo"` turns out to be a `ref object`. result = createConstructor(obj, jsonNode) else: - result = processType(typeSym, obj, jsonNode) + result = processType(typeSym, obj, jsonNode, false) else: doAssert false, "Unable to create constructor for: " & $typeSym.kind doAssert(not result.isNil(), "Constructor not initialised.") proc postProcess(node: NimNode): NimNode -proc postProcessValue(value: NimNode, depth=0): NimNode = +proc postProcessValue(value: NimNode): NimNode = ## Looks for object constructors and calls the ``postProcess`` procedure ## on them. Otherwise it just returns the node as-is. case value.kind @@ -1746,9 +1760,10 @@ macro to*(node: JsonNode, T: typedesc): untyped = doAssert(($typeNode[0]).normalize == "typedesc") result = createConstructor(typeNode[1], node) - result = postProcess(result) + # TODO: Rename postProcessValue and move it (?) + result = postProcessValue(result) - #echo(toStrLit(result)) + echo(toStrLit(result)) when false: import os diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index f8ecd4637f..65dc62e2f5 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -186,7 +186,7 @@ when isMainModule: # Test ref type in field. block: - let jsonNode = parseJson(""" + var jsonNode = parseJson(""" { "person": { "name": "Nimmer", @@ -208,4 +208,13 @@ when isMainModule: var data = to(jsonNode, Data) doAssert data.person.name == "Nimmer" doAssert data.person.age == 21 - doAssert data.list == @[1, 2, 3, 4] \ No newline at end of file + doAssert data.list == @[1, 2, 3, 4] + + jsonNode = parseJson(""" + { + "person": null, + "list": [1, 2, 3, 4] + } + """) + data = to(jsonNode, Data) + doAssert data.person.isNil \ No newline at end of file From 5a4c06dbdce20a8966742d75ea6e5e227c6d1f14 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Mon, 17 Apr 2017 19:47:43 +0200 Subject: [PATCH 07/11] Support JInt fields for 'float' in JSON umarshal macro. --- lib/pure/json.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index d59b6c735f..2430ba38f2 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1550,8 +1550,8 @@ proc processType(typeName: NimNode, obj: NimNode, of "float": result = quote do: ( - verifyJsonKind(`jsonNode`, {JFloat}, astToStr(`jsonNode`)); - `jsonNode`.fnum + verifyJsonKind(`jsonNode`, {JFloat, JInt}, astToStr(`jsonNode`)); + if `jsonNode`.kind == JFloat: `jsonNode`.fnum else: `jsonNode`.num.float ) of "string": result = quote do: From 03ddfddcaed5237ef48a959e45a49c4693fd72e4 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Mon, 17 Apr 2017 20:04:24 +0200 Subject: [PATCH 08/11] Add test for previous commit. --- lib/pure/json.nim | 2 +- tests/stdlib/tjsonmacro.nim | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 2430ba38f2..a6659638de 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1763,7 +1763,7 @@ macro to*(node: JsonNode, T: typedesc): untyped = # TODO: Rename postProcessValue and move it (?) result = postProcessValue(result) - echo(toStrLit(result)) + # echo(toStrLit(result)) when false: import os diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 65dc62e2f5..323b3e1eec 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -217,4 +217,13 @@ when isMainModule: } """) data = to(jsonNode, Data) - doAssert data.person.isNil \ No newline at end of file + doAssert data.person.isNil + + block: + type + FooBar = object + field: float + + let x = parseJson("""{ "field": 5}""") + let data = to(x, FooBar) + doAssert data.field == 5.0 \ No newline at end of file From fa592f3aada5d07b53bef8799fa40901cf6c0d44 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Tue, 18 Apr 2017 18:35:44 -0400 Subject: [PATCH 09/11] Minor: spelling correction in tables.nim (#5727) --- lib/pure/collections/tables.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index b6c00966f7..969802cfcd 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -785,7 +785,7 @@ proc sort*[A, B](t: OrderedTableRef[A, B], t[].sort(cmp) proc del*[A, B](t: var OrderedTable[A, B], key: A) = - ## deletes `key` from ordered hash table `t`. O(n) comlexity. + ## deletes `key` from ordered hash table `t`. O(n) complexity. var n: OrderedKeyValuePairSeq[A, B] newSeq(n, len(t.data)) var h = t.first @@ -804,7 +804,7 @@ proc del*[A, B](t: var OrderedTable[A, B], key: A) = h = nxt proc del*[A, B](t: var OrderedTableRef[A, B], key: A) = - ## deletes `key` from ordered hash table `t`. O(n) comlexity. + ## deletes `key` from ordered hash table `t`. O(n) complexity. t[].del(key) # ------------------------------ count tables ------------------------------- From 43dae68a421a92f2003df7c92fa8679df71823d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Wed, 19 Apr 2017 00:36:28 +0200 Subject: [PATCH 10/11] inter.txt: fix git bisect example (#5722) --- doc/intern.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/intern.txt b/doc/intern.txt index d0aaa283a5..dadb0eb05a 100644 --- a/doc/intern.txt +++ b/doc/intern.txt @@ -157,7 +157,7 @@ compilation fails. This exit code tells ``git bisect`` to skip the current commit.:: git bisect start bad-commit good-commit - git bisect ./koch -r c test-source.nim + git bisect run ./koch temp -r c test-source.nim The compiler's architecture =========================== From b7bffa35c70eb1a55fe9e35307ba4e99e48abe69 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 19 Apr 2017 08:40:05 +0200 Subject: [PATCH 11/11] attempt to make sighashes produce smaller diffs --- compiler/lowerings.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index 245cc5f613..3a03252fd5 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -115,7 +115,7 @@ proc createObj*(owner: PSym, info: TLineInfo): PType = incl result.flags, tfFinal result.n = newNodeI(nkRecList, info) when true: - let s = newSym(skType, getIdent("Env_" & info.toFilename & "_" & $info.line), + let s = newSym(skType, getIdent("Env_" & info.toFilename), owner, info) incl s.flags, sfAnon s.typ = result