JuliaInterpreter.jl icon indicating copy to clipboard operation
JuliaInterpreter.jl copied to clipboard

Opaque Closures not supported.

Open oscardssmith opened this issue 2 years ago • 3 comments

The following code

isa_control_flow(::Type{T}, x) where {T} = isa(x, T) ? x : T(x)
@interpret Diffractor.PrimeDerivativeBack(x->sum(isa_control_flow(Matrix{Float64}, x)))(Float32[1 2;])

fails with

ERROR: BoundsError: attempt to access Core.Argument at index [2]
Stacktrace:
  [1] maybe_evaluate_builtin(frame::Frame, call_expr::Expr, expand::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/builtins.jl:177
  [2] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr; enter_generated::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:230
  [3] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:226
  [4] eval_rhs(recurse::Any, frame::Frame, node::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:399
  [5] step_expr!(recurse::Any, frame::Frame, node::Any, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:552
  [6] step_expr!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:602
  [7] finish!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/commands.jl:14
  [8] finish_and_return!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/commands.jl:30
  [9] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr; enter_generated::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:266
 [10] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:226
 [11] eval_rhs(recurse::Any, frame::Frame, node::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:399
 [12] step_expr!(recurse::Any, frame::Frame, node::Any, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:552
 [13] step_expr!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:602
 [14] finish!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/commands.jl:14
 [15] finish_and_return!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/commands.jl:30
 [16] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr; enter_generated::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:266
 [17] evaluate_call_recurse!(recurse::Any, frame::Frame, call_expr::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:226
 [18] eval_rhs(recurse::Any, frame::Frame, node::Expr)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:399
 [19] step_expr!(recurse::Any, frame::Frame, node::Any, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:473
 [20] step_expr!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/interpret.jl:602
 [21] finish!(recurse::Any, frame::Frame, istoplevel::Bool)
    @ JuliaInterpreter ~/.julia/dev/JuliaInterpreter/src/commands.jl:14
 [22] finish_and_return!
    @ ~/.julia/dev/JuliaInterpreter/src/commands.jl:30 [inlined]
 [23] finish_and_return! (repeats 2 times)
    @ ~/.julia/dev/JuliaInterpreter/src/commands.jl:34 [inlined]
 [24] macro expansion
    @ ~/.julia/dev/JuliaInterpreter/src/construct.jl:748 [inlined]
 [25] top-level scope
    @ REPL[23]:2

while without the @interpret it runs correctly.

(this behavior can be seen on both 1.7 and master versions of Julia).

oscardssmith avatar Jun 29 '22 13:06 oscardssmith

I'm not sure if it's the cause for this particular error, but note that there currently isn't any support for opaque closures in JuliaInterpreter. Would be good to add that eventually

simeonschaub avatar Jun 29 '22 13:06 simeonschaub

ah, that very well might be the problem.

oscardssmith avatar Jun 29 '22 13:06 oscardssmith

theoretically, you could just convert them into regular closures, right?

oscardssmith avatar Jun 29 '22 13:06 oscardssmith