diff options
author | Jacek Sieka <arnetheduck@gmail.com> | 2016-08-17 18:49:36 +0800 |
---|---|---|
committer | Jacek Sieka <arnetheduck@gmail.com> | 2016-08-17 18:49:36 +0800 |
commit | 4d558e2608799e6ad136804d9cad5a2dc32d25a5 (patch) | |
tree | ae51a376e5a387623195c5afa7e1f565c0be9bf8 | |
parent | 3cd4cf4320cba2795d2a9021c55a20cbbe2b04ae (diff) | |
parent | 006207742f43f4e793b8681c38b879d74d3f8672 (diff) | |
download | Nim-4d558e2608799e6ad136804d9cad5a2dc32d25a5.tar.gz |
Merge remote-tracking branch 'origin/devel' into compiler-cleanup
-rw-r--r-- | compiler/ccgexprs.nim | 3 | ||||
-rw-r--r-- | compiler/lowerings.nim | 2 | ||||
-rw-r--r-- | compiler/semmagic.nim | 8 | ||||
-rw-r--r-- | compiler/sempass2.nim | 2 | ||||
-rw-r--r-- | compiler/sigmatch.nim | 12 | ||||
-rw-r--r-- | compiler/types.nim | 10 | ||||
-rw-r--r-- | lib/nimbase.h | 2 | ||||
-rw-r--r-- | lib/pure/ioselects/ioselectors_kqueue.nim | 4 | ||||
-rw-r--r-- | lib/pure/net.nim | 8 | ||||
-rw-r--r-- | tests/async/tioselectors.nim | 8 | ||||
-rw-r--r-- | tests/generics/ttable_alias.nim | 7 |
11 files changed, 45 insertions, 21 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 8d0ead368..4761b725c 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1944,7 +1944,8 @@ proc exprComplexConst(p: BProc, n: PNode, d: var TLoc) = putDataIntoDest(p, d, t, tmp) # This fixes bug #4551, but we really need better dataflow # analysis to make this 100% safe. - d.s = OnStatic + if t.kind notin {tySequence, tyString}: + d.s = OnStatic proc expr(p: BProc, n: PNode, d: var TLoc) = case n.kind diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index cdea2a4ff..36eb24653 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -578,6 +578,8 @@ proc wrapProcForSpawn*(owner: PSym; spawnExpr: PNode; retType: PType; var fn = n.sons[0] # templates and macros are in fact valid here due to the nature of # the transformation: + if fn.kind == nkClosure: + localError(n.info, "closure in spawn environment is not allowed") if not (fn.kind == nkSym and fn.sym.kind in {skProc, skTemplate, skMacro, skMethod, skConverter}): # for indirect calls we pass the function pointer in the scratchObj diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index 629c1b939..806b00db6 100644 --- a/compiler/semmagic.nim +++ b/compiler/semmagic.nim @@ -114,8 +114,12 @@ proc semTypeTraits(c: PContext, n: PNode): PNode = proc semOrd(c: PContext, n: PNode): PNode = result = n - result.typ = makeRangeType(c, firstOrd(n.sons[1].typ), - lastOrd(n.sons[1].typ), n.info) + let parType = n.sons[1].typ + if isOrdinalType(parType) or parType.kind == tySet: + result.typ = makeRangeType(c, firstOrd(parType), lastOrd(parType), n.info) + else: + localError(n.info, errOrdinalTypeExpected) + result.typ = errorType(c) proc semBindSym(c: PContext, n: PNode): PNode = result = copyNode(n) diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 72f289e4e..f633c455a 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -528,7 +528,7 @@ proc isOwnedProcVar(n: PNode; owner: PSym): bool = proc trackOperand(tracked: PEffects, n: PNode, paramType: PType) = let a = skipConvAndClosure(n) let op = a.typ - if op != nil and op.kind == tyProc and n.kind != nkNilLit: + if op != nil and op.kind == tyProc and n.skipConv.kind != nkNilLit: internalAssert op.n.sons[0].kind == nkEffectList var effectList = op.n.sons[0] let s = n.skipConv diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 3918bb74b..ce4f893ea 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -985,11 +985,9 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = of tyGenericBody: considerPreviousT: - let ff = lastSon(f) - var depth = 0 - if a.kind == tyGenericInst and (a.sons[0] == f): #or (ff != nil and ff.kind == tyObject and isGenericSubtype(a.sons[0], ff, depth))): - c.inheritancePenalty += depth + if a.kind == tyGenericInst and a.sons[0] == f: bindingRet isGeneric + let ff = lastSon(f) if ff != nil: result = typeRel(c, ff, a) @@ -1006,7 +1004,9 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = for i in countup(1, sonsLen(f) - 1): if x.sons[i].kind == tyGenericParam: internalError("wrong instantiated type!") - elif typeRel(c, f.sons[i], x.sons[i]) <= isSubtype: return + elif typeRel(c, f.sons[i], x.sons[i]) <= isSubtype: + # Workaround for regression #4589 + if f.sons[i].kind != tyTypeDesc: return c.inheritancePenalty += depth result = isGeneric else: @@ -1024,7 +1024,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = # # we steal the generic parameters from the tyGenericBody: for i in countup(1, sonsLen(f) - 1): - var x = PType(idTableGet(c.bindings, genericBody.sons[i-1])) + let x = PType(idTableGet(c.bindings, genericBody.sons[i-1])) if x == nil: discard "maybe fine (for eg. a==tyNil)" elif x.kind in {tyGenericInvocation, tyGenericParam}: diff --git a/compiler/types.nim b/compiler/types.nim index 79d834f26..94a53b57d 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -144,10 +144,12 @@ proc elemType*(t: PType): PType = proc isOrdinalType(t: PType): bool = assert(t != nil) - # caution: uint, uint64 are no ordinal types! - result = t.kind in {tyChar,tyInt..tyInt64,tyUInt8..tyUInt32,tyBool,tyEnum} or - (t.kind in {tyRange, tyOrdinal, tyConst, tyMutable, tyGenericInst}) and - isOrdinalType(t.sons[0]) + const + # caution: uint, uint64 are no ordinal types! + baseKinds = {tyChar,tyInt..tyInt64,tyUInt8..tyUInt32,tyBool,tyEnum} + parentKinds = {tyRange, tyOrdinal, tyConst, tyMutable, tyGenericInst, + tyDistinct} + t.kind in baseKinds or (t.kind in parentKinds and isOrdinalType(t.sons[0])) proc enumHasHoles(t: PType): bool = var b = t diff --git a/lib/nimbase.h b/lib/nimbase.h index 3635ca006..37f8f5c3d 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -44,7 +44,7 @@ __clang__ #if defined(_MSC_VER) # pragma warning(disable: 4005 4100 4101 4189 4191 4200 4244 4293 4296 4309) # pragma warning(disable: 4310 4365 4456 4477 4514 4574 4611 4668 4702 4706) -# pragma warning(disable: 4710 4711 4774 4800 4820 4996) +# pragma warning(disable: 4710 4711 4774 4800 4820 4996 4090) #endif /* ------------------------------------------------------------------------- */ diff --git a/lib/pure/ioselects/ioselectors_kqueue.nim b/lib/pure/ioselects/ioselectors_kqueue.nim index 29a201863..3e86f19aa 100644 --- a/lib/pure/ioselects/ioselectors_kqueue.nim +++ b/lib/pure/ioselects/ioselectors_kqueue.nim @@ -16,6 +16,10 @@ const MAX_KQUEUE_CHANGE_EVENTS = 64 # Maximum number of events that can be returned. MAX_KQUEUE_RESULT_EVENTS = 64 + # SIG_IGN and SIG_DFL declared in posix.nim as variables, but we need them + # to be constants and GC-safe. + SIG_DFL = cast[proc(x: cint) {.noconv,gcsafe.}](0) + SIG_IGN = cast[proc(x: cint) {.noconv,gcsafe.}](1) when defined(macosx) or defined(freebsd): when defined(macosx): diff --git a/lib/pure/net.nim b/lib/pure/net.nim index 9501f6dc7..bd208761b 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -205,6 +205,10 @@ proc newSocket*(fd: SocketHandle, domain: Domain = AF_INET, if buffered: result.currPos = 0 + # Set SO_NOSIGPIPE on OS X. + when defined(macosx): + setSockOptInt(fd, SOL_SOCKET, SO_NOSIGPIPE, 1) + proc newSocket*(domain, sockType, protocol: cint, buffered = true): Socket = ## Creates a new socket. ## @@ -342,8 +346,6 @@ when defineSsl: result = SSLContext(context: newCTX, extraInternalIndex: 0, referencedData: initSet[int]()) result.extraInternalIndex = getExtraDataIndex(result) - # The PSK callback functions assume the internal index is 0. - assert result.extraInternalIndex == 0 let extraInternal = new(SslContextExtraInternal) result.setExtraData(result.extraInternalIndex, extraInternal) @@ -392,6 +394,8 @@ when defineSsl: ## ## Only used in PSK ciphersuites. ctx.getExtraInternal().clientGetPskFunc = fun + assert ctx.extraInternalIndex == 0, + "The pskClientCallback assumes the extraInternalIndex is 0" ctx.context.SSL_CTX_set_psk_client_callback( if fun == nil: nil else: pskClientCallback) diff --git a/tests/async/tioselectors.nim b/tests/async/tioselectors.nim index ed2fea84f..2237de01a 100644 --- a/tests/async/tioselectors.nim +++ b/tests/async/tioselectors.nim @@ -79,7 +79,7 @@ when not defined(windows): var rc2 = selector.select(100) assert(len(rc2) == 1) - var read_count = posix.recv(server2_socket, addr (buffer[0]), 128, 0) + var read_count = posix.recv(server2_socket, addr buffer[0], 128, 0) if read_count == -1: raiseOSError(osLastError()) @@ -233,7 +233,7 @@ when not defined(windows): proc mt_event_test(): bool = var - thr: array [0..7, Thread[SelectEvent]] + thr: array[0..7, Thread[SelectEvent]] var selector = newSelector[int]() var sock = newNativeSocket() var event = newSelectEvent() @@ -317,7 +317,7 @@ else: var rc2 = selector.select(100) assert(len(rc2) == 1) - var read_count = recv(server2_socket, addr (buffer[0]), 128, 0) + var read_count = recv(server2_socket, addr buffer[0], 128, 0) if read_count == -1: raiseOSError(osLastError()) @@ -391,7 +391,7 @@ else: assert(selector.isEmpty()) proc mt_event_test(): bool = - var thr: array [0..7, Thread[SelectEvent]] + var thr: array[0..7, Thread[SelectEvent]] var event = newSelectEvent() for i in 0..high(thr): createThread(thr[i], event_wait_thread, event) diff --git a/tests/generics/ttable_alias.nim b/tests/generics/ttable_alias.nim new file mode 100644 index 000000000..992ca85e0 --- /dev/null +++ b/tests/generics/ttable_alias.nim @@ -0,0 +1,7 @@ +# bug #4589 + +import tables +type SimpleTable*[TKey, TVal] = TableRef[TKey, TVal] +template newSimpleTable*(TKey, TVal: typedesc): SimpleTable[TKey, TVal] = newTable[TKey, TVal]() +var fontCache : SimpleTable[string, SimpleTable[int32, int]] +fontCache = newSimpleTable(string, SimpleTable[int32, int]) |