From 3aa36a85680d85e063c9b1f776300bada69cb79f Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 4 May 2013 02:22:38 +0200 Subject: [PATCH] bugfixes --- compiler/cgen.nim | 1 + compiler/semexprs.nim | 6 ++++++ compiler/semstmts.nim | 13 +++++++++++-- lib/pure/httpclient.nim | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/compiler/cgen.nim b/compiler/cgen.nim index cb796e4562..f09252b48e 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -600,6 +600,7 @@ proc loadDynamicLib(m: BModule, lib: PLib) = [loadlib, getStrLit(m, lib.path.strVal)]) else: var p = newProc(nil, m) + p.options = p.options - {optStackTrace, optEndb} var dest: TLoc initLocExpr(p, lib.path, dest) app(m.s[cfsVars], p.s(cpsLocals)) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index cba4ed0812..71e44aa43e 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1146,6 +1146,12 @@ proc semProcBody(c: PContext, n: PNode): PNode = # discard it. This is bad for chaining but nicer for C wrappers. # ambiguous :-( result.typ = nil + elif result.kind == nkStmtListExpr and result.typ.kind == tyNil: + # to keep backwards compatibility bodies like: + # nil + # # comment + # are not expressions: + fixNilType(result) else: var a = newNodeI(nkAsgn, n.info, 2) a.sons[0] = newSymNode(c.p.resultSym) diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 2811c107a6..4146b69a1a 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -103,7 +103,16 @@ proc semExprBranchScope(c: PContext, n: PNode): PNode = result = semExprBranch(c, n) closeScope(c.tab) +proc meaningfulStmt(n: PNode): PNode = + assert n.kind == nkStmtListExpr + var last = n.len-1 + while last > 0 and n.sons[last].kind in {nkPragma, nkCommentStmt, nkEmpty}: + dec last + result = n.sons[last] + proc ImplicitlyDiscardable(n: PNode): bool = + var n = n + while n.kind == nkStmtListExpr: n = meaningfulStmt(n) result = isCallExpr(n) and n.sons[0].kind == nkSym and sfDiscardable in n.sons[0].sym.flags @@ -115,6 +124,8 @@ proc fixNilType(n: PNode) = for it in n: fixNilType(it) n.typ = nil +var EnforceVoidContext = PType(kind: tyStmt) + proc discardCheck(result: PNode) = if result.typ != nil and result.typ.kind notin {tyStmt, tyEmpty}: if result.kind == nkNilLit: @@ -1060,8 +1071,6 @@ proc semStaticStmt(c: PContext, n: PNode): PNode = result = newNodeI(nkDiscardStmt, n.info, 1) result.sons[0] = emptyNode -var EnforceVoidContext = PType(kind: tyStmt) - proc semStmtList(c: PContext, n: PNode): PNode = # these must be last statements in a block: const diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index ab6cb04a9c..15cc6abb83 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -264,10 +264,10 @@ proc request*(url: string, httpMethod = httpGET, extraHeaders = "", if r.scheme == "https": when defined(ssl): sslContext.wrapSocket(s) + port = TPort(443) else: raise newException(EHttpRequestErr, "SSL support is not available. Cannot connect over SSL.") - port = TPort(443) if r.port != "": port = TPort(r.port.parseInt)