From 4fc7f6914deb4a8a1f35a92e7041ca5d5ca91c12 Mon Sep 17 00:00:00 2001 From: tan Date: Sat, 8 Sep 2018 08:58:33 +0530 Subject: [PATCH] in Channel `put!`, convert value to Channel type `put!(ch::Channel{T}, v)` should convert `v` to type `T`. This can prevent errors like: ``` julia> c = Channel{Int}(0) Channel{Int64}(sz_max:0,sz_curr:0) julia> @async put!(c, :a) Task (runnable) @0x00007ff5b9d79270 julia> isready(c) && take!(c) ERROR: TypeError: in take_unbuffered, in typeassert, expected Int64, got Symbol Stacktrace: [1] take_unbuffered(::Channel{Int64}) at ./channels.jl:323 [2] take!(::Channel{Int64}) at ./channels.jl:306 [3] top-level scope at none:0 ``` --- base/channels.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/base/channels.jl b/base/channels.jl index 784a7d6de9781..4d1833d360fd2 100644 --- a/base/channels.jl +++ b/base/channels.jl @@ -246,9 +246,10 @@ Append an item `v` to the channel `c`. Blocks if the channel is full. For unbuffered channels, blocks until a [`take!`](@ref) is performed by a different task. """ -function put!(c::Channel, v) +function put!(c::Channel{T}, v) where T check_channel_state(c) - isbuffered(c) ? put_buffered(c,v) : put_unbuffered(c,v) + vT = convert(T, v) + isbuffered(c) ? put_buffered(c,vT) : put_unbuffered(c,vT) end function put_buffered(c::Channel, v)