Skip to content

Commit 2e155c9

Browse files
authored
Merge pull request #585 from JuliaParallel/jps/spawn-setindex
parser: Support setindex
2 parents 62f8307 + 3c57330 commit 2e155c9

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/thunk.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,12 @@ function _par(mod, ex::Expr; lazy=true, recur=true, opts=())
371371
body = nothing
372372
arg1 = nothing
373373
arg2 = nothing
374+
value = nothing
374375
if recur && @capture(ex, f_(allargs__)) ||
375376
@capture(ex, f_(allargs__) do cargs_ body_ end) ||
376377
@capture(ex, allargs__->body_) ||
377378
@capture(ex, arg1_[allargs__]) ||
379+
@capture(ex, arg1_[allargs__] = value_) ||
378380
@capture(ex, arg1_.arg2_) ||
379381
@capture(ex, (;allargs__)) ||
380382
@capture(ex, bf_.(allargs__))
@@ -387,8 +389,13 @@ function _par(mod, ex::Expr; lazy=true, recur=true, opts=())
387389
# Getproperty (A.B)
388390
f = Base.getproperty
389391
allargs = Any[arg1, QuoteNode(arg2)]
392+
elseif value !== nothing
393+
# setindex! (A[2,3] = 4)
394+
f = _setindex!_return_value
395+
pushfirst!(allargs, value)
396+
pushfirst!(allargs, arg1)
390397
else
391-
# Indexing (A[2,3])
398+
# getindex (A[2,3])
392399
f = Base.getindex
393400
pushfirst!(allargs, arg1)
394401
end
@@ -444,6 +451,11 @@ _par(mod, ex; kwargs...) = throw(ArgumentError("Invalid Dagger task expression:
444451
_par_inner(mod, ex; kwargs...) = ex
445452
_par_inner(mod, ex::Expr; kwargs...) = _par(mod, ex; kwargs...)
446453

454+
function _setindex!_return_value(A, value, idxs...)
455+
setindex!(A, value, idxs...)
456+
return value
457+
end
458+
447459
"""
448460
Dagger.spawn(f, args...; kwargs...) -> DTask
449461

test/thunk.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ end
139139
@test t isa Dagger.DTask
140140
@test fetch(t) == 42
141141
end
142+
@testset "setindex!" begin
143+
A = Dagger.@mutable rand(4, 4)
144+
145+
t = @spawn A[1, 2] = 3.0
146+
@test t isa Dagger.DTask
147+
@test fetch(t) == 3.0
148+
@test fetch(@spawn A[1, 2]) == 3.0
149+
150+
t = @spawn A[2] = 4.0
151+
@test t isa Dagger.DTask
152+
@test fetch(t) == 4.0
153+
@test fetch(@spawn A[2]) == 4.0
154+
155+
R = Dagger.@mutable Ref(42)
156+
t = @spawn R[] = 43
157+
@test t isa Dagger.DTask
158+
@test fetch(t) == 43
159+
@test fetch(@spawn R[]) == 43
160+
end
142161
@testset "NamedTuple" begin
143162
t = @spawn (;a=1, b=2)
144163
@test t isa Dagger.DTask

0 commit comments

Comments
 (0)